Feststellen, Welche Classes ich aus einem JAR nutze?

PFEdi

Mitglied
Hallo,

Ich frage mich gerade, ob es eine einfache Möglichkeit gibt, in einem Java Projekt (Maven, JDK 1.8) für eine JAR fest zu stellen, welche Klassen (oder eigentlich auch andere Ressourcen) ich nutze?

Als Ideen fallen mir dazu ein:
  1. Ich entferne die dependency aus meinen POM.xml -> Die IDE informiert mich wenn sie da was nicht auflösen kann -> ich sehe daher was fehlt.
    1. Problem 1: Können IDEs sowas
    2. Problem 2: Funktioniert das dann auch bei Transitiven Abhängigkeiten
  2. Ich entferne die dependency aus meinen POM.xml -> Ich baue das Projekt -> der build schlägt fehl, weil nicht alle Abhängigkeiten da sind
    1. Problem 1: geht wohl nur bei build dependencies -> sonst muss ich zur Laufzeit schauen wo es Brösel gibt.
  3. Ich entpacke das JAR -> erstelle eine Liste aller resourcen -> durchsuche meinen Code Danach
    1. Problem 1: Ich muss das mim Suchen auf jedenfall automatisieren weil sonst ist das ziemlich aufwändig.
    2. Problem 2: Das klappt wohl auch nur bei direkten Abhängigkeiten, nicht bei Transitiven
Gibt es noch andere Möglichkeiten?
Können das gängige IDEs? wenn ja wie?

Andere Folge Frage -> Kann ich zu einer Klasse im Code feststellen aus welchem JAR sie ist?


Ich hoffe ich habe mich klar ausgedrückt :)
 

mihe7

Top Contributor
Andere Folge Frage -> Kann ich zu einer Klasse im Code feststellen aus welchem JAR sie ist?
Du kannst Java mit dem Flag -verbose starten, dann bekommst Du eine Auflistung aller geladenen Klassen. Zusammen mit grep bzw. find kannst Du also relativ einfach feststellen, wo eine Klasse herkommt:
java -verbose ... | grep "Klassenname" (bzw. unter Windows statt grep ggf. find verwenden)

Das Ergebnis sieht dann z. B. so aus:
Code:
[0.885s][info][class,load] com.github.mihe7.services.HelloForumGreeter source: file:/C:/Projekte/junk/forum/services/target/services-1.0-SNAPSHOT.jar
Die Klasse com.github.mihe7.services.HelloForumGreeter wurde also aus C:/Projekte/junk/forum/services/target/services-1.0-SNAPSHOT.jar geladen.
 

Oneixee5

Top Contributor
Ich frage mal: Wozu brauchst du das? Das Risko, dass es zu Laufzeitfehlern kommt ist nicht unerheblich. Es gibt ja auch die Möglichkeit native Images zu erstellen. Dabei wird ja schon komprimiert und optimiert. Ich sehe da für eine eigene Implementierung eig. keinen Bedarf.
 

KonradN

Super-Moderator
Mitarbeiter
Also generell ist das auch in meinen Augen bedenklich.
a) Gute Idee von @mihe7: Du siehst nur, was die aktuelle Ausführung benutzt hat. Aber da gilt dann die 80/20 Regel: 80% der Zeit ist der Code nur in 20% des Codes. Bei einer Ausführung ist also unklar, ob Du wirklich alle Abhängigkeiten auch wirklich benutzt hast. Die Gefahr ist also schon sehr groß, dass dann etwas fehlt.

b) was willst Du erreichen? Du sparst wenige Byte bis KB - mit hohem Risiko, dass etwas nicht geht? Da gibt es die Regel zu Optimierungen: Mach keine Optimierungen! (Und wenn Anforderungen nicht eingehalten werden, dann analysiere erst einmal, woran es liegt, bekomme die Problem-Stellen mit und finde dann saubere Lösungen!). Wenn Platz kritisch ist, dann ist evtl. GraalVM mit Native-Image eine Option, bei der Code native übersetzt wird. Nur um eine Option zu nennen.

c) Bei Ressourcen ist auch immer die Frage, was Du genau erreichen willst. Die Ressourcen weg zu lassen kann schnell Konsequenzen haben, die Du ggf. nicht mitbekommst. Die können ja durchaus optional geladen werden, z.B. nur, wenn eine bestimmte Sprache angezeigt werden soll oder wenn spezielle Datenbank-Updates erforderlich sind oder so.

Hier ist es also sehr wichtig, sich die Kosten und den Nutzen anzusehen. Was willst Du genau erreichen? Und was für Risiken gehst Du dabei ein?

