Klasse aus Jar File laden

Status
Nicht offen für weitere Antworten.

PowerPaul

Mitglied
hi,

ich braeuchte recht dringend hilfe bei einem problem. zum theman jar file gibts hier war schon viel aber ich finde keine gute loesung fuer mein problem.

ich habe halt ein groeßeres program in welchen auch per classloader klassen geladen werden. das funktioniert so auch alles gut. nur soll das ganze jetzt als jar file verpackt werden und sobal das der fall ist werden die klassen welche per loeader aus einem package geladen werden nichtmehr geladen.

kann ich irgentwie dafuer sorgen das das program bei der pfad angabe vom jar file ausgeht?
ich habe mir schon ueberlegt die ganzen klassen einfach in einen temp ordner zu entpacken. nur finde ich dazu keine java methode (wobei ich eigentlich davon ausgehe das es sowas gibt, wenn ja , welche methode?) und ist das auch doof weil mein jar file dan nicht mehr umbenant werden kann. (den pfad in welchen sich das file befindet bekomme ich ja leicht ueber system raus. )

einfach so etwas geht sicher nicht, oder: c:\foo\bar.jar\klasse1.class ? also java sagen das es jar files einfach wie ordner behandeln soll?

Code:
public class Loader<A> {

	private A newInstance(String path, String classname) throws Exception 
	{
		URL url = new File(path).toURL();
		URLClassLoader cl = new URLClassLoader(new URL[] { url });
		Class<A> c = (Class<A>) cl.loadClass(classname);
		return c.newInstance();
	}
	
		
	public ArrayList<A> getAllClasses(String dir)
	{
		File handle = new File(dir);
		
		ArrayList<A> list = new ArrayList<A>();
					
		try{
		
			for(String x : handle.list() )
			{
				if((x.contains(".class")) && !(x.contains("Interface")))
				{
					x=x.replace(".class",""); 
					A temp = newInstance("",dir+"."+x);
					list.add(temp);
				}
						}
				
		}catch(Exception e){};		
	
		return list;	

		
	}
	
}
 

thE_29

Top Contributor
Bevor ich irgendwas unpacken würde, was war dein Ursprungsgedanke?

Du wolltest eine Klasse laden die sich in einem externen Jar File befindet?
 

PowerPaul

Mitglied
Nein, also es ist ein kompletes Program wobei bestimmte funktionen erweiterbar sind indem man einfach eine klasse hinzufuegt die ein bestimmtes interface implementiert. damit man die neuen klassen nicht an allen moeglichen stellen im code eintragen muss, kuckt der loader einfach in ein package rein (des gleichen projektes) und laed dort alles raus was auf .class endet. das funktioniert auch alles darum gehts nicht.

jetzt soll das teil aber als jar datei abgeliefert werden. also muss ich dem loader irgentwie sagen das er in der jar file drin kucken soll. ich geh mal davon aus das genau das bei der pfad angabe nicht funktioniert. daher das er sonstwo kuckt nur nicht im jar file.
 

PowerPaul

Mitglied
thE_29 hat gesagt.:
Klasse JarFile anschauen (such hier im Board oder API)

also respekt , das hat mich jetzt echt weitergebracht, vielen dank.

also das file entpacken und dan auf diesem temp ordner arbeiten geht jetzt. allerdings ist diese losung total schlecht da ich jetzt mein prog nichtmehr von eclipse aus starten kann weil er ja jetzt immer versucht eine jar datei zu entpacken.

hat nicht noch wer einen tip oder link wie ich besser an datei ran komme?
 

thE_29

Top Contributor
Weil du selber ja nicht weißt was du willst..


Willst du jetzt irgendwo hinpacken? Falls ja, ist das die korrekte Antwort!

Willst du es gleich aus dem Jar laden (was ich dich gefragt habe) ist das natürlich net die Antwort..

Du wolltest das ja auch net..


