2017-02-10 1 views
1

Ich muss analysieren, welche Klassen (referenziert) von den verschiedenen .class Dateien in einem Glas verwendet werden. Ich weiß, dassjdeps entspricht für Java 7

jdeps -v example.jar 

produziert diese Ausgabe. Leider brauche ich eine Lösung, die funktioniert, wenn der Benutzer nur ein JDK 1.7 hat. Wie könnte dies erreicht werden?

+0

Ich denke, technisch könnte man das tun mit 'javap -v' oder' -c', aber erfordert ein JDK8 scheint wie die gesunde Option – Aaron

+0

Werfen Sie einen Blick auf die Antworten im folgenden Thread https://StackOverflow.com/questions/4326407/analyze-jar-Abhängigkeiten-in-einem-Java-Projekt – SubOptimal

+0

@Aaron Die Benutzer des Programms sind die Entwickler in unserer Firma, die Java 8 nicht verwendet. Ich kann nichts dagegen tun. –

Antwort

2

Ich konnte mit javap -c und einem Regex-Filter scheinbar gute Ergebnisse erzielen.

Ich verwendete cygwin, um meine Ergebnisse zu erhalten, aber Sie sollten in der Lage sein, dies in jeder Umgebung zu tun, alles, was Sie brauchen, ist ein Tool zum Entpacken, javap und ein Werkzeug zum Ausführen von regulären Ausdrücken. In aktuellen Windows-Versionen würde powershell diese Funktionen bereitstellen.

Der folgende Code wird die Klassen von jeder Klasse in einer JAR-Datei referenziert Liste:

mkdir workDir 
unzip yourJar.jar -d workDir 
shopt -s globstar 
for classFile in **/*.class; do 
    echo "Classes used in $classFile :" 
    javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*" | sort -u 
    echo 
done 

Sie sagten, Sie die Klassen in einer jar Datei referenziert wollte, so dass Sie die einzelnen nicht vorausgesetzt wollen Klasse sollte diese Arbeit:

mkdir workDir 
unzip yourJar.jar -d workDir 
shopt -s globstar 
for classFile in **/*.class; do 
    javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*" 
done | sort -u 

Beachten Sie, dass diese Klassen verpassen, die Konventionen nicht folgen, zum Beispiel, die in dem Standard-Paket definiert sind, oder dessen Name nicht mit einem Großbuchstaben beginnen.

Sie werden auch Klassen abrufen, deren qualifizierter Name mit einer L beginnt: Dies stellt Arrays dar, und Sie möchten vielleicht L löschen, wenn Sie nur an dem Klassennamen interessiert sind. Es gibt noch andere ähnliche Modifizierer für einzelne Buchstaben, an die ich mich nicht erinnern kann.

+0

Danke, das scheint zu funktionieren. –

+0

@JFMeier sei vorsichtig, ich habe es nicht ausgiebig getestet und der Java-Spezifikation nicht gefolgt, ich bin mir ziemlich sicher, dass es zumindest in einigen Fällen fehlen muss – Aaron

1

Verwenden Sie den JD Java Decompiler (http://jd.benow.ca/).

+0

Ich hätte mir das definitiv angeschaut, wenn es nicht von unserem Firmennetzwerk als "Streaming Media/MP3" blockiert wäre ;-) –

+0

Ich weiß nicht wieso das der Fall wäre. Es gibt auch einen Verweis auf die Website von Wikepedia. https://en.wikipedia.org/wiki/Java_Decompiler. Vielleicht könnten Sie Ihre Netzwerk-Leute bitten, sich damit zu beschäftigen. – Jool

+0

Ich habe aufgehört zu fragen, warum einige Websites blockiert sind und einige nicht ... –

1

Eine alternative Lösung ist ein JDK1.8 auf einem zugänglichen Netzlaufwerk und dort anrufen. Dies funktioniert sogar, wenn das lokale JDK 1.7 ist.