[关闭]
@xtccc 2016-06-14T00:12:14.000000Z 字数 2314 阅读 4161

混合编译Java/Scala代码

给我写信
GitHub

此处输入图片的描述


Gradle




1. scala plugin


通过scala plugin,可以混合编译Java与Scala的代码。

scala plugin缺省地认为:




2. 混合编译Scala/Java代码


假设我们的Gradle项目结构如下:

  1. bogon:Basic tao$ tree
  2. .
  3. ├── build.gradle
  4. ├── gradle
  5.    └── wrapper
  6.    ├── gradle-wrapper.jar
  7.    └── gradle-wrapper.properties
  8. ├── gradlew
  9. ├── gradlew.bat
  10. └── src
  11. └── main
  12. ├── java
  13.    └── cn
  14.    └── gridx
  15.    └── foo
  16.    └── hi
  17.    └── Hi.java
  18. └── scala
  19. └── cn
  20. └── gridx
  21. └── bar
  22. ├── bye
  23.    └── Bye.java
  24. └── hello
  25. └── Hello.scala



其中,build.gradle的内容如下:

  1. apply plugin: 'scala'
  2. group = 'cn.gridx'
  3. archivesBaseName = 'example_gradle'
  4. version = 'SNAPSHOT_0.1'
  5. task wrapper(type : Wrapper) {
  6. gradleVersion = '2.10'
  7. }
  8. // 仓库
  9. repositories {
  10. // 使用maven central仓库
  11. mavenCentral()
  12. mavenLocal()
  13. }
  14. // 依赖
  15. dependencies {
  16. // `compile` phase 依赖的JAR包
  17. compile 'org.scala-lang:scala-library:2.10.4'
  18. }



调用./gradlew build命令进行构建,成功后,该项目的结构如下:

  1. bogon:Basic tao$ tree
  2. .
  3. ├── build
  4.    ├── classes
  5.       └── main
  6.       └── cn
  7.       └── gridx
  8.       ├── bar
  9.          ├── bye
  10.             └── Bye.class
  11.          └── hello
  12.          ├── Hello$.class
  13.          ├── Hello$delayedInit$body.class
  14.          └── Hello.class
  15.       └── foo
  16.       └── hi
  17.       └── Hi.class
  18.    ├── dependency-cache
  19.    ├── libs
  20.       └── example_gradle-SNAPSHOT_0.1.jar
  21.    └── tmp
  22.    ├── compileJava
  23.       └── emptySourcePathRef
  24.    ├── compileScala
  25.       └── emptySourcePathRef
  26.    └── jar
  27.    └── MANIFEST.MF
  28. ├── build.gradle
  29. ├── gradle
  30.    └── wrapper
  31.    ├── gradle-wrapper.jar
  32.    └── gradle-wrapper.properties
  33. ├── gradlew
  34. ├── gradlew.bat
  35. └── src
  36. └── main
  37. ├── java
  38.    └── cn
  39.    └── gridx
  40.    └── foo
  41.    └── hi
  42.    └── Hi.java
  43. └── scala
  44. └── cn
  45. └── gridx
  46. └── bar
  47. ├── bye
  48.    └── Bye.java
  49. └── hello
  50. └── Hello.scala


上面的代码结构中,Scala与Java的代码没有相互引用,所以可以编译成功。那么,如果scala与java的代码存在相互引用的情况呢?请看下一段。




3. Scala/Java代码交叉引用


3.1 Java代码引用Scala代码

Java文件位于目录src/main/java中:

  1. package cn.gridx.scala.lang.json.jsonbean;
  2. import cn.gridx.scala.lang.json.ScalaDT;
  3. public class JavaDT {
  4. public String home;
  5. public ScalaDT dt;
  6. public JavaDT(String home, ScalaDT dt) {
  7. this.home = home;
  8. this.dt = dt;
  9. }
  10. }



scala文件位于src/main/scala目录中:

  1. package cn.gridx.scala.lang.json
  2. import cn.gridx.scala.lang.json.jsonbean.JavaDT
  3. object TestNestClass extends App {
  4. val javaDT = new JavaDT("i am java dt", ScalaDT("", 100))
  5. }
  6. // ScalaDT将被JavaDT引用
  7. case class ScalaDT(name: String, age: Int)



项目的结构如下:
image_1al4vkfgg10tf1tc4b06mcj099.png-82.8kB


3.2 构建结果

image_1al4vsansfg17fo1ts5ao9dvnm.png-120.3kB

可以看到,build失败了,因为在编译Java代码时,需要用到Scala中定义的class,但是此时Scala的class还没有被编译。


3.3 解决方法

build.gradle文件中加入以下的语句:

  1. sourceSets {
  2. main {
  3. scala {
  4. srcDirs = ['src/main/scala', 'src/main/java']
  5. }
  6. java {
  7. srcDirs = []
  8. }
  9. }
  10. }

这样把Java的源代码目录也映射到Scala上,就可以同时编译Java与Scala的源代码。


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注