1. Java調(diào)用Scala類
整個工程的目錄結(jié)構(gòu)如下:
java-call-scala/
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── hank
│ └── java
│ └── main
│ └── App.java
└── scala
└── com
└── hank
└── scala
└── main
└── MyScala.scala
App.java為主程序,由Java語言實現(xiàn),MyScala.scala為被調(diào)用的類,由Scala語言實現(xiàn)。
App.java的代碼如下:
package com.hank.java.main;
import com.hank.scala.main.MyScala;
public class App {
public static void main(String[] args) {
System.out.println("Hello, I am JAVA, I will call Scala");
MyScala.print();
}
}
MyScala.scala的代碼如下:
package com.hank.scala.main
object MyScala {
def print() : Unit = {
println("Hello, I am SCALA")
}
}
程序的內(nèi)容很簡單觉既,要在marven中實現(xiàn)Java調(diào)用Scala最關(guān)鍵的是編寫pom文件,它的內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hank.mvn</groupId>
<artifactId>java-call-scala</artifactId>
<version>1.0-SNAPSHOT</version>
<name>java-call-scala</name>
<url>http://maven.apache.org</url>
<!-- 運行scala庫時要依賴的庫文件 -->
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 該插件用于在marven中編譯scala程序 -->
<plugin>
<!-- see http://davidb.github.com/scala-maven-plugin -->
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 該插件用于打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.hank.java.main.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
編譯運行:
# mvn clean scala:compile compile package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building java-call-scala 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ java-call-scala ---
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default-cli) @ java-call-scala ---
[INFO] /home/hank/Study/Java/java-call-scala/src/main/java:-1: info: compiling
[INFO] /home/hank/Study/Java/java-call-scala/src/main/scala:-1: info: compiling
[INFO] Compiling 2 source files to /home/hank/Study/Java/java-call-scala/target/classes at 1507437522083
[INFO] prepare-compile in 0 s
[INFO] compile in 2 s
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ java-call-scala ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/hank/Study/Java/java-call-scala/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ java-call-scala ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /home/hank/Study/Java/java-call-scala/target/classes
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default) @ java-call-scala ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ java-call-scala ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/hank/Study/Java/java-call-scala/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ java-call-scala ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default) @ java-call-scala ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ java-call-scala ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/hank/Study/Java/java-call-scala/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ java-call-scala ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ java-call-scala ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-call-scala ---
[INFO] Building jar: /home/hank/Study/Java/java-call-scala/target/java-call-scala-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:2.4.1:shade (default) @ java-call-scala ---
[INFO] Including org.scala-lang:scala-library:jar:2.12.1 in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /home/hank/Study/Java/java-call-scala/target/java-call-scala-1.0-SNAPSHOT.jar with /home/hank/Study/Java/java-call-scala/target/java-call-scala-1.0-SNAPSHOT-shaded.jar
[INFO] Dependency-reduced POM written at: /home/hank/Study/Java/java-call-scala/dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.016 s
[INFO] Finished at: 2017-10-08T12:38:47+08:00
[INFO] Final Memory: 18M/189M
[INFO] ------------------------------------------------------------------------
root@hank-Vostro-270s:/home/hank/Study/Java/java-call-scala# cd target/
root@hank-Vostro-270s:/home/hank/Study/Java/java-call-scala/target# java -jar java-call-scala-1.0-SNAPSHOT.jar
Hello, I am JAVA, I will call Scala
Hello, I am SCALA
這里要注意的是先編譯Scala的類乳幸,然后再編譯Java的類瞪讼,最后在target目錄下生成了jar文件,可以直接運行粹断。
2. Scala調(diào)用Java類
整個工程的結(jié)構(gòu)如下:
scala-call-java/
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── hank
│ └── java
│ └── main
│ └── MyJava.java
└── scala
└── com
└── hank
└── scala
└── main
└── App.scala
App.scala的代碼如下:
package com.hank.scala.main
import com.hank.java.main.MyJava
object App {
def main(args: Array[String]) : Unit = {
println("Hello, I am Scala, I will call Java")
val myObj = new MyJava()
myObj.print()
}
}
MyJava.java的代碼如下:
package com.hank.java.main;
public class MyJava {
public void print() {
System.out.println("Hello, I am Java");
}
}
pom.xml的文件內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hank.mvn</groupId>
<artifactId>java-call-scala</artifactId>
<version>1.0-SNAPSHOT</version>
<name>java-call-scala</name>
<url>http://maven.apache.org</url>
<!-- 運行scala庫時要依賴的庫文件 -->
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 該插件用于在marven中編譯scala程序 -->
<plugin>
<!-- see http://davidb.github.com/scala-maven-plugin -->
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 該插件用于打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.hank.scala.main.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
編譯并運行:
# mvn clean compile scala:compile package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building java-call-scala 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ java-call-scala ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ java-call-scala ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/hank/Study/Java/scala-call-java/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ java-call-scala ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /home/hank/Study/Java/scala-call-java/target/classes
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default) @ java-call-scala ---
[INFO] /home/hank/Study/Java/scala-call-java/src/main/java:-1: info: compiling
[INFO] /home/hank/Study/Java/scala-call-java/src/main/scala:-1: info: compiling
[INFO] Compiling 2 source files to /home/hank/Study/Java/scala-call-java/target/classes at 1507438404427
[INFO] prepare-compile in 0 s
[INFO] compile in 2 s
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default-cli) @ java-call-scala ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ java-call-scala ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/hank/Study/Java/scala-call-java/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ java-call-scala ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default) @ java-call-scala ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ java-call-scala ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/hank/Study/Java/scala-call-java/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ java-call-scala ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ java-call-scala ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-call-scala ---
[INFO] Building jar: /home/hank/Study/Java/scala-call-java/target/java-call-scala-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:2.4.1:shade (default) @ java-call-scala ---
[INFO] Including org.scala-lang:scala-library:jar:2.12.1 in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /home/hank/Study/Java/scala-call-java/target/java-call-scala-1.0-SNAPSHOT.jar with /home/hank/Study/Java/scala-call-java/target/java-call-scala-1.0-SNAPSHOT-shaded.jar
[INFO] Dependency-reduced POM written at: /home/hank/Study/Java/scala-call-java/dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.788 s
[INFO] Finished at: 2017-10-08T12:53:28+08:00
[INFO] Final Memory: 18M/169M
[INFO] ------------------------------------------------------------------------
root@hank-Vostro-270s:/home/hank/Study/Java/scala-call-java# ls
dependency-reduced-pom.xml pom.xml src target
root@hank-Vostro-270s:/home/hank/Study/Java/scala-call-java# cd target/
root@hank-Vostro-270s:/home/hank/Study/Java/scala-call-java/target# java -jar ./java-call-scala-1.0-SNAPSHOT.jar
Hello, I am Scala, I will call Java
Hello, I am Java
這里在編譯的時候要先編譯Scala的類符欠。
3. Marven的源
默認的Marven源在國外,下載插件的時候會非常慢姿染,找了一個國內(nèi)的鏡像背亥,速度非趁爰剩快。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
將上面的內(nèi)容加入到marven的配置文件中狡汉,我的機器上對應(yīng)的文件是/opt/apache-maven-3.5.0/conf/settings.xml娄徊,注意要放在<mirrors></mirrors>之間。