2012-01-24 11 views
8

Sto costruendo file jar java usando ant. Devo includere ulteriori jar usando "zipfileset src =" xxx.jar "" zipfileset src = "yyy.jar" e sia xxx.jar che yyy.jar hanno le classi con i nomi delle classi pienamente qualificati SAME. Quindi il file jar risultante ha nomi di classi duplicati. Quali sono le possibili implicazioni di avere duplicati?Quali sono le implicazioni di avere classi duplicate in jar java?

Grazie.

+0

Perché vuoi farlo ? – Bhushan

risposta

15

Se sono duplicato implementazioni, nulla – non importa quale sia caricato.

In caso contrario, sei in balia dell'ordine di caricamento classe e potresti ottenere una versione diversa da quella desiderata.

E è specificato che le voci del percorso di classe verranno ricercate nell'ordine elencato (come da this classpath doc). ma ciò è rilevante solo se hai il controllo completo della creazione del percorso di classe (a differenza, ad esempio, di un'app Web).

(con l'avvertenza che caratteri jolly percorso di classe rende l'ordine non deterministico.)

+0

Sì, ci sono esatte implementazioni duplicate, grazie. –

0

Sono d'accordo con Dave.

Puoi separarli in base al namespace per evitare le insidie ​​che suggerisce?

4

In generale questa situazione è altamente raccomandata e deve essere evitata.

I jar in java sono solo contenitori per i file di classe. java utilizza classloader che esaminano il classpath e caricano i file di classe da lì. quindi se hai 2 jar A.jar e B.jar che hanno la stessa classe x.y.Foo all'interno, verrà caricata la classe dal jar che viene prima nel classpath. Quindi, se il classpath è A.jar, B.jar (in questo ordine) la classe Foo di A.jar verrà utilizzata in runtime. Questa incoerenza può portare a bug molto difficili da risolvere dalla mia esperienza

+0

Capisco. Cambierò il file di build ant per includere l'attributo "dir" in zipfileset invece di "src". –

1

cosa significa duplicato? è ovvio che non puoi avere 2 classi con lo stesso nome nello stesso pacchetto (anche il tuo progetto non verrà compilato), ma se intendi che hai 2 classi con lo stesso nome in pacchetti diversi è "ok".

+0

Ho 2 vasi: xxx.jar e yyy.jar che sono usati separatamente. Stanno condividendo in parte le esatte implementazioni. Inoltre sto costruendo un altro barattolo che include questi 2 vasi. Quindi, se apro il vaso risultante, posso vedere nomi di classi duplicati nello stesso pacchetto. –

+0

domanda, entrambe le classi hanno la stessa funzionalità ?, perché se è vero, puoi puntare solo a un barattolo ed evitarlo, ad esempio: yyy.jar (rimuovi classe e usa xxx.jar {mantieni la classe}) – elopez

0

Un'altra risposta, che non vedo discusso qui è che se si ha intenzione di firmare i tuoi barattoli, Aars, APK allora signjar si lamentano di avere voci duplicate

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