我有一个设置如下的项目: 1. src/main/antlr 2下的Antlr文件;src/main/scala下的Scala文件;src/main/java下的Java文件
Java代码依赖于Scala生成的类,而Scala类又依赖于Antlr生成的源代码。
此布局将复制用于测试。除了正在尝试的调整(如链接文件中所示的那样)外,我没有定义其他的sourceSets。
我们使用Antlr 3,所以不能使用Gradle附带的插件。不过,我们确实使用Scala插件。根据许多建议,我扭转了Scala与Java编译之间的依赖关系,并修改了Scala srcDirs,使其包含$buildDir/generated/src,在此条件下,Antlr任务转储它的输出,并转储Java源,从而使scalac联合编译。
我现在面临的问题是,即使在构建目录下看到生成的类,“test”任务也看不到任何生成的文件。奇怪的是,测试编译成功了,但是scala/Antlr类似乎不在类路径上。
这是我的gradle构建脚本。
sourceCompatibility = '1.6'
apply plugin: 'java'
apply plugin: 'scala'
configurations {
antlr3
scalaBuild
}
sourceSets {
test {
java{
runtimeClasspath = sourceSets.test.runtimeClasspath + files("${buildDir}/jars")
}
}
}
def antlrSource = "src/main/antlr"
def antlrOutput = "$buildDir/generated/src"
dependencies {
antlr3 (
[group: 'org.antlr', name: 'antlr', version: '3.3']
)
compile (
[group: 'org.scala-lang', name: 'scala-library', version: '2.9.2'],
[group: 'com.googlecode.kiama', name: 'kiama_2.9.2', version: '1.2.0'],
[group: 'net.sf.jgrapht', name: 'jgrapht', version: '0.8.3'],
[group: 'org.antlr', name: 'antlr-runtime', version: '3.3'],
[group: 'org.antlr', name: 'stringtemplate', version: '3.2.1'],
[group: 'com.beust', name: 'jcommander', version: '1.7']
)
testCompile (
[group: 'org.scalatest', name: 'scalatest_2.9.2', version: '1.8'],
[group: 'org.antlr', name: 'gunit', version: '3.3']
)
}
test.doFirst {
configurations.testRuntime.each{ println it }
}
task generateGrammarSource {
description = "Generates Java sources from Antlr3 grammars."
inputs.dir file(antlrSource)
outputs.dir file(antlrOutput)
} << {
mkdir(antlrOutput)
sourceSets.main.scala.srcDirs = sourceSets.main.scala.srcDirs + ["src/main/java", antlrOutput]
sourceSets.main.java.srcDirs = []
def grammars = fileTree(antlrSource).include("**/*.g")
ant.java(classname: 'org.antlr.Tool', fork: true, classpath: "${configurations.antlr3.asPath}") {
arg(line: "-o ${antlrOutput}")
arg(line: grammars.files.join(" "))
}
}
task extraJar(type: Jar, dependsOn: compileScala) {
archiveName = "duplicate-classes.jar"
destinationDir = file("${buildDir}/jars")
from "${buildDir}/classes"
}
artifacts {
scalaBuild extraJar
}
compileScala.taskDependencies.values = compileScala.taskDependencies.values - 'compileJava'
compileJava.dependsOn(compileScala)
compileScala.dependsOn generateGrammarSource有人能指点我解决这个问题吗?
发布于 2013-12-10 21:28:06
构建脚本有几种气味:
files("${buildDir}/jars")来测试运行时类路径。sourceSets.test.runtimeClasspath,不是sourceSets.test.java.runtimeClasspath。generateGrammarSource应该具有JavaExec类型,而不是调用ant.java的任务操作。compileScala->compileJava依赖会倒置。在当前的构建中,这绝对没有必要,因为在compileJava的源dirs被“删除”后,它就没有什么可做的了,而支持联合编译。尽管如此,如果没有一个可重复的例子,很难确切地说是什么导致了眼前的问题。我要做的第一个改进是在任务操作之外的顶层声明Scala源dirs。这解决了上面的问题。
https://stackoverflow.com/questions/20505086
复制相似问题