Ansonsten zum Punkt: Feststellen, woher eine Klasse kommt: Entwicklungsumgebungen bieten in der Regel eine "Go to Implementation" Möglichkeit. Dann bekommst Du die Klasse angezeigt. Entweder direkt im Source wenn Du das mit herunter geladen hast oder es wird dekompiliert.
 

mrBrown

Super-Moderator
Mitarbeiter
Auch eine Möglichkeit ist, einen Baum an Referenzierten Klassen aufzubauen, startend mit deinen kompilierten Klassen. Nutzbar ist dafür z.B. Jandex.

Problem aber auch hier: du findest nur statische Referenzen, alles was dynamisch (zB mit Serviceloader oder Reflection) läuft, übersiehst du damit. Je nachdem was man vorhat ist es aber potentiell als Ausgangspunkt nutzbar.
 

Neumi5694

Top Contributor
Ich frage mal: Wozu brauchst du das? Das Risko, dass es zu Laufzeitfehlern kommt ist nicht unerheblich. Es gibt ja auch die Möglichkeit native Images zu erstellen. Dabei wird ja schon komprimiert und optimiert. Ich sehe da für eine eigene Implementierung eig. keinen Bedarf.
Und dabei werden ungenutzte Abhängigkeiten entfernt? Cool, wusste ich nicht. Muss ich mal probieren. Ich bin mir sicher, dass ich ein paar der früher genutzten Netty-Jars weglassen könnte.
 

Oneixee5

