使用marven實現(xiàn)java和scala的互相調(diào)用

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>之間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盾戴,一起剝皮案震驚了整個濱河市寄锐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尖啡,老刑警劉巖橄仆,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衅斩,居然都是意外死亡盆顾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門畏梆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來您宪,“玉大人,你說我怎么就攤上這事奠涌∠芫蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵溜畅,是天一觀的道長捏卓。 經(jīng)常有香客問我,道長慈格,這世上最難降的妖魔是什么怠晴? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮峦椰,結(jié)果婚禮上龄寞,老公的妹妹穿的比我還像新娘。我一直安慰自己汤功,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布溜哮。 她就那樣靜靜地躺著滔金,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茂嗓。 梳的紋絲不亂的頭發(fā)上餐茵,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音述吸,去河邊找鬼忿族。 笑死锣笨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的道批。 我是一名探鬼主播错英,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隆豹!你這毒婦竟也來了椭岩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤璃赡,失蹤者是張志新(化名)和其女友劉穎判哥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碉考,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡塌计,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侯谁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌仅。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖良蒸,靈堂內(nèi)的尸體忽然破棺而出技扼,到底是詐尸還是另有隱情,我是刑警寧澤嫩痰,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布剿吻,位于F島的核電站,受9級特大地震影響串纺,放射性物質(zhì)發(fā)生泄漏丽旅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一纺棺、第九天 我趴在偏房一處隱蔽的房頂上張望榄笙。 院中可真熱鬧,春花似錦祷蝌、人聲如沸茅撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米丘。三九已至,卻和暖如春糊啡,著一層夾襖步出監(jiān)牢的瞬間拄查,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工棚蓄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堕扶,地道東北人碍脏。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像稍算,于是被迫代替她去往敵國和親典尾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容