2009-08-27 8 views
21

Quand je compile mon projet avec des avertissements du compilateur (JDK 1.5) Je reçois un tas d'avertissements d'éléments mauvais chemin:Mauvais avertissement de chemin, d'où vient-il?

Attention :: [path] mauvais élément de chemin « C: \ Users \ User \ MYJAVA \ common \ lib \ junit.jar ": aucun fichier ou répertoire de ce type Avertissement :: [path] élément de chemin incorrect" C: \ Users \ Utilisateur \ MyJava \ common \ lib \ jdom.jar ": aucun fichier ou répertoire de ce type Avertissement :: [ path] élément de chemin incorrect "C: \ Users \ Utilisateur \ MyJava \ common \ lib \ xerces.jar": aucun fichier ou répertoire de ce type Avertissement :: [path] élément de chemin incorrect "C: \ Users \ User \ MyJava \ common \ lib \ xml-apis.jar ": aucun fichier ou répertoire de ce type

et beaucoup plus.

Utilise IDEA 8.1.3. Je ne trouve nulle part dans la configuration d'IDEA (j'ai accueilli tout le projet) où tout pointe sur ces fichiers. Ils ne sont en effet plus là sous ce nom, mais qu'est-ce qui les désigne?

Répondre

26

Je pense que @Yishai a le droit de le faire (je vais lui donner un vote pour lancer le bal). Je cours dans tout le temps. Dans ce que je pense était une décision horrible pour le langage Java, ils ont décidé qu'il serait correct d'autoriser les paramètres de chemin de classe à entrer dans les fichiers MANIFEST dans les fichiers jar. Donc, essentiellement, Jars peut avoir des fichiers à l'intérieur d'eux qui pointent vers d'autres classes et pots situés ailleurs et quand les autres choses qu'ils pointent n'existent pas, vous voyez des avertissements comme ceux que vous obtenez. Ces avertissements proviennent des fichiers Jar qui se trouvent sur votre chemin de classe de compilation. Donc, ce que vous devez faire si vous vous souciez vraiment est de dépister les fichiers jar problème, extraire le contenu des fichiers jar, supprimer les paramètres "Class-Path" dans leurs fichiers manifeste et les recréer. Quelque chose comme ceci (déplacez le pot vers un répertoire temporaire quelque part d'abord):

#Extract the jar file 
jar xvf myfile.jar 
rm myfile.jar 
emacs ./META-INF/MANIFEST.MF 

*Find the entry "Class-path:" and remove it completely and save the changes 

#Rebuild the jar file 
jar cvf myfile.jar ./* 

Cela devrait faire l'affaire! Je ne pense pas que vous vouliez simplement supprimer ces messages, car si vous voulez un contrôle total sur ce qui se passe sur votre chemin de classe, vous devriez rechercher ces fichiers manifestes et vous assurer qu'ils ne gâchent pas le chemin des classes d'une manière tu ne sais pas. Il est probable que vous deviez regarder à travers une tonne de fichiers jar, donc je finis généralement par utiliser une boucle de shell pour m'aider à les parcourir. Vous pouvez copier tous vos Jars en question dans un répertoire temporaire et exécuter une boucle comme celui-ci (bash syntaxe):

for i in *.jar; do echo $i; jar xf $i; grep -i 'class-path' ./META-INF/MANIFEST.MF; done 

qui imprimera le nom de chaque fichier Jar dans le répertoire courant, extraire son contenu, et grep son fichier manifeste pour les entrées classpath. Si le nom du fichier jar dans la sortie a une impression "Class-Path" après cela, cela signifie que Jar a des paramètres de classpath dans son manifeste. De cette façon, vous pouvez, espérons-le, trouver les bocaux dont vous avez besoin pour agir.

+0

Merci pour l'élaboration! – Yishai

+0

Bonne idée, mais vous polluez le répertoire actuel avec le contenu des fichiers JAR. –

+0

@LawrenceDol C'est pourquoi il est dit 'Vous pouvez copier tous vos pots en question dans un répertoire temporaire ...' –

0

Avez-vous vérifié les endroits où votre variable d'environnement CLASSPATH et l'option de compilation sont définies?

+0

Oui, ils ne sont pas référencées directement par IDEA (qui fournit le classpath) partout. – Yishai

20

Selon this, le problème est que dans les fichiers tiers, il existe une référence à ceux-ci dans le manifeste. Le message peut être désactivé en ajoutant -Xlint: -path aux paramètres de compilation.

0

Les éléments de chemin en question sont très probablement dans le fichier manifeste d'un fichier JAR. Pour localiser le JAR incriminé vous pouvez exécuter ce script shell qui va extraire uniquement les fichiers manifestes et montrer tout classpath il a:

for i in *.jar; do echo $i; /path/to/your/jdk/bin/jar xf $i META-INF/MANIFEST.MF; grep -i 'class-path' META-INF/MANIFEST.MF; done