Essayer de construire un ensemble de compétences Alexa (Amazon: echo). Dans le même temps, nous essayons d'utiliser cette expérience comme un banc d'essai d'apprentissage pour l'injection de dépendance via le poignard 2. Cependant, la construction du paquet en utilisant maven-2 cmd
mvn Assembly:assembly -DdescriptorId=jar-with-dependencies package'.
générer un fichier Zip avec les dépendances complètes génère la trace d'exception suivante:
[INFO] ------------------------------------------------------------------------
[INFO] Building Echo Device Client 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ echo-device-client ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/apil.tamang/Dropbox/Git/echo-device-client/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ echo-device-client ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 46 source files to /Users/apil.tamang/Dropbox/Git/echo-device-client/target/classes
An exception has occurred in the compiler (1.8.0_60). Please file a bug at the Java Bug Database (http://bugreport.Java.com/bugreport/) after checking the database 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.api.JavacTaskImpl.doCall(JavacTaskImpl.Java:129)
at com.Sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.Java:138)
La compilation initiale se passe bien et tous les tests sont exécutés et exécutés avec succès. J'ai l'impression que c'est pendant la «liaison» des dépendances que les choses vont au sud. Veuillez regarder ce fichier pour voir la sortie de la console pendant la construction.
Ma question est de savoir s'il vaut la peine d'essayer de générer les dépendances en utilisant une méthode différente. Je ne sais pas grand chose de Maven à cette fin. Y at-il un patch ou quelque chose qui peut être utilisé? Pensez-vous qu'il est même possible de trouver une solution de contournement? Je voudrais pouvoir continuer à utiliser le cadre de poignard 2 pour construire ce projet.
Le problème est décrit dans le rapport de bogue JDK-8067747
:
(de Jan Lahoda)
A ma connaissance, ce bug a deux aspects:
le bogue javac qu'il se bloque avec une exception. Je travaille là-dessus, mais veuillez noter que javac ne compilera pas l'entrée lorsque cela sera corrigé, il lèvera une exception appropriée du gestionnaire de fichiers (voir ci-dessous).
ce qui semble être un bogue majeur: lorsque le projet est compilé avec "installation propre", un processeur d'annotation génère un fichier source dans "cible/sources-générées/annotations". Une fois la compilation incrémentielle terminée, ce fichier généré est transmis à javac en tant qu'entrée et le processeur d'annotation tente de le générer à nouveau, ce qui n'est pas autorisé.
Cela implique que lorsque le bogue maven est corrigé, le bogue de javac
’qui signale le problème avec une exception inappropriée devient inutile. Cependant, étant donné la date de fin de vie de Maven 2, je doute que vous puissiez vous attendre à trouver un correctif ou une solution.
Comme expliqué dans ce problème , une solution de contournement consiste à désactiver useIncrementalCompilation :
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
J'ai rencontré la même erreur avec un projet construit et testé par Maven et JDK 1.8.0_121. Dans la configuration d'origine, le projet avait d'abord été nettoyé via mvn clean
, puis construit à l'aide de mvn install -projectSpecificParameters
et finalement testé avec un mvn install -otherProjectSpecificParameters
séparé. Cette configuration a entraîné l'erreur mentionnée dans la question.
Après avoir modifié l'ordre des étapes (les premiers tests puis la construction) et ajouté un objectif clean
à la commande de construction pour nettoyer l'état de construction après les tests, l'erreur n'était plus reproductible.
Je ne sais pas si cela peut aider. Pour mon cas, j'ai eu le même problème avec open-jdk
8u91
, j'ai installé Oracle-jdk et je pouvais exécuter le projet après mvn clean compile
. Le problème était que je devais basculer entre les JDK pour chaque exécution et la construire à nouveau avec Maven.
EDIT: après avoir lutté pendant deux jours, j'ai trouvé que c'était le résultat de l'inadéquation entre maven
et jdk
. Mon IDE utilisait maven 3.0.5 en tant que maven intégré.
Solution: Dans votre IDE, vous devriez changer votre répertoire personnel maven de bundled maven
à votre version actuelle, par exemple /usr/share/maven
. (pour moi la version actuelle était 3.3.9)