Klassen samt Methoden aus Jar-Archiv laden macht Problem

Status
Nicht offen für weitere Antworten.
T

Tomtom

Gast
Hallo

Ich habe folgendes Problem: ich beschäftige mich seit einigen Tagen damit, aus Jar-Archiven die Klassen auszulesen und mir alle deklarierten Methoden auszugeben. Folgender Code funktioniert, sofern das Jar-Archiv folgende Struktur hat:

test.jar:

.
..
Conf2.class

Eine Programmausführung bringt folgende Ausgabe:


Conf2.class
Methode: m_itemread
Methode: configread
Methode: configwrite


...eine korrekte Ausgabe wie ich sie mir wünsche.

Doch sobald sich die Klassen in einem Unterverzeichnis befinden, funktioniert die Methode zum Auslesen der Klassenmethode nicht mehr. Die ausgelesenen Klassen werden aber angezeigt, korrekt inklusive jar-Ordner-Struktur.

Archiv:
jelly.jar

.
..
sunw/demo/jelly/JellyBean.class

Ausgegebener Fehler: java.lang.NoClassDefFoundError: Illegal name: sunw/demo/jelly/JellyBean

Der Quellcode:
Loader.java

Code:
package beacon;

import java.lang.reflect.Method;
import java.net.*;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.io.File;

public class Loader {
	
	private String[] klassen;
	private String[] methoden;
	private File archiv;
	private String klasse;
	private String s;
	private int k;
	static int p;

	public String[] klassenlesen(File f) {
       	try {
      		JarFile jar = new JarFile(f);
      		Enumeration jarcontent = jar.entries();
      		k =jar.size();
      		String[] jarObject = new String[k];
      		klassen = new String[k];
      		for (int i=0;jarcontent.hasMoreElements();i++) {
      				jarObject[i]=jarcontent.nextElement().toString();
      				
      				if (jarObject[i].endsWith(".class")) {
      					klassen[p]= jarObject[i];
      					System.out.println(klassen[p]);
      					p++;
      				}
      		}
      	}
   	    catch (Exception e) {
   	    	System.out.println("nix ging "+e.getMessage());
   	    }
   	    return klassen;
	}
	
	public Loader(String archive) {
                 //methode "klassenlesen" wird gestartet, dafür wird das archiv in form des pfadnamens übergeben
		archiv = new File("D:\\Test\\Test.jar");
		klassen = klassenlesen(archiv);
		for (int i=0;i<p;i++) {
			try {		
	       		
                        //jar-archivename wird hier an classloder übergeben
                        ClassLoader loader = new URLClassLoader(new URL[] {new URL(archive)});
                        //das ".class" wird abgeschnitten
	       		String klasse = klassen[i].substring(0,klassen[i].length()-6);
                        //und die methoden ausgelesen
	       		Class klass = loader.loadClass(klasse);
				Method[] m = klass.getDeclaredMethods();
		 		String [] Methoden = new String[m.length];
		 		
		 		for (int j=0; j<m.length; j++){
		 			Methoden[j]=m[j].getName();
		 			System.out.println("Methode: "+Methoden[j]);
		 		}
	       	}
		    catch (Exception e) {
		    	System.out.println("nix ging "+e.getMessage());
		    }
		}
	}
	
	public static void main(String[] args) throws Exception {
		Loader loader = new Loader("jar:file:/D:/Test/Test.jar!/");
	}
}


System:
Windows XPSP1, JAVA RE 1.4.2, Eclipse 3.0

Wo liegt mein Problem? Auch die direkte Angabe "jar:file:/D:/Test/Test.jar!/sunw/demo/jelly/JellyBean" für meinen "loader" bringt nichts

Viel Danke für Eure Hilfe!

PS: Weder die Java API noch das Forum noch Google konnten mir weiterhelfen.
 

thE_29

Top Contributor
Du machst die Zeile hier mal :)

Code:
ClassLoader loader = new URLClassLoader(new URL[] {archiv.toURL()});

Du hast nämlich immer 2 verschiedene archiv und archive und da ist dein Fehler!!

Bei mir gehts jetzt auf jeden Fall, vorher gings auch net!


Achja, und das archiv ist das von wo er liest, und net das was du im main übergibst!! (du kannst ganz normal D:\\bla\\bla.jar)
 
