2012-01-24 18 views
8

Estoy construyendo el archivo java jar usando hormiga. Necesito incluir jar adicionales usando "zipfileset src =" xxx.jar "" zipfileset src = "yyy.jar" y tanto xxx.jar como yyy.jar tienen las clases con los MISMOS nombres de clase totalmente calificados. Por lo tanto, el archivo jar resultante tiene nombres de clase duplicados. ¿Cuáles son las posibles implicaciones de tener duplicados?¿Cuáles son las implicaciones de tener clases duplicadas en java jar?

Gracias.

+0

¿Por qué quieres hacer eso ? – Bhushan

Respuesta

15

Si son implementaciones duplicadas, nada – no importa que se cargue.

Si no, está a merced de la orden de carga de clases, y puede obtener una versión diferente de la que desea.

Es especificado que las entradas classpath se buscarán en el orden indicado (según this classpath doc). pero eso solo es relevante si tienes el control completo de la creación de classpath (a diferencia de una aplicación web, por ejemplo).

(con la salvedad de que la ruta de clase comodín hace que el orden no determinista.)

+0

Sí, hay implementaciones duplicadas exactas, gracias. –

0

Estoy de acuerdo con Dave.

¿Puede separarlos por espacio de nombres para evitar las trampas que sugiere?

4

En general, esta situación es altamente no recomendada y debe evitarse.

Los tarros en java son solo contenedores para sus archivos de clase. java usa classloaders que miran el classpath y cargan archivos de clase desde allí. así que si tienes 2 jarras A.jar y B.jar que tienen la misma clase x.y.Foo dentro, la clase del jar que viene primero en el classpath será cargada. Entonces, si su classpath es A.jar, B.jar (en este orden), la clase Foo de A.jar se usará en tiempo de ejecución. Esta incoherencia puede llevar a errores muy difíciles de corregir de mi experiencia

+0

Ya veo. Cambiaré el archivo de construcción de ant para incluir el atributo "dir" en zipfileset en lugar de "src". –

1

¿Qué significa la duplicación? es obvio que no puedes tener 2 clases con el mismo nombre en el mismo paquete (incluso tu proyecto no se compilará), pero si quieres decir que tienes 2 clases con el mismo nombre en diferentes paquetes, eso está "bien".

+0

Tengo 2 jarras: xxx.jar y aaa.jar que se usan por separado. Comparten parcialmente implementaciones exactas. Además, estoy construyendo otro frasco que incluye estos 2 frascos. Entonces, si abro el jar resultante, puedo ver nombres de clases duplicados en el mismo paquete. –

+0

pregunta, ¿ambas clases tienen la misma funcionalidad ?, porque si eso es cierto, podría apuntar solo a un jar y evitar eso, ejemplo: yyy.jar (eliminar clase, y usar xxx.jar {mantener clase}) – elopez

0

Otra respuesta que no veo discutido aquí es que si usted planea en la firma de sus tarros, aars, aPKs entonces signjar se quejan de que tiene entradas duplicadas

jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: com/foo/bar/baz.java 
Cuestiones relacionadas