2009-05-18 15 views
21

Qualcuno ha il codice per rilevare JAR duplicati nel classpath?Come rilevare duplicati JAR nel classpath?

Background: quando ci sono due versioni dello stesso JAR nel classpath, possono accadere cose davvero strane. Questo può accadere anche quando si usano strumenti come Maven: cambia una dipendenza e costruisci WAR senza pulire prima. Poiché target/webapp/WEB-INF/lib non è stato pulito, la dipendenza sarà presente due volte.

C'è una rete di sicurezza per questo?

+1

Verificare se questo può essere d'aiuto: http: // stackoverflow.it/questions/17555928/remove-duplicate-jars-in-a-directroy/20611435 # 20611435 –

risposta

22

JBoss Tattletale potrebbe aiutarti con questo.

È uno strumento gratuito che esegue la scansione dei file JAR utilizzati dal progetto e fornisce un rapporto su di essi.

Tra la sua caratteristica sono:

  • Spot se una classe si trova in più file JAR
  • Spot se lo stesso file JAR si trova in più sedi
  • Trova file JAR simili che hanno versione diversa numeri
1

Penso che modo più semplice è semplicemente cestino la directory di destinazione prima. Si spera che copiare tutti i file .jar non richieda molto tempo.

Altrimenti dovrete confrontare in qualche modo file di dimensioni considerevoli (direttamente, tramite checksum calcolato o simile). Il che non suona molto bene.

-2

È possibile scrivere uno script semplice per confrontare la somma md5 di ogni file jar in ogni altro file jar ed eliminare i duplicati lungo il percorso.

+2

due versioni significa per definizione che la somma md5 non corrisponderà :-) –

+0

ah scusa, mancava la versione diversa della tua domanda – neesh

2

System.getProperty("java.class.path"), dividerlo, ordinarlo, guardarlo con l'occhio umano :-).

Non includerà il percorso di classe derivata dalla manifesta all'interno di altri vasi thou :-(

O utilizzare http://www.jboss.org/tattletale come uno dei manifesti suggerito

+0

Questo presuppone che i tuoi duplicati abbiano lo stesso nome. Spesso il problema è la duplicazione delle classi in barattoli con nomi diversi. Avresti bisogno di più di un paio di bulbi oculari lì. – sal

+0

Di solito, i nomi saranno diversi solo in una versione da qualche parte (di solito un suffisso). A livello di codice è possibile rilevare ed evidenziare prefissi comuni. –

+0

In alcuni casi è necessaria una sorta di segnale di avvertenza. Quello che ho proposto può essere codificato in 2 minuti e funzionare come una sorta di smoke test per catturare duplicati "normali/facili" all'avvio dell'applicazione. Se vuoi un'analisi approfondita usa uno strumento come il tattletale proposto :-). –

4

esiste un plugin Maven per fare proprio questo:.. maven-duplicate-finder-plugin

[EDIT] Se si vuole fare in unità di test da soli, utilizzare

getClass().getClassLoader().getResources("com/pany/package/Java.class") 

Se questo restituisce più di uno URL, si hanno duplicati sul classpath.

Lo svantaggio è che questo funziona solo nei casi in cui si sono verificati conflitti in passato. Sul lato positivo, sono solo alcune righe di codice (o una riga quando scrivi un metodo di supporto) e funziona sul tuo server di build.

Problemi correlati