如何在Gradle中将生成的源文件夹添加到源路径?

47

我使用注解处理。因此我使用了apt插件。它会在build/source/apt中生成新的Java源代码。

这是我的build.gradle文件:

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'apt'
apply plugin: 'war'
apply plugin: 'gwt'
apply plugin: 'jetty'

sourceCompatibility = 1.7
version = '1.0'

eclipse {
    classpath {
       downloadSources=true
       downloadJavadoc=true
    }
}

buildscript {
    repositories {
        mavenCentral()
        jcenter()
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }
    dependencies {
        classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'      
        classpath 'com.jimdo.gradle:gradle-apt-plugin:0.5-SNAPSHOT'
    }
}

repositories {
    mavenCentral()
    maven {
        name = "sonatype"
        url = "https://oss.sonatype.org/content/repositories/snapshots/"
    }
}

dependencies {
    apt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT:jar-with-dependencies'

    compile 'com.google.guava:guava:18.0'
    compile 'com.google.guava:guava-gwt:18.0'
    compile 'javax.inject:javax.inject:1'   
    compile 'com.google.dagger:dagger:2.0-SNAPSHOT'
}

gwt {
    gwtVersion='2.7.0'
    logLevel = 'INFO'
    minHeapSize = "512M";
    maxHeapSize = "1024M";


    compiler {
        strict = true;
    }
    modules 'test.GWTT'     
}

tasks.withType(de.richsource.gradle.plugins.gwt.AbstractGwtActionTask) {
    args '-XjsInteropMode', 'JS'
}
我需要让这些资源在我的项目中可用,这样Eclipse就可以找到它们,并且在编译项目时将它们包含进去。我该如何做?

编辑:使用

sourceSets {
    apt{
        java{
            srcDir 'build/source/apt'
        }
    }
}

运行gradle build时,会导致以下错误:

Compiling module test.GWTT
   Tracing compile failure path for type 'test.client.GWTT'
      [ERROR] Errors in 'file:/Users/mg/Documents/Grails/GGTS3.6.2/TestGradle2/src/main/java/test/client/GWTT.java'
         [ERROR] Line 17: No source code is available for type test.client.test2.Dagger_MyWidgetGinjector; did you forget to inherit a required module?
   Finding entry point classes
      Tracing compile failure path for type 'test.client.GWTT'
         [ERROR] Errors in 'file:/Users/mg/Documents/Grails/GGTS3.6.2/TestGradle2/src/main/java/test/client/GWTT.java'
            [ERROR] Line 17: No source code is available for type test.client.test2.Dagger_MyWidgetGinjector; did you forget to inherit a required module?
      [ERROR] Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly
:compileGwt FAILED

使用先前的Eclipse可以找到生成文件的源代码,但无法进行构建。


4
请记得在这里接受任何有帮助的答案。 - Gray
7个回答

39

别人的答案会覆盖我的原始目录,所以我找到了一个解决方法 - 如果您不想覆盖原始目录列表,可以这样做:

sourceSets.main.java.srcDirs += myDir
sourceSets.main.kotlin.srcDirs += myDir
关键是要在这里使用+=。本质上,它与以下语句相同:


sourceSets {
  main {
    java.srcDirs += myDir
    kotlin.srcDirs += myDir
  }
}

29

sourceSets.main.java.srcDirs = ['build/generated-sources/xjc','src/main/java'] 对我来说有效。


6
这个解决方案无法扩展。如果你有多个源目录,它们都需要在这一行中添加。milosmns的解决方案解决了这个缺陷。 - Leo Mekenkamp

15

如果有人正在寻找使用 Kotlin 脚本(.kts)解决方案,请参考以下内容:

sourceSets["main"].java.srcDir(file("path/to/generated/source/directory"))

希望这能有所帮助。


1
如果您已经在“通过获取{}设置的val集合”块中,则可以直接执行kotlin.srcDir("$buildDir/generated/source/path/to/my/dir") - charlag
如果你不在正确的位置,可以通过以下代码获取项目路径:project.extensions.findByType(AppExtension::class.java)!!.sourceSets["main"].java.srcDir(file("path/to/generated/source/directory")) :-) - Blundell

8
如果要使用 jar 插件来搭配 Dagger 2,可以放置以下内容:
sourceSets.main.java.srcDirs = ['build/generated/source/apt/main','src/main/java']

在 build.gradle 文件中。

3
解决方案不具备可扩展性。如果您有多个源目录,则所有这些目录都需要在此一行中添加。来自milosmns的解决方案解决了这个缺点。 - Leo Mekenkamp

6
尝试为输出类定义自定义源集,例如: 类似于:

尝试为输出类定义自定义源集。

sourceSets {
    apt{
        java{
            srcDir 'build/source/apt'
        }
    }
}

这应该能让你接近目标。要了解更多细节,请查看java gradle插件文档中的源设置部分(23.7)。


请看一下我修改的部分,我尝试了你的想法。Eclipse找到了源代码,但执行“gradle build”时出现了上述错误,并且无法找到源代码。 - Michael
不熟悉你的代码,错误是因为测试找不到适当的输出吗?如果是这样,那么你可能需要将其连接到依赖图中。我发布的文档的23.7.3节有示例展示如何做到这一点。祝你好运。 - Jaimie Whiteside
我不使用任何测试。GWT插件无法找到APT插件生成的源代码。你知道怎么告诉GWT插件源代码在哪里吗? - Michael
我不熟悉那个插件。它是否直接钩入Java插件?如果是的话,您可能还需要在自定义源集中明确提供它们。 - Jaimie Whiteside
不,我没有。我该如何将输出添加为依赖项? - Michael
显示剩余3条评论

6

考虑这样的代码结构

src
├───main
│   ├───gen
│   │   └───com
│   │       └───java
│   │           └───generated
│   │               └───code
│   ├───java
│   │   └───com
│   │       └───java
│   │           └───test
│   └───resources
│       ├───icons
│       └───META-INF
└───test
    ├───java
    └───resources

src/main/gen - 是生成代码的文件夹

src/main/java - 是手写代码的文件夹

要同时包含两者(生成的和手写的Java代码),您需要在build.gradle文件中将它们都指定为Java编译的输入目录-我已将其添加到文件末尾:

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', 'src/main/gen']
        }
    }
}

您可以指定尽可能多的来源。希望这有所帮助并能解释清楚。

2
我曾经为此疯狂地尝试解决问题,因为我在gradle.build中已经有了以下代码: java { srcDirs = ["src/main/java", "src/main/generated"]}但是Intellij无法识别src/main/generated中的源代码。然而,如果我像你的帖子中一样将其更改为'src/generated',它突然就可以工作了。不过,Java目录仍然需要路径中的main,否则它将无法工作。 - Wulf

1
使用 Kotlin Gradle DSL 时:
sourceSets {
main {
    java {
        srcDir("$apiSpecOutputDir/src/main/java")
    }
}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接