2016-05-29 3 views
6

Проект содержит обработчик аннотации, который генерирует Java-код во время компиляции. По умолчанию выходы gradle генерируют исходные файлы в каталог build/classes. Это вызывает некоторые проблемы с обнаружением недавно созданных исходных файлов IntelliJ.Изменить выходной каталог сгенерированного кода в графе

Есть ли простой способ настройки градиента для вывода исходных файлов в другой каталог? Например, $buildDir/gen/main/java или $buildDir/build/generated/main/java?

ответ

9

Существует опция для java-компилятора, которая позволяет настраивать выходной каталог для сгенерированных источников java (documentation).

-s реж

Укажите директорию, куда поместить сгенерированные исходные файлы. Каталог должен уже существовать; javac не создаст его. Если класс содержит часть пакета, компилятор помещает исходный файл в подкаталог , отражающий имя пакета, при необходимости создавая каталоги. Для примера , если вы укажете -s C: \ mysrc, а класс называется com.mypackage.MyClass, тогда исходный файл будет помещен в C: \ mysrc \ com \ mypackage \ MyClass.java.

Пример build.gradle

compileJava { 
    options.compilerArgs << "-s" 
    options.compilerArgs << "$projectDir/generated/java" 

    doFirst { 
     // make sure that directory exists 
     file(new File(projectDir, "/generated/java")).mkdirs() 
    } 
} 

clean.doLast { 
    // clean-up directory when necessary 
    file(new File(projectDir, "/generated")).deleteDir() 
} 

sourceSets { 
    generated { 
     java { 
      srcDir "$projectDir/generated/java" 
     } 
    } 
} 

Этот фрагмент кода делает следующий:

  • создает и определяет каталог в качестве вывода для генерируемого кода
  • удаляет сгенерированные источники, если чистая задача вызывается
  • добавляет новый источник

Update

Используйте Gradle apt plugin вместо этого.

+0

Спасибо за решение - он отлично работает для меня, с настройкой, в которой я предпочитаю помещать сгенерированные файлы в '$ project.buildDir/сгенерированные/java', так как это означает, что вам не нужно беспокоиться об изменении как работает чистая. Кроме того, нет необходимости фактически добавлять набор источников, который работает в любом случае. –

+0

Если какой-либо другой пользователь сталкивается с ошибкой компиляции java при последующих перекомпиляциях. Добавьте следующее в блок doFirst: 'GFileUtils.cleanDirectory (каталог); '.. в зависимости от вашей версии градиента вам может понадобиться использовать FileUtils.cleanDirectory' – Darwayne

+0

@ PetterMåhlén, почему конфигурация sourceSet необязательна? gradle нуждается в его создании jar, который включает сгенерированные классы. – Sunnyday

1

Просто укажите значение для project.buildDir свойства в файле build.gradle:

project.buildDir = '/gen/main/java' 

Это поместит все генерироваться создавать файлы в папку <project_root>/gen/main/java.

+0

Это не лучшее решение, так как не только сгенерированный, но и сборный выход компилятора будет помещен в этот каталог (файлы .class и другие материалы, которые вы не хотите использовать в своем исходном коде). –

Смежные вопросы