T

Tomtom

Gast
Halle thE_29,

erstmal einen Dank für deine rasche Antwort.

Das ich einmal "archiv" und einmal "archive" benutze ist nur eine provisorische Lösung gewesen und meines Erachtens hat es nichts mit dem Problem zu tun. Bei Jar-Archiven, in denen die ".class" nicht in Unterordner sind funktioniert ja alles.

Wenn ich deine Zeile mit meiner ClassLoader - Zeile ersetze, ändert das bei mir leider nichts, der selbe Fehler. (ermacht ja nun aus dem Pfad "D:\\Test\\jelly.jar" eine URL, die URL, die ich in der "main" übergeben hat dann ja keine Nutzen mehr. Hab den Code mal umgeschrieben, so wie du es dir sicher gedacht hast und ich verstanden habe:

Code:
public Loader() {
		archiv = new File("D:\\Test\\jelly.jar");
		klassen = klassenlesen(archiv);
		for (int i=0;i<p;i++) {
			try {		
	       	 	ClassLoader loader = new URLClassLoader(new URL[] {archiv.toURL()});
	       		String klasse = klassen[i].substring(0,klassen[i].length()-6);
	       		Class klass = loader.loadClass(klasse);
				Method[] m = klass.getDeclaredMethods();
		 		String [] Methoden = new String[m.length];
		 		
		 		for (int j=0; j<m.length; j++){
		 			Methoden[j]=m[j].getName();
		 			System.out.println("Methode: "+Methoden[j]);
		 		}
	       	}
		    catch (Exception e) {
		    	System.out.println("nix ging "+e.getMessage());
		    }
		}
	}
	
	public static void main(String[] args) throws Exception {
		Loader loader = new Loader();
	}

Wie gesagt: die selbe Fehlermeldung wie bisher. Hab ich dich etwa doch falsch verstanden ?

Grüße,
Tomtom
 

thE_29

Top Contributor
Also bei mir gehts!

Code:
 public Loader(String archive) {
                 //methode "klassenlesen" wird gestartet, dafür wird das archiv in form des pfadnamens übergeben
      
       archiv = new File("C:\\tmp\\jDstore.jar");
      klassen = klassenlesen(archiv);
      for (int i=0;i<p;i++) {
         try {      
                
                        //jar-archivename wird hier an classloder übergeben
                        ClassLoader loader = new URLClassLoader(new URL[] {archiv.toURL()});
                        //das ".class" wird abgeschnitten
                String klasse = klassen[i].substring(0,klassen[i].length()-6);
                        //und die methoden ausgelesen
                
                
                Class klass = loader.loadClass(klasse);
                //Class klass = Class.forName(klasse,true,loader);
            
                Method[] m = klass.getDeclaredMethods();
                System.out.println("Suche Methoden aus der Klasse::  " + klasse);
                String [] Methoden = new String[m.length];
             
             for (int j=0; j<m.length; j++){
                Methoden[j]=m[j].getName();
                System.out.println("Methode: "+Methoden[j]);// + " "  + m[j].getDeclaringClass());
             }
             }
          catch (Exception e) {
              e.printStackTrace();
             //System.out.println("nix ging "+e.getMessage());
          }
      }
   }


Teilauszug:

Suche Methoden aus der Klasse:: at/dstore/PCalendar/PosDatum
Methode: getMonth
Methode: getDay
Methode: checkDate
Suche Methoden aus der Klasse:: at/dstore/PConnection/ControlCall
Methode: sendStatus
Methode: sendCmd
Methode: sendQuery
Suche Methoden aus der Klasse:: at/dstore/PConnection/ControlLevel
Suche Methoden aus der Klasse:: at/dstore/PConnection/ControlLogging$1
Methode: accept
Methode: getDescription
Suche Methoden aus der Klasse:: at/dstore/PConnection/ControlLogging
Methode: run
Methode: start
Methode: writeNewLog
Methode: writeNewLog
Methode: writeNewLog
Methode: writeNewLog
Methode: closeLogFile
Methode: writeLog
Methode: writeLog
Methode: initLogger
Methode: SetAndReceiveData
Methode: SetAndReceiveData
Methode: identifyException
Methode: initLevels
Methode: getLevel
Methode: DelOldLck
Suche Methoden aus der Klasse:: at/dstore/PConnection/DataAccess
Methode: sendAnfrage
Methode: doAnfrage
Methode: doAnmeld
Methode: doAbmeld
Suche Methoden aus der Klasse:: at/dstore/PConnection/DlgCore
Methode: windowActivated
Methode: windowClosed
Methode: windowClosing
Methode: windowDeactivated
Methode: windowDeiconified
Methode: windowIconified
Methode: windowOpened
Methode: actionPerformed
Methode: waitButton
Suche Methoden aus der Klasse:: at/dstore/PConnection/EljoBo
Methode: print
Methode: writeEljoBO
Methode: writeEljoBO
Methode: writeEljoBO
Methode: getProgNr
Methode: writeLogin
Methode: writeLogout
Methode: writeFkt
Methode: writeToT_h1
 
T

Tomtom

Gast
Hmm das ist komisch...

Kannst du mir evtl das .jar File Schicken, welches du dazu benutzt hast, um es nachvollziehen zu können? Dann würde ich dir mal das jelly.jar schicken, damit du evtl. probieren könntest. Sonst komm ich im Moment keine Schritt voran. Ich würde mich freuen wenn du dazu Zeit hast und das möglich wäre. Mein email ist netzchaot@freenet.de.
 

thE_29

Top Contributor
Ich kann dir das Jar-File net schicken, da das von der Fa ist ;)

