2011-09-12 9 views
5

Devo rimuovere classi non utilizzate da JAR di terze parti. Perché gli strumenti dovrei usare?Rimozione di classi non necessarie da librerie e JAR di terze parti

Ho già provato a utilizzare ProGuard. Tuttavia, rimuove solo le classi non utilizzate dal progetto stesso, ma i vasi della libreria - di terze parti - rimangono sempre invariati.

+0

Perché vuoi rimuovere le classi dai vasi di terze parti? – Rakesh

+4

Questa è generalmente una cattiva idea, perché - grazie a [reflection] (http://download.oracle.com/javase/tutorial/reflect/index.html) - non c'è modo di sapere veramente quali classi non sono utilizzate e quali sono non, specialmente quando si tratta di JAR di terze parti (ovvero non si ha idea di come funzionano internamente). –

+0

+ Joonas Grazie per la risposta. Hai ragione, ma [ProGuard] (http://proguard.sourceforge.net) può gestire la riflessione e l'introspezione. Quindi, c'è qualche altro strumento che può fare lo stesso con vasi di terze parti ?? –

risposta

4

È possibile creare un jar uber e quindi utilizzare ProGuard. Riunire le classi delle librerie in barattoli sarebbe una sfida, ma dallo spirito della tua domanda preferirai il barattolo di Uber come tale.

Come altri commentatori hanno commentato, è comunque necessario fare attenzione alle classi caricate attraverso il meccanismo di riflessione tanto abusato e frainteso.

1

@Joonas Pulakka ha ragione. Ma se vuoi davvero farlo e assicurati che la tua applicazione non fallisca per l'ClassNotFoundException esegui l'applicazione con l'opzione -verbose: class, esegui tutti gli archivi esistenti, prendi il log che contiene tutte le classi caricate. Poi prendi una lista di tutte le classi della tua libreria di terze parti e archivia tutte le classi dalla tua libreria che non sono mai state caricate. Quindi crea un file jar alternativo contenente solo classi "necessarie" e prega :)

Buona fortuna.

+0

+ AlexR Lool, sto parlando di 35,7 MB di JAR. –

-5

Java carica solo la classe così come sono utilizzati. La rimozione delle classi può solo causare problemi e non ti aiuterà in fase di runtime. 36 MB di codice non sono tanto dati solo una parte di essi verrà caricata. Quanta memoria hai? La maggior parte dei PC ha almeno 2000 MB in questi giorni Se stai scaricando l'applet o l'applicazione Java WebStart su un collegamento lento, immagino che stai usando pack200 (per rendere i vasi più piccoli) e che abbia già incluso il minimo di librerie.

+2

+ Lawrey Grazie per la risposta e capisco il tuo punto di vista. Tuttavia, i requisiti sono di eliminare classi non utilizzate da JAR e di mettere tutti i Jars in un singolo JAR FAT. So che può essere inutile ma lo vogliono solo più pulito. –

+0

Ora puoi metterli tutti in un solo JAR ora. Dovresti renderli consapevoli che ciò potrebbe rendere l'applicazione instabile e insopportabile. cioèQuando, non se, ti spezza almeno hai avvertito che era una cattiva idea. Non li vuoi incolpare per non aver fatto il tuo lavoro quando ciò che stanno chiedendo è irragionevole. –

+0

+ Lawrey lo farò. Grazie per il tuo consiglio :) –

0

È una buona cosa sapere quali classi e librerie si utilizzano e anche se vi è il rischio (come indicato da Peter) di rimuovere materiale inutilizzato, vi è un costo nel trasportare qualsiasi tipo di bagaglio in eccesso, e voi non dovrebbe semplicemente continuare ad accumularsi. Se usi la riflessione, cerca di capire in che cosa la stai usando e di eliminare sistematicamente ciò che non ti serve. Ci sono vantaggi per un codice più snello che puoi capire meglio.

Problemi correlati