2016-12-19 11 views
3

Я использую пользовательский обработчик аннотации и имею новую проблему. Я использую Gradle (3.1.1), и когда я добавляю путь к файлу, который будет сгенерирован моим процессором, в sourceSet я получаю странные проблемы.endPosTable уже установлен при добавлении sourceSet

Я выполняю команду gradle clean build, а затем gradle build, после чего сборка будет уничтожена. Стоп-кадр, который я получаю, довольно распространен для моего удивления.

An exception has occurred in the compiler (1.8.0_91). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you. 
java.lang.IllegalStateException: endPosTable already set 
    at com.sun.tools.javac.util.DiagnosticSource.setEndPosTable(DiagnosticSource.java:136) 
    at com.sun.tools.javac.util.Log.setEndPosTable(Log.java:350) 
    at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:667) 
    at com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:950) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.<init>(JavacProcessingEnvironment.java:892) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.next(JavacProcessingEnvironment.java:921) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1187) 
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170) 
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856) 
    at com.sun.tools.javac.main.Main.compile(Main.java:523) 
    at com.sun.tools.javac.main.Main.compile(Main.java:381) 
    at com.sun.tools.javac.main.Main.compile(Main.java:370) 
    at com.sun.tools.javac.main.Main.compile(Main.java:361) 
    at com.sun.tools.javac.Main.compile(Main.java:56) 
    at com.sun.tools.javac.Main.main(Main.java:42) 

Если я всегда чист перед сборкой у меня нет проблемы, также представляют собой сборки всегда преуспевающие, когда я не добавить sourceSet. Я даже попытался удалить файл прямо перед созданием нового сгенерированного файла в моем обработчике аннотаций, но это тоже не помогло.

При исследовании я также нашел интересную ссылку: JDK Bug report

Но думать о том, что я либо должен всегда чистых первом или оставить его из моей sourceSet не очень хорошо. Поскольку Eclipse не любит находить файл, который должен существовать по соглашению.

Есть ли у вас какие-либо предложения по тому, как это решить?

ответ

4

Поскольку это официальный Bug JDK 8, который предназначен для решения в JDK 9, я применил обходное решение с удалением файла с помощью градиента, если он уже существует. У процессора больше нет проблемы, и я могу сохранить его в своем исходном наборе.

Привет :)

EDIT: Сам решение.

gradle.ext.generatedQueriesDir = 'build/generated-sources/local/query' 
/* 
* This is a workaround to delete the file that will be created by the annotation processor if it already exists. 
* There is a known bug in the Java compiler and JDK 8 which should be fixed at JDK 9. 
* http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8067747 <-- Master report 
* http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8146348 <-- duplicates master report 
*/ 
if (file(gradle.ext.generatedQueriesDir).exists()) { 
    FileCollection collection = files { file(gradle.ext.generatedQueriesDir).listFiles() } 
    collection.each { delete it } 
} 

Мы используем gradle, поэтому это временное решение для сценария градации. Но в основном обходное решение означает удаление файла, который будет сгенерирован, прежде чем начинать шаги компиляции и предварительной компиляции.

+0

где ваш обходной путь? как я могу применить обходное решение? – inherithandle

2

Я пытаюсь использовать созданные файлы Dagger * в наборе исходных текстов для тестирования моего приложения для Android. Я изменил пару вещей в обходном пути @ Нико, теперь все отлично работает для меня.

/build.gradle:

ext { 
    generatedSourcesDir = 'build/generated/source/apt/test/debug' 
} 

/app/build.gradle

android { 
    sourceSets { 
     test.java.srcDirs += generatedSourcesDir 
    } 
} 

tasks.withType(JavaCompile) { 
    if (file(generatedSourcesDir).exists()) { 
     FileCollection collection = files { file(generatedSourcesDir).listFiles() } 
     collection.each { delete it } 
    } 
} 

dependencies { 
    ... 
}