Aber du kannst mir deins schicken und ich kanns mir ansehen!

Ich mail dir mal und ich probier obs mit anderen auch geht!
 
T

Tomtom

Gast
Die Lösung liegt in den Zeilen:

Code:
String klasse_tmp = klassen[i].substring(0,klassen[i].length()-6);
String klasse = klasse_tmp.replace( '/', '.' );

Die Unterverzeichnisse im jar-Archive werden durch "/" getrennt. Die Methoden können aber nur aus Klassen mit folgender Syntax gelesen werden: dir.subdir.subsubdir.Klasse (Klasse ohne ".class")

Hier nochmal der komplette Code für eine Java-App, welche alle deklarierten Methoden aus Klassen eines Jar-Archivs liest.

Code:
import java.lang.reflect.Method;
import java.net.*;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.io.File;

public class Loader {
	
	private String[] klassen;
	private String[] methoden;
	private File archiv;
	private String klasse;
	private String s;
	private int k;
	static int p;

	public String[] klassenlesen(File f) {
       	try {
      		JarFile jar = new JarFile(f);
      		Enumeration jarcontent = jar.entries();
      		k =jar.size();
      		String[] jarObject = new String[k];
      		klassen = new String[k];
      		for (int i=0;jarcontent.hasMoreElements();i++) {
      				jarObject[i]=jarcontent.nextElement().toString();
      				
      				if (jarObject[i].endsWith(".class")) {
      					klassen[p]= jarObject[i];
      					//System.out.println(klassen[p]);
      					p++;
      				}
      		}
      	}
   	    catch (Exception e) {
   	    	System.out.println(e.getMessage());
   	    }
   	    return klassen;
	}
	
	public Loader(String jar) {
        //methode "klassenlesen" wird gestartet, dafür wird das archiv in form des pfadnamens übergeben
		archiv = new File(jar);
		klassen = klassenlesen(archiv);
		for (int i=0;i<p;i++) {
		try {     
			//jar-archivename wird hier an classloder übergeben
			ClassLoader loader = new URLClassLoader(new URL[] {archiv.toURL()});
			//das ".class" wird abgeschnitten
			String klasse_tmp = klassen[i].substring(0,klassen[i].length()-6);
			//zur korrekten Abarbeitung müssen alle "/" durch "." ersetz werden
			String klasse = klasse_tmp.replace( '/', '.' ); 
			//und die methoden ausgelesen
			Class klass = loader.loadClass(klasse);
			//Class klass = Class.forName(klasse,true,loader);
			Method[] m = klass.getDeclaredMethods();
			System.out.println("Suche Methoden aus der Klasse::  " + klasse);
			String [] Methoden = new String[m.length];
    
			for (int j=0; j<m.length; j++){
				Methoden[j]=m[j].getName();
				System.out.println("Methode: "+Methoden[j]);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}	
	}
}
	
	public static void main(String[] args) throws Exception {
		Loader loader = new Loader("D:\\pfad\\archive.jar");
	}
}
 

thE_29

Top Contributor
Mh, da stellt sich die Frage warum das bei mir immer ging ;>


Ich habe die replaceAll Funktion einmal eingebaut und dann wieder raus, aber anscheinend hat er er es immer mit dem gemacht, als ich nämlich den Source komplett neu geschrieben habe, gings auch nicht mehr ^^

Anscheinend hat er den 1en Teil der Klasse nie neu erstellt ;>

Tjo, hoffe jetzt gehts auch bei dir!
 
T

Tomtom

Gast
Welche JRE Version hast du benutzt ? Bei mir ist es die 1.4.2_06.
 

thE_29

Top Contributor
Ahhhhhhh!!!

Habe heute, bzw vor deinem letzten mail ein update gemacht auf die 1.4.2_06 ;)

