【问题标题】:Gradle scala class already defined with combined Java compilationGradle scala 类已经使用组合 Java 编译定义
【发布时间】:2012-10-25 23:55:04
【问题描述】:

我有以下 scala 编译问题

  • scala -> 依赖于 java 源代码
  • java 源 -> 依赖于 scala 源

  • 我的 scala 代码在 src/main/scala

  • 我的 java 代码在 src/main/java 中

我无法更改此代码,因此我需要使用 gradle 编译它,它目前可以使用 JRuby 编译。

我已阅读以下有关如何解决此问题的帖子:

http://forums.gradle.org/gradle/topics/how_to_compile_a_java_class_that_depends_on_a_scala_class_in_gradle

http://forums.gradle.org/gradle/topics/how_to_compile_a_java_class_that_depends_on_a_scala_class_in_gradle

我将此添加到我的构建中:

ext {
    baseName = 'd2'
    description = 'Divisional IVR.'
    combinedSources = "$buildDir/combined-sources"
}

apply plugin: 'scala'

compileScala.taskDependencies.values = compileScala.taskDependencies.values - 'compileJava'
compileJava.dependsOn compileScala

sourceSets.main.scala.srcDir "$combinedSources"
sourceSets.main.java.srcDirs = []

我尝试将所有 scala 和 java 文件复制到一个位置:

compileScala.dependsOn{
    copyAllSourceFiles
}

task copyAllSourceFiles(type:Copy) {
    description = 'Copy All Source Files.'
    from('src/main/java') {}
    from('/src/main/scala') {}
    into combinedSources

    includeEmptyDirs = false
}

但现在我得到一个错误:

[ant:scalac] Compiling 18 source files to C:\usr\git_workspaces\xivr\d2\target\classes\main
[ant:scalac] Compiling 18 scala and 196 java source files to C:\usr\git_workspaces\xivr\d2\target\classes\main
[ant:scalac] C:\usr\git_workspaces\xivr\d2\target\combined-sources\com\comcast\ivr\d2\actors\AlternateAniWithAccountActor.scala:9: error: AlternateAniWithAccountActor is already defined as class AlternateAniWithAccountActor

似乎 scalaCompile 看到了 $combinedSources 和 'src/main/scala'

【问题讨论】:

    标签: java scala gradle


    【解决方案1】:

    似乎 scalaCompile 看到了 $combinedSources 和 'src/main/scala'

    这就是您的配置方式:src/main/scala 是默认设置,而您添加了"$combinedSources"。要覆盖默认值,请使用sourceSets.main.scala.srcDirs = [combinedSources]

    在任何情况下,您都不必(也不应该)复制源代码。这是一种既不需要复制也不需要重新配置任务依赖项的解决方案:

    sourceSets.main.scala.srcDir "src/main/java"
    sourceSets.main.java.srcDirs = []
    

    现在,您的 Java 和 Scala 代码将联合编译,并且可以任意相互依赖。

    PS:不要使用"$combinedSources",而是使用combinedSources

    【讨论】:

      【解决方案2】:

      gradle.properties

      theVersion=2.1
      theSourceCompatibility=1.7
      theScalaVersion=2.10.3
      

      build.gradle

      apply {
          plugin 'scala'
          plugin 'java'
          plugin 'idea'
      }
      
      ext {
          scalaVersion = theScalaVersion
      }
      
      sourceCompatibility = theSourceCompatibility
      
      tasks.withType(ScalaCompile) {
          scalaCompileOptions.useAnt = false
      }
      
      dependencies {
          compile "org.scala-lang:scala-library:$theScalaVersion"
          compile "org.scala-lang:scala-compiler:$theScalaVersion"
      }
      
      sourceSets {
          main.scala.srcDirs = ["src/main/scala", "src/main/java"]
          main.java.srcDirs = []
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-09
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2016-03-20
        • 1970-01-01
        相关资源
        最近更新 更多