Как я могу добавить сгенерированную исходную папку в мой исходный путь в Gradle?

Я использую обработку аннотаций. Поэтому я использую подключаемый модуль apt. Он генерирует новые источники java в build/source/apt.

Вот мой 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 находит источники сгенерированных файлов, а сборка - нет.


person confile    schedule 05.02.2015    source источник
comment
Не забудьте принять здесь ответ, если он окажется полезным.   -  person Gray    schedule 08.06.2018


Ответы (7)


sourceSets.main.java.srcDirs = ['build/generated-sources/xjc','src/main/java'] работал у меня.

person Prabhath    schedule 12.12.2016
comment
Решение не масштабируется. Если у вас есть несколько исходных каталогов, их все нужно добавить сюда, в одну строку. Решение от milosmns устраняет этот недостаток. - person Leo Mekenkamp; 06.11.2019

То, что ответили другие, перезаписывает мои исходные каталоги, поэтому я нашел обходной путь - если вы не хотите перезаписывать исходный список каталогов, вы можете сделать это следующим образом:

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

Ключ в том, чтобы использовать здесь +=. По сути, это то же самое, что формулировать это так:

sourceSets {
  main {
    java.srcDirs += myDir
    kotlin.srcDirs += myDir
  }
}
person milosmns    schedule 11.03.2019

Для dagger 2 с плагином jar вы можете поставить

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

в build.gradle

person JuanMoreno    schedule 18.07.2017
comment
Решение не масштабируется. Если у вас есть несколько исходных каталогов, их все нужно добавить сюда, в одну строку. Решение от milosmns устраняет этот недостаток. - person Leo Mekenkamp; 06.11.2019

Попробуйте определить собственный исходный набор для выходных классов. Что-то типа:

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

должен приблизить вас. Дополнительные сведения см. В разделе наборов источников (23.7) документации плагина java gradle для более подробной информации.

person Jaimie Whiteside    schedule 05.02.2015
comment
Пожалуйста, посмотрите мою правку. Я попробовал вашу идею. Eclipse нашел источники, но gradle build приводит к указанной выше ошибке и не находит источник. - person confile; 05.02.2015
comment
Незнание вашего кода, является ли ошибка тем, что тесты не могут найти подходящий результат? Если это так, то вам, вероятно, нужно подключить это к вашему графу зависимостей. В разделе 23.7.3 опубликованных мною документов есть примеры, показывающие, как это сделать. Удачи. - person Jaimie Whiteside; 05.02.2015
comment
Никакими тестами не пользуюсь. подключаемому модулю GWT не удалось найти источники, созданные подключаемым модулем APT. Вы знаете, как сообщить плагину GWT, где находятся источники? - person confile; 05.02.2015
comment
Я не знаком с этим плагином. Подключается ли он непосредственно к плагину java? в таком случае вам может потребоваться явным образом указать и те, что находятся в настраиваемом исходном наборе. - person Jaimie Whiteside; 05.02.2015
comment
Ну, я не знаю, вот плагин: github.com/steffenschaefer/gwt-gradle-plugin. Если бы вы могли опубликовать то, что написали в своем последнем комментарии, я могу попробовать. - person confile; 05.02.2015
comment
Как я уже сказал, я не знаком с плагином gwt. Вы пробовали добавить вывод набора исходных кодов apt в качестве зависимости? - person Jaimie Whiteside; 05.02.2015
comment
Нет, я не сделал этого, как мне добавить вывод как зависимость? - person confile; 05.02.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person Jaimie Whiteside; 05.02.2015

На всякий случай кто-то ищет решение, используя скрипт kotlin (.kts):

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

Надеюсь, это поможет.

person Nolequen    schedule 03.02.2020
comment
Если вы уже находитесь в блоке val set by getting {}, вы можете просто сделать kotlin.srcDir("$buildDir/generated/source/path/to/my/dir") - person charlag; 06.08.2020

Рассмотрим структуру кода, подобную этой

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']
        }
    }
}

Вы можете указать сколько угодно источников. Надеюсь, это поможет и немного объяснит

person EagleEye1984    schedule 12.04.2020
comment
Я немного сошел с ума, пытаясь понять это, потому что в моем gradle.build уже был java {srcDirs = [src / main / java, src / main / generated]}, но intellij не распознал источники в src / main / сгенерировано. Однако, если я изменю его на «src / generated», как в вашем сообщении, он внезапно сработает. Каталог Java по-прежнему нуждается в основном в пути, или он не будет работать, хотя - person Wulf; 29.01.2021

При использовании kotlin gradle dsl:

sourceSets {
main {
    java {
        srcDir("$apiSpecOutputDir/src/main/java")
    }
}}
person xilef    schedule 08.05.2021