ch habe mir schon ueberlegt die ganzen klassen einfach in einen temp ordner zu entpacken. nur finde ich dazu keine java methode

Mit JarFile geht das!

Frage => Antwort!
 

PowerPaul

Mitglied
thE_29 hat gesagt.:
Weil du selber ja nicht weißt was du willst..


Willst du jetzt irgendwo hinpacken? Falls ja, ist das die korrekte Antwort!

Willst du es gleich aus dem Jar laden (was ich dich gefragt habe) ist das natürlich net die Antwort..

Du wolltest das ja auch net..


ch habe mir schon ueberlegt die ganzen klassen einfach in einen temp ordner zu entpacken. nur finde ich dazu keine java methode

Mit JarFile geht das!

Frage => Antwort!

ich bin der meinung das ich schon recht deutlich gesagt habe das ich AUS DER JAR-FILE laden will. habe doch geschrieben das in der jar das ganze projekt drin steckt.
 

thE_29

Top Contributor
Naja, wenn du mir das mal zeigen kannst, aber hier ein Code

Code:
    File fJar = new File(strJar); //Pfad zur jar Datei halt
    URL url = null;
    try
    {
      //holt sich das jar file in url form
      url = fJar.toURL();
      URLClassLoader urlcl = new URLClassLoader(new URL[] {url});
      String strPackage = "at.jta.bla"; //hier halt das package eintragen was du willst
	  Class clazz = Class.forName(strPackage, true, urlcl);
	  
	  //jetzt könntest du Konstruktoren oder ähnliches laden, ich lade einen Konstruktor OHNE parameter als Bsp
      Constructor cons = null;
      cons = clazz.getConstructor(null); //null heißt er hat keine Parameter, hier müsstest du ein class[] Objekt haben mit den Parametern wenn er welche hat
	  Object instance = cons.newInstance(null); //führt den Konstruktor aus -> mit diesem instance Objekt könntest du jetzt alle Methoden aus der Klasse starten
	}
	catch(Exception ex)
	{
		ex.printStackTrace();
	}
 

Murray

Top Contributor
Wenn ich das richtig verstanden habe, dann möchtest Du zur Laufzeit Klassen laden, die
a) zum gleichen Package gehören wie der aufrufende Code,
b) sich im gleichen Jar-File bzw. (im Falle von einzelnen, nicht in ein Jar-File verpackten Klassen) im gleichen Verzeichnis befinden und
c) deren Namen nicht vorab bekannt sind (offenbar handelt es sich um eine Art Plugin-Konzept)

Dazu muss man ja zunächst wissen, woher der aufrufende Code gerade geladen wurde.
Code:
Class cls = this.getClass();
String clsNam = cls.getName();
String binaryClsNam = clsNam.replace( '.', '/') + ".class";
URL clsURL = ClassLoader.getSystemResource( binaryClsNam);
System.out.println( clsNam + " -> " + binaryClsNam + " -> " + clsURL);

Damit bekommt Du Ausgaben in der Art:
Jar-File: test.Test -> test/Test.class -> jar:file:/C:/home/work/060628/jars/test.jar!/test/Test.class
Class-Files: test.Test -> test/Test.class -> file:/C:/home/work/060628/lib/test/Test.class

Jetzt muss man zwischen beiden Varianten unterscheiden; im Falle von Class-Files ermittelst Du aus der URL das Verzeichnis, in dem Du suchen musst (ähnlich wie bisher)

Beim Jar-File konstruierst Du wie thE_29 vorgeschlagen ein java.util.jar.JarFile-Objekt und kannst dann über dessen entries-Methode die enthaltenen Klassen finden.

HTH
 

PowerPaul

Mitglied
Murray hat gesagt.:
Wenn ich das richtig verstanden habe, dann möchtest Du zur Laufzeit Klassen laden, die
a) zum gleichen Package gehören wie der aufrufende Code,
b) sich im gleichen Jar-File bzw. (im Falle von einzelnen, nicht in ein Jar-File verpackten Klassen) im gleichen Verzeichnis befinden und
c) deren Namen nicht vorab bekannt sind (offenbar handelt es sich um eine Art Plugin-Konzept)

Dazu muss man ja zunächst wissen, woher der aufrufende Code gerade geladen wurde.
Code:
Class cls = this.getClass();
String clsNam = cls.getName();
String binaryClsNam = clsNam.replace( '.', '/') + ".class";
URL clsURL = ClassLoader.getSystemResource( binaryClsNam);
System.out.println( clsNam + " -> " + binaryClsNam + " -> " + clsURL);

Damit bekommt Du Ausgaben in der Art:
Jar-File: test.Test -> test/Test.class -> jar:file:/C:/home/work/060628/jars/test.jar!/test/Test.class
Class-Files: test.Test -> test/Test.class -> file:/C:/home/work/060628/lib/test/Test.class

Jetzt muss man zwischen beiden Varianten unterscheiden; im Falle von Class-Files ermittelst Du aus der URL das Verzeichnis, in dem Du suchen musst (ähnlich wie bisher)

Beim Jar-File konstruierst Du wie thE_29 vorgeschlagen ein java.util.jar.JarFile-Objekt und kannst dann über dessen entries-Methode die enthaltenen Klassen finden.

HTH

ok danke. muss ich also doch ein bissel if abfragen. danke fuer den denkanstoß. @beide
 

PowerPaul

Mitglied
thE_29 hat gesagt.:
Naja, wenn du mir das mal zeigen kannst, aber hier ein Code

Code:
    File fJar = new File(strJar); //Pfad zur jar Datei halt
    URL url = null;
    try
    {
      //holt sich das jar file in url form
      url = fJar.toURL();
      URLClassLoader urlcl = new URLClassLoader(new URL[] {url});
      String strPackage = "at.jta.bla"; //hier halt das package eintragen was du willst
	  Class clazz = Class.forName(strPackage, true, urlcl);
	  
	  //jetzt könntest du Konstruktoren oder ähnliches laden, ich lade einen Konstruktor OHNE parameter als Bsp
      Constructor cons = null;
      cons = clazz.getConstructor(null); //null heißt er hat keine Parameter, hier müsstest du ein class[] Objekt haben mit den Parametern wenn er welche hat
	  Object instance = cons.newInstance(null); //führt den Konstruktor aus -> mit diesem instance Objekt könntest du jetzt alle Methoden aus der Klasse starten
	}
	catch(Exception ex)
	{
		ex.printStackTrace();
	}

nochmal ne frage dazu: ist das bei strPackage so gemeint "Package.Foo.class" ? also kann ich da direkt eine class datei waehlen ? ich weis ich koennte es probieren aber ich schlage mich jetzt schon 4 stunden mit dem bloeden problem rum und keine version will funktionieren (naja jedenfalls kann ich jetzt zwischen file und jar unterscheiden).... ich kann eclipse enfach nichtmehr sehen. danke
 

thE_29

Top Contributor
Ja, aber ohne .class hinten!


Also bei JButton wäre es

javax.swing.JButton

Wenn du Fehler hast, poste mal die Exception!
 
G

Gast

Gast
Hi, ich habe ebenfalls den Jar-Loader-Code genommen und frage mich jetzt, wie ich über das "Instance"-Object die Methoden der Klasse aufrufen kann.
Wenn ich einfach interface.Methodenname mache, dann sagt er mir, dass ein Object der Klasse "Object" diese Methode nicht kennt.

Gruss
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Zur Laufzeit eine Klasse laden, die auf jar-File zugreift Allgemeine Java-Themen 15
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
P File ähnliche Klasse Allgemeine Java-Themen 8
K Testen einer Klasse mit File Objekt als Parameter Allgemeine Java-Themen 6
J Ausgewähltes File in anderer Klasse verfügbar machen? Allgemeine Java-Themen 3
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
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
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben