【问题标题】:How can I add a generated Source Folder to my Source Path in Gradle?如何将生成的源文件夹添加到 Gradle 中的源路径?
【发布时间】:2015-04-05 09:51:43
【问题描述】:

我使用注释处理。因此我使用apt plugin。它在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 可以找到生成文件的来源,但 build 没有。

【问题讨论】:

  • 如果有帮助,记得在这里接受答案。

标签: java android eclipse gradle annotation-processing


【解决方案1】:

sourceSets.main.java.srcDirs = ['build/generated-sources/xjc','src/main/java'] 为我工作。

【讨论】:

  • 解决方案无法扩展。如果您有多个源目录,则都需要在这一行中添加它们。 milosmns 的解决方案解决了这个缺点。
【解决方案2】:

其他人回答的内容覆盖了我原来的目录,所以我找到了一个解决方法——如果你不想覆盖原来的目录列表,你可以这样做:

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

关键是在这里使用+=。基本上和这样表述是一样的:

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

【讨论】:

    【解决方案3】:

    以防万一有人使用 kotlin 脚本 (.kts) 搜索解决方案:

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

    希望,它会有所帮助。

    【讨论】:

    • 如果您已经在val set by getting {} 块中,那么您可以执行kotlin.srcDir("$buildDir/generated/source/path/to/my/dir")
    • 如果位置不对,可以下项目:project.extensions.findByType(AppExtension::class.java)!!.sourceSets["main"].java.srcDir(file("path/to/generated/source/directory")) :-)
    【解决方案4】:

    对于带有 jar 插件的匕首 2,你可以放

    sourceSets.main.java.srcDirs = ['build/generated/source/apt/main','src/main/java']
    

    在 build.gradle 中

    【讨论】:

    • 解决方案无法扩展。如果您有多个源目录,则都需要在这一行中添加它们。 milosmns 的解决方案解决了这个缺点。
    【解决方案5】:

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

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

    应该让你接近。有关更多详细信息,请查看java gradle plugin docs 的源集部分 (23.7)。

    【讨论】:

    • 请看我的编辑我试过你的想法。 Eclipse 找到了源但是gradle build导致上面的错误,没有找到源。
    • 不熟悉您的代码,错误是因为测试找不到 apt 输出吗?如果是这样,那么您可能需要将其挂钩到您的依赖关系图中。我发布的文档的第 23.7.3 节有示例显示如何做到这一点。祝你好运。
    • 我不使用任何测试。 GWT 插件无法找到 APT 插件生成的源。你知道告诉 GWT 插件源在哪里的方法吗?
    • 我不熟悉那个插件。它是否直接挂接到 java 插件中?如果是这样,您可能还需要在自定义源集中明确提供这些内容。
    • 好吧,我不知道这里是插件:github.com/steffenschaefer/gwt-gradle-plugin。如果你能把你在上一条评论中写的东西贴出来,那我可以试试。
    【解决方案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 代码),您必须将两者都指定为 java 编译的输入目录(在 build.gradle 文件中) - 我已将其添加到文件末尾:

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

    您可以指定任意数量的来源。 希望这会有所帮助并解释一下

    【讨论】:

    • 我想弄清楚这一点有点疯狂,因为我的 gradle.build 中已经有 java { srcDirs = ["src/main/java", "src/main/generated"]}但 intellij 无法识别 src/main/generated 中的来源。但是,如果我像在您的帖子中那样将其更改为“src/generated”,它会突然起作用。 Java 目录仍然需要路径中的主目录,否则它将无法工作
    【解决方案7】:

    使用 kotlin gradle dsl 时:

    sourceSets {
    main {
        java {
            srcDir("$apiSpecOutputDir/src/main/java")
        }
    }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-01
      • 2015-01-29
      • 2014-10-23
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      相关资源
      最近更新 更多