@xtccc
2016-06-14T00:12:14.000000Z
字数 2314
阅读 4161
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.json
import cn.gridx.scala.lang.json.jsonbean.JavaDT
object 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的源代码。