Was ist der einfachste Weg (Tool?), Um nicht verwendete Gläser aus meinem Java (Ant) -Projekt zu entfernen. Unser Projekt ist wirklich riesig geworden, und wir wollen aufräumen. Es gibt mehrere jars, die dem classpath hinzugefügt werden, aber nicht alle werden für compile/run verwendet. Gibt es eine Möglichkeit, die unnötigen JARs zu identifizieren, indem Sie ein Dienstprogramm über die Befehlszeile ausführen?
Hinweis: Wir möchten nicht den langwierigen Prozess des Entfernens eines oder mehrerer Gläser folgen, dann kompilieren/ausführen, um zu testen, ob diese erforderlich sind oder nicht.entfernen Sie nicht verwendete Gläser aus dem Projekt
Antwort
Dies ist, was ich schließlich
Ich benutzte JBOSS TattleTale (http://www.jboss.org/tattletale), um nicht verwendete Gläser zur Kompilierzeit zu identifizieren (Es gemeldet 17 Gläser als unbenutzt).
Dann habe ich für jedes Jar in dieser Liste eine String-Suche in meinem Projekt durchgeführt, um herauszufinden, ob die höchste Package-Ebene des Jars irgendwo verwendet wurde (dies ist ein Versuch zu sehen, ob eine zu diesem Jar gehörende Klasse durch Reflektion geladen wurde)).
So konnte ich erfolgreich 6 Gläser aus meinem Projekt eliminieren.
Da die Anzahl der nicht verwendeten Jars zur Kompilierungszeit gering war, war dieser Ansatz schnell.
Wenn es eine bessere Lösung dafür gibt, würde ich es gerne hören.
Das Problem ist, dass selbst wenn ein Gefäß nicht zu kompilieren benötigt wird, könnte es zu Laufe benötigt werden. Und dieses "Bedürfnis" könnte transitiv sein. EG: Ein Glas, das Sie verwenden, benötigt ein Glas, das Sie nicht verwenden und nur zur Laufzeit. Wie auch die Art der Laufzeitfehler, sie werden nur angezeigt, wenn Sie versuchen, den Code auszuführen. Im schlimmsten Fall passiert das möglicherweise erst, wenn Sie in der Produktion laufen.
Die beste Lösung, die ich kenne, ist genau das, was Sie nicht tun wollen: "Entfernen Sie ein oder mehrere Gläser, dann kompilieren Sie, um zu testen, ob diese erforderlich sind oder nicht".
Remove -> Test -> entfernen -> Test -> Entfernen -> Hope you :)
Projekt ändern genießen nur jar Sie wollen verwenden Maven und auszuwählen. Für mich ist das der einfachste Weg.
Wie tieTYT in seiner Antwort bemerkt, werden viele Gläser nur zur Kompilierzeit benötigt. (zum Beispiel jdbc implementation jars)
Ein anderer Ansatz könnte sein, einen Java-Agenten zu schreiben und alle Klassennamen zu sammeln. Sie können diese Klassennamen dann zu jar zuordnen und prüfen, ob keine Jars benötigt werden.
Beispiel-Agent
package com;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
public class NameAgent {
public static void premain(String agentArgs, Instrumentation inst) {
inst.addTransformer(new Tranformer(), true);
}
static class Tranformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
System.out.println("loading-class:" + className);
return classfileBuffer;
}
}
}
build.xml ... für ant
<project name="namedump" default="dist" basedir=".">
<property name="src" value="src"/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
<target name="init">
<mkdir dir="${build}"/>
<mkdir dir="${dist}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${build}" optimize="true" includeantruntime="false"/>
</target>
<target name="dist" depends="compile">
<jar jarfile="${dist}/namecollector.jar">
<fileset dir="${build}"/>
<manifest >
<attribute name="Premain-Class" value="com.NameAgent" />
<attribute name="Can-Redefine-Classes" value="true" />
<attribute name="Can-Retransform-Classes" value="true" />
</manifest>
</jar>
<pathconvert property="absdist" dirsep="/">
<path location="${dist}"/>
</pathconvert>
<echo>
To use, add the following to the JVM command-line options.
-javaagent:${absdist}/namecollector.jar
</echo>
</target>
<target name="clean">
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
Einen weiteren Ansatz, den wir in Fenstern versuchen die Tatsache, wurde mit, dass die Gläser verschlossen werden, wenn Klassen geladen werden. Führen Sie die Anwendung aus, und versuchen Sie, aus dem Laufzeitbereich zu löschen. Wenn es verwendet wurde, sollte Löschen fehlschlagen. Nicht sicher, wie sicher das ist - ich weiß, dass es unter Linux nicht funktioniert, die Dateien können ohne Probleme gelöscht werden.
Danke für Ihre Antwort, werde es beim nächsten Mal versuchen! – flowerpot
- 1. Nicht verwendete Lokalisierungen aus APK entfernen
- 2. Entfernen Sie nicht verwendete Materialien aus 3DS-Max Meshes
- 3. Entfernen Sie nicht verwendete Schriftart Awesome Symbole
- 4. Wordpress Theme - entfernen Sie nicht verwendete CSS
- 5. Python: So erkennen Sie nicht verwendete Pakete und entfernen sie
- 6. Dojo 1.7 benutzerdefinierte Build - So entfernen Sie nicht verwendete Dateien aus dem Freigabeordner
- 7. Unbenutztes Glas aus Eclipse Projekt entfernen
- 8. Wie kann ich nicht verwendete CSS-Klassen aus meinem Website-Projekt entfernen?
- 9. So entfernen Sie Kakaoschoten vollständig aus dem Projekt?
- 10. Wie entfernen Sie einmal verwendete Klassenvariablen aus Objective-C-Code?
- 11. Machen Sie Eklipse entfernen nicht verwendete Importe, aber nicht gelöst
- 12. So entfernen Sie nicht verwendete Ansicht von Eclipse RCP-Anwendung
- 13. Wie aus Palette in ImgeEN nicht verwendete Farbe entfernen
- 14. Entfernen Sie leere Zeilen aus Xcode-Projekt
- 15. XSL - kopieren Elemente, sondern entfernen Sie nicht verwendete Namespace (s)
- 16. Finden Sie nicht verwendete Klassen in einem .net-Projekt
- 17. Wie kann man das Passwort aus dem SSIS-Projekt entfernen?
- 18. Fügen Sie Gläser zum Grails-Projekt hinzu, das Ivy
- 19. Entfernen Sie nicht verwendeten Code/Dateien aus dem Projekt in Xamarin Studio
- 20. Git - Entfernen Sie Commit aus dem Verlauf
- 21. Entfernen Sie Schlüssel aus dem Wörterbuch
- 22. Wie finden wir Orphan Gläser in Intellij Idee Projekt
- 23. Entfernen Sie ähnliche Objekte aus dem Array
- 24. SBT nicht verwaltete Gläser
- 25. Helm & Projektil: Wie ein Projekt aus dem Projektil zu entfernen
- 26. Entfernen Sie stdClass Objekte aus dem Array
- 27. Entfernen Sie alle Fragmente aus dem Container
- 28. Entfernen Sie die Erweiterung aus dem Schlüssel
- 29. Artikel nicht aus dem Einkaufswagen entfernen
- 30. Suchen Sie nicht verwendete Funktion in Vc2008?
Tattle Märchen Regeln –
cool, danke für den Vorschlag. Können Sie ein kleines Beispiel dafür geben, wie Sie es verwenden? –
Kann Tattletale außerhalb von JBOSS verwendet werden, zum Beispiel mit Tomcat? – user7294900