首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在分级构建中处理Scala、Antlr和Java

在分级构建中处理Scala、Antlr和Java
EN

Stack Overflow用户
提问于 2013-12-10 21:00:00
回答 1查看 662关注 0票数 2

我有一个设置如下的项目: 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构建脚本。

代码语言:javascript
复制
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

有人能指点我解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2013-12-10 21:28:06

构建脚本有几种气味:

  1. 还不清楚为什么添加files("${buildDir}/jars")来测试运行时类路径。
  2. 我是sourceSets.test.runtimeClasspath,不是sourceSets.test.java.runtimeClasspath
  3. 任务generateGrammarSource应该具有JavaExec类型,而不是调用ant.java的任务操作。
  4. Scala源dir需要在配置阶段而不是执行阶段进行配置。
  5. 目前还不清楚为什么compileScala->compileJava依赖会倒置。在当前的构建中,这绝对没有必要,因为在compileJava的源dirs被“删除”后,它就没有什么可做的了,而支持联合编译。

尽管如此,如果没有一个可重复的例子,很难确切地说是什么导致了眼前的问题。我要做的第一个改进是在任务操作之外的顶层声明Scala源dirs。这解决了上面的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20505086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档