Anscheinend gehts nur bei der net :)



Nachtrag: (wieder zurückgestellt und es geht..)
Manchmal frage ich mich, ob Sun nur noch Idioten einstellt! Nach jedem Update gehn ein paar Sachen oder nima gscheit (siehe Java 5).

Saufen die den ganzen Tag nur noch??
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
8u3631984 Jacoco Testcoverage bei Abstracten Klassen in verschachtelten Modulen Allgemeine Java-Themen 6
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
N abstracte klassen methoden Allgemeine Java-Themen 32
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
B Problem mit meinen Klassen Allgemeine Java-Themen 6
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
F Code in Klassen bringen Allgemeine Java-Themen 4
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
F Klassen Verwendung abstrakter Klassen Allgemeine Java-Themen 9
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
D Klassen JLabels in anderen Klassen verwenden. Allgemeine Java-Themen 7
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
cool_brivk24 Klassen Klassen Aufruf Fehlgeschlagen Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Klassen Abstrakte Klassen Allgemeine Java-Themen 5
T Log4J - Deaktivierung für einzelne Klassen Allgemeine Java-Themen 7
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
Sin137 Struktur der Klassen & Package Allgemeine Java-Themen 2
G Klassen und interne Klassen Allgemeine Java-Themen 1
S Klassen übergeben Allgemeine Java-Themen 13
C Klassen und Konstruktor Allgemeine Java-Themen 2
S Classpath Wie kann ich Java-Library Klassen "verstecken"..? Allgemeine Java-Themen 4
A Java speech - 2 Klassen Allgemeine Java-Themen 1
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
V Klassenname von allen Klassen mit einer bestimmten Eigenschaft bekommen Allgemeine Java-Themen 2
B Classpath Eclipse findet importierte Klassen nicht Allgemeine Java-Themen 1
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
C Arten von Klassen Allgemeine Java-Themen 3
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
J C++ Projekt (QT) in Java mit Klassen (nicht imperativ) nutzen (BridJ? JavaCPP? SWIG? JNA? JNI?) Allgemeine Java-Themen 2
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
S Polymorphie Polymorphismus bei Abstrakten Klassen Allgemeine Java-Themen 2
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
S Kapselung Statische Helper Klassen Allgemeine Java-Themen 5
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
N Java Klassen mit ID Allgemeine Java-Themen 21
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
S JPA und Entity-Klassen: Wert ungültig Allgemeine Java-Themen 6
M OO / Klassen / Projektstruktur Allgemeine Java-Themen 5
O Klassen werden nicht importiert Allgemeine Java-Themen 3
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
A Klassen und JLabel's Allgemeine Java-Themen 12
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
E instanceof mit nicht öffentlichen Klassen Allgemeine Java-Themen 2
D Datentypen Typbestimmung unbekannter Wrapper-Klassen Allgemeine Java-Themen 5
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
N Vergleich eigener Klassen Allgemeine Java-Themen 5
M Klassen Array aus Klassen bestimmter Klassen ? Allgemeine Java-Themen 11
C OOP Klassen mit "Eigenschaften" Allgemeine Java-Themen 10
H Klassen kommunizieren lassen Allgemeine Java-Themen 3
A Problem bei Serialisierung von Bibliotheks-Klassen Allgemeine Java-Themen 6
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
T Classpath Klassen dynamisch erstellen Allgemeine Java-Themen 4
I Klassen Klassen-/Objektinteraktion Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben