2008-09-01 4 views
4

Dies ist möglicherweise nicht die beste Vorgehensweise, aber gibt es Möglichkeiten, nicht verwendete Klassen aus den JAR-Dateien eines Drittanbieters zu entfernen. Etwas, das die Art und Weise betrachtet, in der meine Klassen die Bibliothek verwenden und eine Art Coverage-Analyse durchführen, spuckt dann ein anderes Jar aus, in dem alle unberührten Klassen entfernt sind.Wie entferne ich den Fluff aus einer Third-Party-Bibliothek?

Offensichtlich gibt es Probleme mit diesem. Insbesondere das Verwendungsszenario, das ich es nannte, verwendet möglicherweise nicht alle Klassen die ganze Zeit.

Aber vernachlässigen diese Probleme, kann es im Prinzip getan werden?

Antwort

8

Es gibt einen Weg.

Das JarJar-Projekt macht dieses AFAIR. Das erste Ziel des JarJar-Projekts besteht darin, Bibliotheken von Drittanbietern in Ihr eigenes jar einzubetten und die Paketstruktur bei Bedarf zu ändern. Dadurch können die nicht benötigten Klassen entfernt werden.

Überprüfen Sie es bei http://code.google.com/p/jarjar/. Hier

ist ein Link über schrumpfende Gläser: http://sixlegs.com/blog/java/jarjar-keep.html

0

jar ist nur eine Zip-Datei, also denke ich, Sie können. Wenn du zur Quelle gelangst, ist es sauberer. Vielleicht versuchen Sie die Klasse zu zerlegen?

0

Hinzufügen zu dieser Frage, kann das die Leistung verbessern? Da die nicht verwendeten Klassen nicht JIT-kompiliert werden, um die Startzeit zu verbessern, oder erkennt das Java das automatisch beim Kompilieren zu Bytecode und behandelt nicht einmal den Code, der nicht verwendet wird?

1

Bei einem frühen Job, habe ich einen Java obfuscator, die sowie den Code verschleiern, auch Klassen und Methoden entfernt, die nicht verwendet wurden. Wenn Sie "Class.byName" oder eine andere Art von Reflektionsmaterial verwendeten, mussten Sie dem Obfuscator sagen, dass er nicht durch eine Überprüfung des Codes feststellen konnte, welche Klassen oder Methoden durch Reflektion aufgerufen wurden. Das Problem ist natürlich, dass Sie nicht wissen, ob andere Teile der Third-Party-Bibliothek eine Reflexion durchführen, und das Entfernen einer "unbenutzten" Klasse könnte dazu führen, dass Dinge in einem obskuren Fall, den Sie haben, nicht funktionieren Ich habe es nicht getestet.

0

Dies wäre ein interessantes Projekt sein (hat jemand es schon getan?)

Ich nehme an, Sie würden das Werkzeug Ihr Glas (e) als Ausgangspunkt geben, und die Bibliothek jar aufzuräumen. Es könnte Reflektion verwenden, um zu bestimmen, auf welche Klassen Ihre Jar (s) direkt verweisen und welche indirekt in der Call-Struktur verwendet werden (dies ist nicht trivial, aber machbar). Wenn es an irgendeinem der beiden Orte einen Reflexionscode vorfindet, sollte es sehr laut warnen.

2

Es ist ein Werkzeug in Ant einen classfileset genannt. Sie geben die Liste der Stammklassen an, von denen Sie wissen, dass sie benötigt werden, und dann analysiert der Klassensatz rekursiv ihren Code, um alle Abhängigkeiten zu finden.

Alternativ könnten Sie einen guten Test-Suite entwickeln, die alle Funktionen ausübt, die Sie benötigen, dann Ihre Tests unter einem Testabdeckung Tool. Das Tool wird Ihnen sagen, welche Klassen (und Anweisungen in ihnen) tatsächlich verwendet wurden. Dies könnte Ihnen eine noch kleinere Menge an Code geben, als Sie mit der statischen Analyse finden würden.

2

Ich verwende dafür ProGuard. Es ist nicht nur ein hervorragender Verschleierer, sondern hat auch eine Code-Schrumpfphase, die mehrere JARs kombinieren und dann alle nicht verwendeten Klassen oder Klassenmitglieder entfernen kann. Es macht einen ausgezeichneten Job beim Schrumpfen.