7 votes

La compilation Maven échoue alors qu'elle réussit dans eclipse

Je suis en train d'utiliser maven3.03 et Eclipse 3.5 sur Windows XP. J'ai converti un ancien projet web pour qu'il soit configuré en style maven.
Lorsque je compile le projet dans Eclipse, tout compile.
Note : Le classpath contient : Dépendances Maven et JDK(1.6_018).
Lorsque je compile depuis la ligne de commande en utilisant mvn, j'obtiens quelques erreurs :
1. Le package com.sun.xml.internal.stream.buffer.stax n'existe pas.
2. Le package com.sun.xml.internal.stream.writers n'existe pas.
3. Ne peut pas trouver le symbole - symbole : class XMLDOMWriterImpl
4. Le package com.sun.xml.internal.messaging.saaj.util n'existe pas.
5. Le package com.sun.xml.internal.bind.v2.runtime.unmarshaller n'existe pas.
6. Ne peut pas trouver le symbole - symbole : class NamespaceContexHelper
7. Ne peut pas trouver le symbole - symbole : class ByteOutputStream

Je vois que c'est quelque chose avec le jar sun. Mais je ne comprends tout simplement pas pourquoi Eclipse fonctionne et la ligne de commande non.

EDIT : Une des erreurs que je n'ai pas mentionnées dans la liste ci-dessus est :

[ERREUR]\EventsViewer.java:[54,69] types inconvertibles trouvés : java.util.SortedMap>
requis : java.util.Map>

Lorsque je vois la même ligne dans Eclipse, j'obtiens un avertissement :

Sécurité du type : Cast non vérifié de SortedMap> à Map>

Dans Eclipse, j'obtiens un avertissement et dans maven j'obtiens une erreur. J'ai vérifié les org.eclipse.jdt.core.prefs et j'ai vu que le réglage est org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning.

Mise à jour : J'ai corrigé certaines des erreurs ci-dessus. Le "problème" est qu'à Eclipse, cela apparaît comme un import inutilisé. Étrangement, maven le signale comme une erreur. Après avoir supprimé cet import inutilisé, l'erreur a disparu. Mais les problèmes 3 et 7 persistent.

Conclusion : Je suppose que les avertissements deviennent des erreurs dans le javac, puisque je n'utilise pas de suppressWarnings. Je suis juste surpris que l'erreur soit différente. Quelle en est la raison ?

9voto

deelew Points 91

Peut-être que c'est la vraie raison de la réponse du forum Maven

" Jerome a raison, ce n'est pas une pratique recommandée d'utiliser des classes com.sun du fichier rt.jar. Surtout celles marquées "internal"; vous cherchez juste les ennuis.

Cependant, j'étais curieux à ce sujet, donc j'ai essayé. La classe susmentionnée peut effectivement être accédée par Eclipse. Cependant, la compilation du code en ligne de commande en utilisant javac échoue avec l'erreur "n'existe pas". Donc, mon hypothèse est que le compilateur java de Sun détecte lorsqu'une classe "interne" spéciale est accédée, et refuse d'importer la classe. Eclipse utilise un compilateur différent qui ne vérifie probablement pas cela.

Maven utilise simplement le compilateur javac disponible dans le chemin d'exécution du système. Par conséquent, le problème n'a rien à voir avec Maven. C'est le compilateur invoqué par Maven qui refuse de compiler le code source. Je ne vois aucun indicateur public dans la ligne de commande javac pour désactiver ce blocage de l'accès interne, donc à moins que vous ne vouliez éviter d'utiliser le compilateur javac de Sun, vous devrez simplement éviter d'utiliser cette classe interne.

Juste pour le plaisir, j'ai essayé la suggestion de Jerome de mettre rt.jar sur le chemin de classe: javac -cp /usr/java/jdk1.6.0_03/jre/lib/rt.jar Foo.java mais cela a quand même échoué à compiler.

La classe ByteOutputStream peut être chargée au moment de l'exécution via Class.forName("..").

Curieusement, un projet sur lequel je travaille importe effectivement la classe com.sun.org.apache.xml.internal.utils.SAXSourceLocator; et cela fonctionne bien. Des avertissements sont émis, mais le code compile (et oui, c'est sur ma liste de tâches à faire de corriger cela :-). Donc, ce ne sont pas toutes les classes internes qui sont bloquées, juste certaines sélectionnées. "

2voto

Jeanne Boyarsky Points 5968

Vérifiez que vous utilisez le même JDK pour les builds d'Eclipse et de Maven. Même si vous pensez que c'est le cas, revérifiez quand même.

Ces packages font partie de certaines versions de Java et non d'autres.

0voto

Omnaest Points 2511

Si la version de Java diffère, ajoutez le maven-compiler-plugin

                org.apache.maven.plugins
                maven-compiler-plugin
                2.3.1

                    1.6
                    1.6
                    UTF-8

avec la configuration de la source et de la cible pointant vers 1.6 et mettre à jour la configuration du projet depuis le menu contextuel du projet Maven résoudra le problème de désynchronisation dans de nombreux cas (ce qui entraîne des résultats de compilation différents) :

entrez ici la description de l'image

0voto

Vikram Points 1127

Ceci est mon cas : j'ai obtenu la même erreur dans IntelliJ après avoir ajouté //TODO, Intellij a automatiquement ajouté cette ligne dans la section des imports import com.sun.xml.internal.bind.v2.TODO;

Après avoir supprimé la ligne d'import ci-dessus, le problème a été résolu. Maintenant, je peux compiler avec succès en utilisant maven

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X