Top Contributor
Well, one way to check for missing dependencies is to remove the dependency from your POM.xml file and let the IDE inform you if it cannot resolve something. This should work for both direct and transitive dependencies. However, this approach may not be comprehensive, as it only checks for missing dependencies that are directly referenced in your code.
thanks
... extra einen Nutzer für nervige ChatGPT-Antworten angelegt - sinnlos.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
Speed FariyDragon Startsituation des Programms Feststellen Allgemeine Java-Themen 1
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
S Suche Konzept: Korrektheit des Aufrufers feststellen Allgemeine Java-Themen 7
S Applet nicht signierte Komponenten feststellen Allgemeine Java-Themen 6
P Java Heap Size feststellen Allgemeine Java-Themen 6
S File encoding feststellen Allgemeine Java-Themen 4
S Maximalen und maximal verfuegbaren RAM feststellen? Allgemeine Java-Themen 4
T Feststellen ob System-Konsole verfügbar Allgemeine Java-Themen 2
R Feststellen, ob String in einem String vorkommt. Allgemeine Java-Themen 5
I JMF - feststellen wenn mp3 aus Allgemeine Java-Themen 10
T Feststellen ob kein extra Thread läuft Allgemeine Java-Themen 10
T läuft mein Programm schon? - wie feststellen Allgemeine Java-Themen 6
H Systemfarben feststellen Allgemeine Java-Themen 4
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
A Wie das OS und Sprache feststellen? Allgemeine Java-Themen 15
M Objekt ID feststellen! Allgemeine Java-Themen 3
N Wie kontakt von 2 gezeichneten Rechtecken feststellen? Allgemeine Java-Themen 25
S Aufrufende Klasse feststellen, ohne "this"-Paramet Allgemeine Java-Themen 7
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
H Apache fop -- welche Möglichkeit gibt es um den Fortschritt anzuzeigen (Progressbar) Allgemeine Java-Themen 5
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
F Java Web App - welche Technologien? Allgemeine Java-Themen 11
S Welche API? Allgemeine Java-Themen 6
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
K Welche Zertifizierung passt? Allgemeine Java-Themen 10
A Variable, welche Exeption wirft als "Global" deklarieren Allgemeine Java-Themen 13
J Videokonferenz mittel Java ? Welche Möglichkeiten habe ich ? Allgemeine Java-Themen 2
J Welche Layouts benutzt ihr? Allgemeine Java-Themen 2
G Wiedereinstieg, welche Java Version empfehlt ihr Allgemeine Java-Themen 7
M Welche Exceptionbehandlung ist sinnvoll? Allgemeine Java-Themen 3
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
S Welche Java Techologien gibt es fürs Frontend Allgemeine Java-Themen 4
S Welche Nutzen bringen Lamda Expressions? Allgemeine Java-Themen 1
M Welche Umgebung und Frameworks für mich als Umsteiger Allgemeine Java-Themen 6
C Welche Styleconvention Allgemeine Java-Themen 0
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
F Welche Systeme für hoch skalierbare Webanwendung? Allgemeine Java-Themen 7
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
G Welche Datenstruktur? Allgemeine Java-Themen 19
I Webseite auslesen (welche mittels Javascript Inhalt einbindet) Allgemeine Java-Themen 4
R Welche waren eure ersten Projekte? Allgemeine Java-Themen 10
G Wie kann man sehen, welche Applikationen mit java arbeiten? Allgemeine Java-Themen 17
L Social Media Webportal -> Welche Technologie (JEE, GWT) Allgemeine Java-Themen 8
J Welche Informationen werden beim Kompilieren gespeichert? Allgemeine Java-Themen 3
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
I Swing Welche Swing Komponente soll ich nehmen? Allgemeine Java-Themen 2
vladimir Welche API für Grafik und Drag&Drop Allgemeine Java-Themen 3
schlingel Plugin-Architektur - Welche nehmen? Allgemeine Java-Themen 6
U Welche 2D-API? Allgemeine Java-Themen 4
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
M Welche Dateiformate kann Java einlesen?? Allgemeine Java-Themen 26
E Neues Projekt - Welche GUI / IDE /Techniken / etc. Allgemeine Java-Themen 14
E Welche Icons für sichtbar /unsichtbar Allgemeine Java-Themen 2
J Welche Lösung für Servlets und JSPs in Eclipse? Allgemeine Java-Themen 5
N Für welche Art von Berechnungen macht JCUDA Sinn? Allgemeine Java-Themen 12
A Welche Exception verwenden? Allgemeine Java-Themen 2
T Welche Art von Hilfe?? Allgemeine Java-Themen 5
N welche run.bat? Allgemeine Java-Themen 3
R Assoziativer Speicher welche Unterschiede? Allgemeine Java-Themen 5
Developer_X Welche Dateien kann Java laden? Allgemeine Java-Themen 9
G Welche Schreibeweise ist richtig Allgemeine Java-Themen 16
ARadauer welche java version wird benutzt Allgemeine Java-Themen 4
E Welche Java-Version kennt isEmpty() ? Allgemeine Java-Themen 2
F Welche dicken Java-Bücher kennt ihr? Allgemeine Java-Themen 31
M Prüfen, welche anderen Programme laufen Allgemeine Java-Themen 5
K [erledigt] JVM welche läuft Allgemeine Java-Themen 9
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
E welche standalone Version von Tomcat benutzen? Allgemeine Java-Themen 6
S Welche Speicherung von Daten bei Kalendarfunktion der jtable Allgemeine Java-Themen 7
F welche Datenstruktur? Allgemeine Java-Themen 9
P welche jar enthält was? Allgemeine Java-Themen 5
F Welche Datenstruktur Allgemeine Java-Themen 2
V Welche Oberfläche empfehlt ihr mir? Allgemeine Java-Themen 19
Z Welche Datenstruktur verwende ich h_ier bloss ? Allgemeine Java-Themen 14
S Welche jar's werden wirklich benötigt?` Allgemeine Java-Themen 5
G Dateien löschen welche vor heute erstellt wurden? Allgemeine Java-Themen 7
G Prüfen welche JRE-Version gebraucht wird Allgemeine Java-Themen 19
I Welche Möglichkeiten bietet Java um Records in Dateien zu sp Allgemeine Java-Themen 10
B Drucken - welche Bibliothek favorisiert Ihr? Allgemeine Java-Themen 16
J Welche Daten für Ative-X Funktion? Allgemeine Java-Themen 5
P welche java version für javax.mail? Allgemeine Java-Themen 7
B Erkennen welche Objekte den Heap verbrauchen? Allgemeine Java-Themen 2
B Welche Java-Version? Allgemeine Java-Themen 7
S Welche Javaversion ist in meinem Linux? Allgemeine Java-Themen 2
M 2 Javaversionen welche aktiv? Allgemeine Java-Themen 3
C Datumsfelder auslesen - egal welche Zeitzone Allgemeine Java-Themen 2
F SuppressWarnings("xxx") - welche Möglichkeiten gib Allgemeine Java-Themen 4
R Welche Exception bei write() nehmen Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
S Welche Datenstruktur passt bei mir? Allgemeine Java-Themen 6
D Welche Datenstruktur? Allgemeine Java-Themen 2
B Grafische Oberfläche - Welche Komponenten? Allgemeine Java-Themen 5
T JMF, welche Codecs gibts, und vor allem, wo? Allgemeine Java-Themen 9
H Welche Scriptsprache verwendet ihr in Java Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben