@xtccc
2016-06-13T16:12:14.000000Z
字数 2314
阅读 4507
Gradle
通过scala plugin,可以混合编译Java与Scala的代码。
scala plugin缺省地认为:
src/main/java 目录下都是 .java 文件src/main/scala 目录下可以是 .scala文件与.java文件的任意混合 假设我们的Gradle项目结构如下:
bogon:Basic tao$ tree.├── build.gradle├── gradle│ └── wrapper│ ├── gradle-wrapper.jar│ └── gradle-wrapper.properties├── gradlew├── gradlew.bat└── src└── main├── java│ └── cn│ └── gridx│ └── foo│ └── hi│ └── Hi.java└── scala└── cn└── gridx└── bar├── bye│ └── Bye.java└── hello└── Hello.scala
其中,build.gradle的内容如下:
apply plugin: 'scala'group = 'cn.gridx'archivesBaseName = 'example_gradle'version = 'SNAPSHOT_0.1'task wrapper(type : Wrapper) {gradleVersion = '2.10'}// 仓库repositories {// 使用maven central仓库mavenCentral()mavenLocal()}// 依赖dependencies {// `compile` phase 依赖的JAR包compile 'org.scala-lang:scala-library:2.10.4'}
调用./gradlew build命令进行构建,成功后,该项目的结构如下:
bogon:Basic tao$ tree.├── build│ ├── classes│ │ └── main│ │ └── cn│ │ └── gridx│ │ ├── bar│ │ │ ├── bye│ │ │ │ └── Bye.class│ │ │ └── hello│ │ │ ├── Hello$.class│ │ │ ├── Hello$delayedInit$body.class│ │ │ └── Hello.class│ │ └── foo│ │ └── hi│ │ └── Hi.class│ ├── dependency-cache│ ├── libs│ │ └── example_gradle-SNAPSHOT_0.1.jar│ └── tmp│ ├── compileJava│ │ └── emptySourcePathRef│ ├── compileScala│ │ └── emptySourcePathRef│ └── jar│ └── MANIFEST.MF├── build.gradle├── gradle│ └── wrapper│ ├── gradle-wrapper.jar│ └── gradle-wrapper.properties├── gradlew├── gradlew.bat└── src└── main├── java│ └── cn│ └── gridx│ └── foo│ └── hi│ └── Hi.java└── scala└── cn└── gridx└── bar├── bye│ └── Bye.java└── hello└── Hello.scala
上面的代码结构中,Scala与Java的代码没有相互引用,所以可以编译成功。那么,如果scala与java的代码存在相互引用的情况呢?请看下一段。
Java文件位于目录src/main/java中:
package cn.gridx.scala.lang.json.jsonbean;import cn.gridx.scala.lang.json.ScalaDT;public class JavaDT {public String home;public ScalaDT dt;public JavaDT(String home, ScalaDT dt) {this.home = home;this.dt = dt;}}
scala文件位于src/main/scala目录中:
package cn.gridx.scala.lang.jsonimport cn.gridx.scala.lang.json.jsonbean.JavaDTobject TestNestClass extends App {val javaDT = new JavaDT("i am java dt", ScalaDT("", 100))}// ScalaDT将被JavaDT引用case class ScalaDT(name: String, age: Int)
项目的结构如下:


可以看到,build失败了,因为在编译Java代码时,需要用到Scala中定义的class,但是此时Scala的class还没有被编译。
在build.gradle文件中加入以下的语句:
sourceSets {main {scala {srcDirs = ['src/main/scala', 'src/main/java']}java {srcDirs = []}}}
这样把Java的源代码目录也映射到Scala上,就可以同时编译Java与Scala的源代码。