2009-08-27 15 views
21

Cuando compilo mi proyecto con las advertencias del compilador (JDK 1.5) consigo un montón de malas advertencias elemento de la ruta:Advertencia de mal camino, ¿de dónde viene?

Advertencia :: [ruta] mal elemento de la ruta "C: \ Users \ Usuario \ MYJAVA \ common \ lib \ junit.jar ": ningún archivo o directorio Advertencia :: [ruta] elemento de la ruta incorrecta" C: \ Users \ User \ MyJava \ common \ lib \ jdom.jar ": no existe tal archivo o directorio Advertencia :: [ ruta] elemento de ruta incorrecta "C: \ Users \ User \ MyJava \ common \ lib \ xerces.jar": ningún archivo o directorio Advertencia :: [ruta] elemento de ruta incorrecta "C: \ Users \ User \ MyJava \ common \ lib \ xml-apis.jar ": ningún archivo o directorio

y muchos más.

Esto está usando IDEA 8.1.3. No puedo encontrar nada en la configuración de IDEA (agrupé todo el proyecto) donde cualquier cosa apunta a estos archivos. En realidad, ya no están bajo ese nombre, pero ¿qué los hace referencia?

Respuesta

26

Creo que @Yishai tiene derecho a eso (le daré un voto favorable para poner en marcha la pelota). Me encuentro con esto todo el tiempo. En lo que creo que fue una decisión horrible para el lenguaje Java, decidieron que estaría bien permitir que la configuración de la ruta de clases vaya a los archivos MANIFEST dentro de los archivos jar. Básicamente, los Jars pueden tener archivos dentro de ellos que apuntan a otras clases y jarras ubicadas en otro lugar y cuando esas otras cosas señalan que no existen, usted ve advertencias como las que está recibiendo. Estas advertencias provienen de archivos Jar que se encuentran en su classpath de compilación. Entonces, lo que debe hacer si realmente le importa es rastrear los archivos jar problemáticos, extraer el contenido de los archivos jar, eliminar la configuración de "Class-Path" en sus archivos de manifiesto y volver a crearlos. Algo así (mueva el contenedor a un directorio temporal en alguna parte primero):

#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 ./* 

¡Eso debería hacer el truco!

No creo que solo quiera suprimir estos mensajes porque si desea un control total sobre lo que está pasando en su ruta de clases, debe buscar estos archivos de manifiesto y asegurarse de que no entren en conflicto con la ruta de clase usted no sabe

Probablemente tendrás que mirar a través de una tonelada de archivos jar, así que generalmente termino usando un bucle de shell para ayudarme a mirar a través de ellos. Puede copiar todos los tarros en cuestión en un directorio temporal y ejecutar un bucle como este (sintaxis bash):

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

que imprimirá el nombre de cada archivo Jar en el directorio actual, extraer su contenido, y grep su archivo de manifiesto para entradas classpath. Si el nombre del archivo jar en el resultado tiene una copia impresa "Class-Path" después de él, eso significa que Jar tiene configuraciones de classpath en su manifiesto. De esta forma, con suerte podrá descubrir en qué tarros necesita actuar.

+0

¡Gracias por la elaboración! – Yishai

+0

Buena idea, pero usted contamina el directorio actual con el contenido de los archivos JAR. –

+0

@LawrenceDol Es por eso que dice 'Puede copiar todos sus contenedores en cuestión en un directorio temporal ...' –

0

¿Ha comprobado los lugares donde se está configurando la variable de entorno CLASSPATH y la opción de compilación?

+0

Sí, que no se hace referencia directamente por IDEA (que proporciona la ruta de clase) en cualquier lugar. – Yishai

20

Según this, el problema es que en los archivos jar de terceros hay una referencia a estos en el manifiesto. El mensaje se puede deshabilitar agregando -Xlint: -path a los parámetros de compilación.

0

Los elementos de ruta en cuestión son muy probablemente en el archivo de manifiesto de JAR. Para localizar el archivo JAR infractor puede ejecutar este script de shell que extraer sólo los archivos de manifiesto y mostrar cualquier ruta de clases que tiene:

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 
Cuestiones relacionadas