2010-09-28 11 views
11

un'applicazione che ho scritto utilizza diversi contenitori di terze parti. A volte viene utilizzata solo una piccola parte dell'intero jar da 50kB a 1,7mB - una o due chiamate o classi di funzioni.Ridurre al minimo le dimensioni delle dipendenze del vaso

Qual è il modo migliore per ridurre le dimensioni del barattolo. Dovrei scaricare i sorgenti e costruire un barattolo con solo le classi che mi servono? Quali strumenti esistenti possono aiutare ad automatizzare questo (ex ho brevemente guardato a http://code.google.com/p/jarjar/)?

Grazie

Modifica 1: vorrei abbassare le dimensioni del mio terzo vasetti 'ufficiali' come swingx-1.6.jar (1.4 MB), set-3.6 (1,7 MB) glazedlists -1.8.jar (820KB), ecc in modo che contengono solo le classi minimo indispensabile ho bisogno

Edit 2: Minimizzare un vaso a mano o utilizzando un programma come proguard si complica ulteriormente se gli usi libreria riflessione. Injection with google guice does not work anymore after obfuscation with proguard

La risposta da Cletus su un altro post è molto buono How to determine which classes are used by a Java program?

risposta

5

Proguard sarebbe un'opzione. Può eliminare classi e metodi non utilizzati. Puoi anche usarlo per offuscare, che può ridurre ulteriormente le dimensioni del tuo vaso finale. Essere consapevoli del fatto che il caricamento di classe per nome è suscettibile di interruzione a meno che non si prenda cura di mantenere le classi interessate non offese.

Ho trovato Proguard piuttosto efficace - può essere un po 'criptico da capire all'inizio. Ma non ho alcuna esperienza con simili per offrire un confronto.

+0

Ho usato Proguard per offuscare il mio jar di applicazione con un buon risultato e ho notato la dimensione di output più piccola. Ho anche avuto a che fare con le "classi spezzate" come hai detto, con gli oggetti xstream, fino a quando non li ho aggiunti alla sezione "continua". Non ho usato proguard per ridurre la dimensione dei miei barattoli di dipendenza però - è possibile? –

+0

@brian_d - sì dovrebbe essere possibile, usando -injars/-outjars. Immagino che il "livello di difficoltà" sia legato al numero di vasi che hai. Un esempio di utilizzo che ho avuto era la crittografia di bouncycastle. Sono stato in grado di includere solo le classi di cui avevo bisogno, scartando tutto il codice per gli algoritmi inutilizzati, ecc. –

+0

grazie per il suggerimento, darò una prova. –

0

Prima di tutto, se si utilizza solo una classe dal file JAR, ciò non significa che questa classe non usi altre classi di quel JAR. L'opzione per te, se usi i JAR open source, è ottenere fonti di quel JAR, collegarle al tuo progetto, rimuovere cose inutili e costruire le modifiche da solo.

+0

Ancora problematico come menzionato nel mio 'Edit # 2'. Ho ridotto lo swingx a mano da 1,4 MB a 160 kB. Ha funzionato bene, ma si è bloccato durante l'esecuzione a causa di diverse chiamate alla classe del metodo reflection che non erano incluse. –

0

È possibile aggiungere GenJar come attività Ant e utilizzarlo per creare il JAR. Come si dice sulla home page della biblioteca,

GenJar rappresenta un compito Ant specializzato che costruisce file jar basate su classe dipendenze piuttosto che semplicemente i contenuto di una directory.

Lo trovi su SourceForge.

+1

Non ricevo altro che frustrazione con GenJar, con errori "Incapace di risolvere".Sembra che non sia stato aggiornato dal 2003-03-06. –

+0

Ho scoperto che GenJar Incapace di risolvere i problemi è andato via quando ho usato Java 7 invece di Java 8 – Jon