2010-09-28 15 views
11

Aplikacja, którą napisałem, wykorzystuje kilka słoików stron trzecich. Czasami używana jest tylko niewielka część całego słoika o pojemności od 50kB do 1,7mB - jedno lub dwa wywołania funkcji lub klasy.Minimalizowanie rozmiarów zależnych od słoiczka

Jaki jest najlepszy sposób na zmniejszenie rozmiarów słoików. Czy powinienem pobrać źródła i zbudować słoik tylko z klasami, których potrzebuję? Jakie istniejące narzędzia mogą pomóc w automatyzacji tego procesu (np. Krótko omówiłem http://code.google.com/p/jarjar/)?

Dziękuję

Edit 1: chciałbym obniżyć wielkość mojej strony trzeciej słoików 'urzędowy' jak SwingX-1.6.jar (1,4 MB), set-3.6 (1.7 MB) glazedlists -1.8.jar (820kB), itd., tak by zawierać tylko niezbędne minimum klas muszę

Edit 2: Minimalizacja słoik ręcznie lub przy użyciu programu jak PROGUARD komplikuje jeśli zastosowań bibliotecznych odbicie. Injection with google guice does not work anymore after obfuscation with proguard

Odpowiedź przez cletus na innym stanowisku jest bardzo dobra How to determine which classes are used by a Java program?

Odpowiedz

5

Proguard byłoby rozwiązaniem. Może wyeliminować nieużywane klasy i metody. Możesz go również użyć do zaciemnienia, co może dodatkowo zmniejszyć rozmiar finalnego słoja. Pamiętaj, że ładowanie klas według nazwy może się zepsuć, o ile nie zostanie podjęta troska o utrzymanie niezakłóconych klas.

Zauważyłem, że Proguard jest dość skuteczny - może być nieco tajemniczy, aby go zrozumieć na samym początku. Ale nie mam żadnego doświadczenia z podobnym do oferowania porównania.

+0

Użyłem Proguard do zaciemniania mojego słoika aplikacji z dobrym wynikiem i zauważyłem mniejszy rozmiar wyjściowy. Wpadałem też na problemy z "uszkodzonymi klasami", jak wspomniałeś, z obiektami Xstream, dopóki nie dodałem ich do sekcji "keep". Nie użyłem proguarda, aby zmniejszyć rozmiar moich słoików zależności - czy to możliwe? –

+0

@brian_d - tak powinno być możliwe, używając -injars/-outjars. Myślę, że "poziom trudności" będzie zależał od liczby posiadanych słoików. Przykładem zastosowania miałem szyfrowanie bouncycastle. Udało mi się dołączyć klasy, których potrzebowałem, odrzucając cały kod dla nieużywanych algorytmów itp. –

+0

dzięki za sugestię, spróbuję. –

0

Po pierwsze, jeśli używasz tylko jednej klasy z pliku JAR, nie oznacza to, że ta klasa nie używa innych klas z tego pliku JAR. Opcja, jeśli korzystasz z JARów open source, polega na zdobyciu źródeł tego pliku JAR, dołączeniu ich do projektu, usunięciu niepotrzebnych elementów i samodzielnym utworzeniu zmian.

+0

Nadal problematyczny jak wspomniano w mojej "Edycji nr 2". Zmniejszyłem wahania ręcznie z 1,4 MB do 160 KB. Zbudowano go dobrze, ale uległ awarii z powodu kilku wywołań metod metody reflect, które nie zostały uwzględnione. –

0

Możesz dodać GenJar jako zadanie Ant i użyć go do zbudowania JAR. Jak mówi na stronie głównej biblioteki,

GenJar jest wyspecjalizowanym Ant zadanie buduje pliki jar w oparciu o klasy Zależności zamiast po prostu zawartości katalogu.

Można go znaleźć na SourceForge.

+1

Dostaję tylko frustrację z GenJar, z błędami "Nie można rozwiązać".Wygląda na to, że nie był aktualizowany również od 2003-03-06. –

+0

Stwierdziłem, że GenJar Nie można rozwiązać problemów, gdy użyłem języka Java 7 zamiast języka Java 8 – Jon

Powiązane problemy