Дублируемый сгенерированный вывод класса gradle (сборка / ...) по сравнению с выходом intellij (out / ...) - PullRequest
4 голосов
/ 25 апреля 2019

Я использую intellij (2019.1.1) для проекта Java Gradle (5.4.1) и использую lombok (1.18.6) для автогенерации кода.Intellij помещает сгенерированные источники в out/production/classes/generated/..., а Gradle - в build/generated/sources/...

Это нормально, и мне нравится, что Intellij хранит свои собственные артефакты сборки отдельно от Gradles, однако Intellij, похоже, просматривает оба каталога, когдазапущенные проекты, и он жалуется на дубликаты сгенерированных классов.Как лучше всего использовать intellij с Gradle и автоматически сгенерированными источниками?Вы:

  1. говорите intellij выводить в тот же каталог, что и gradle (это может привести к странному поведению, если процесс за пределами intellij обновляет файл в build /)
  2. сказать intellijвыполнить все задачи с помощью gradle (я слышал, что это медленнее, чем make intellij)
  3. говорит intellij просто игнорировать каталог 'build' (как вы вообще это делаете? и почему intellij даже небезразлично 'build /'когда он знает, что выводит в' out / ')

UPDATE : чтобы прояснить ситуацию, проблема не в сгенерированном коде lombok, а в hibernate-jpamodelgen.Проблема остается той же (дублирующиеся сгенерированные источники), но я хочу уточнить, что это источники, сгенерированные jpamodelgen, а не lombok.

UPDATE 2 : я попробовал следующую конфигурацию впопытка сообщить intellij, где находятся сгенерированные источники, а также сообщить intellij игнорировать каталог сборки.К сожалению, это не сработало (по-прежнему получаю дублирующую ошибку класса в сгенерированных исходных файлах).

    apply plugin: 'idea'
    idea {
        module {
            sourceDirs += file('out/production/classes/generated')
            generatedSourceDirs += file('out/production/classes/generated')
            excludeDirs += file('build')
        }
    }

UPDATE 3 : Попробовал совет от M.Riccuiti и удалил build /, out/, .idea /, .gradle / и повторно импортировал проект gradle, но intellij все еще видит сгенерированные источники в каталоге build /.

generated sources root

annotation processor settings

gradle settings

gradle runner settings

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Решение, которое я предложил в предыдущем комментарии, работало нормально в IDEA 2018.3.x, но после обновления до IDEA 2019.1 я снова получил это исключение дублирующегося класса ...

Ниже приведено рабочее решение, позволяющее работать с Gradle 5.x (протестировано с 5.4) и IDEA 2019.1, для реализации вашего решения № 3, которое, я считаю, является наилучшим вариантом (не смешивайте выходные каталоги, созданные с помощью gradle и idea, и не делегируйте действие IDEA делать Gradle)

Ключевым моментом является использование свойства excludeDirs из расширения idea.module, чтобы IDEA игнорировала сгенерированные источники, управляемые Gradle в build/generated/sources/...

ext {
    // path to Gradle generated main sources directory
    gradleGeneratedMainSourcesDir = "$buildDir/generated/sources/annotationProcessor/java/main/"
    // path to Gradle generated test sources directory
    gradleGeneratedTestSourcesDir = "$buildDir/generated/sources/annotationProcessor/java/test/"
    // path to IDEA generated sources directory
    ideaGeneratedSourcesDir = "$projectDir/out/production/classes/generated"        
}

idea {
    module {
        // exclude main & test sources generated by Gradle from project source directories
        excludeDirs += file(gradleGeneratedMainSourcesDir)
        excludeDirs += file(gradleGeneratedTestSourcesDir)

        // include generated sources directory managed by IDEA
        sourceDirs += file(ideaGeneratedSourcesDir)
        generatedSourceDirs += file(ideaGeneratedSourcesDir)
    }
}

Смотрите полный пример проекта на основе этой конфигурации здесь: https://github.com/mricciuti/sample-springboot-gradle-idea

0 голосов
/ 03 мая 2019

Вот подход, который наконец-то сработал для меня. Хитрость заключается в том, чтобы заметить, что когда gradle генерирует классы, он помещает их в:

build\generated\sources\annotationProcessor\java\main\com...

но для intellij каталог производственных источников установлен на "сгенерированный", в этом случае источники переходят по адресу:

build\generated\sources\annotationProcessor\java\main\generated\com...

если вы сначала скомпилируете с помощью gradle, а затем воспользуетесь идеей, вы получите оба из них, что вызывает проблему!

Чтобы решить эту проблему, замените «Генерируемый» и «Сгенерированный_тест» в конфигурации процессоров аннотаций intellij «Каталог производственных источников» и «Каталог источников тестов» просто на «/», что заставляет и gradle, и intellij генерировать источники в ЖЕ каталог, перезаписывая друг друга по мере необходимости. Также убедитесь, что для параметра «Хранить сгенерированные источники относительно» задано значение «Корень содержимого модуля», и REBUILD для удаления любых других источников.

...