ClassNotFoundException in JAR File

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

ich habe es nun geschafft, alle notwendigen Bibibliothken in das ausführbare Jar file einzubinden, schon kommt das nächste Problem:

In meinem Programm kann der Anwender eine eigen Java-Datei erstellen, die dann mittels meiner Anwendung ausgeführt werden kann. Beim Ausführen unter Eclipse funktioniert alles wunderbar, aber in dem Jar-File bringt er den Fehler, dass er die temporär erstellte Klasse nicht findet. Wie kann er sie unter Eclipse finden aber im Jar File nicht? Er hat diese Dateien übrigens korrekt erstellt, also sie sind im aktuellen Verzeichnis der Jar-Datei vorhanden. Woher kann dann der Fehler kommen? Im folgenden findet ihr meinen Code:

CompileKlasse
Code:
public class CompileThread extends Thread
{
	File file;
	String classname,filename;
	
	public CompileThread(File file2,String classname2,String filename2)
	{
		file=file2;
		filename=filename2;
		classname=classname2;

	}
	
	public void run()
	{
		if(this.isInterrupted()==false)
		{
	
	//Main Methode compilieren
	String[] args =new String[]{"-d",System.getProperty("user.dir"),filename};
	int status =Main.compile(args);
			
	switch(status)
	{
		case 0: 
			//Temporaere Datei wieder loeschen 
			new File(file.getParent(),classname + ".class").deleteOnExit();
			try
			{
				Class clazz=Class.forName(classname);
				Method main =clazz.getMethod("main",new Class[]{String[].class});
				main.invoke(null,new Object[]{new String[0]});	
			}catch(InvocationTargetException ex)
			{
				System.out.println("Fehler beim Ausfuehren!");
				System.out.println("Exception in main "+ ex.getTargetException());
				ex.getTargetException().printStackTrace();
				
			}catch(Exception ex)
			{
				System.out.println("Fehler beim Ausfuehren!");
				System.out.println(ex.toString());
				
			}
			break;
		case 1: System.out.println("Compile status: ERROR");break;
		case 2: System.out.println("Compile status: CMDERR");break;
		case 3: System.out.println("Compile status: SYSERR");break;
		case 4: System.out.println("Compile status: ABNORMAL");break;
		default: System.out.println("Compile status: Unknown exit status");
		}

		}
		
	
		
	}
		

}

Ausführklasse:
Code:
	//fuehrt den Algorithmus aus
	//erstellt dafuer Temporaere Java-Datei
	//schreibt Variablen und Alg-Eingaben in Datei
	//compiliert die temporaere Datei und fuehrt sie aus	
	synchronized public void ausfuehren(boolean schrittweise)
	{
		//Algorithmus prüfen
		this.pruefeVariablenReihe();
		this.pruefeVariablenWerte();
		
		//bevor eigentliches Ausfuehren stattfindet, wird geprueft, ob Variablen Korrekt sind und 
		//Algorithmus ausgefuellt wurde, sonst erscheint Fehlermessage
		if(this.sindVariablenKorrekt()==true && this.pruefeAusgefuellt()==true)
		{
			try
			{
				//temporaere Java-Datei erstellen
				File file=File.createTempFile("Jav",".java",new File(System.getProperty("user.dir")));
				file.deleteOnExit();
				String filename=file.getName();
				String classname=filename.substring(0,filename.length()-5);
				ausgabeDatei = new PrintWriter (new FileOutputStream(file));
				//Klassenname in Datei schreiben
				ausgabeDatei.println(getSpeicherText(1,classname,schrittweise));
				//definierte Variablen ermitteln (String mit Typ,Name,Wert)
		  	
				if(this.varDef==false)
				setDefinierteVariablen();
				//Liste dieser Strings mit Variablen Typ,Name,Wert durchlaufen
				Iterator i=variablenListe.iterator();
				while(i.hasNext())
				{
					//VariablenStrings in Datei schreiben
					Variable var=(Variable)i.next();
					String str1=var.getTyp();
					String str2=var.getName();
					String str3=var.getWert();
					String result=str1+" "+str2+"="+str3+"; \r\n";
					ausgabeDatei.println(result);
				}
			
			
				ausgabeDatei.println("\r\n");			
				//Text aus AlgFenster in Datei schreiben
				ausgabeDatei.println(this.getText() );
				//Alle Variablen durchlaufen
			

				//StandardVariablen Ausgabe in Datei schreiben
				ausgabeDatei.println(getSpeicherText(2,classname,schrittweise));
			
				ausgabeDatei.flush();
				ausgabeDatei.close();
			
				Thread compile=new CompileThread(file,classname,filename);
				compile.start();
				try
				{
					compile.join(this.getWaitSec());
				
					if(compile.isAlive()==true)
					{
						compile.interrupt();
						System.out.println("Ausfuehren wurde nach "+(this.getWaitSec()/1000)+" beendet!");
						JOptionPane.showMessageDialog(StructX.getAktivFenster().getHaupFenster(),"Programm wird beendet!!","Endlosschleife",JOptionPane.ERROR_MESSAGE);
						System.exit(0);
					}
					
				
				}catch(InterruptedException ie){	}
				
			
			}
			catch (IOException e) { System.out.println("Fehler!");}
		}
		//Algorithmus noch nicht fertig zum Ausfuehren
		else
		{
			JOptionPane.showMessageDialog(StructX.getAktivFenster(),"Bitte Algorithmus pruefen","Fehler",JOptionPane.INFORMATION_MESSAGE);
		}

Kann mir jemand helfen.
 

semi

Top Contributor
Mit
Code:
...
Class clazz=Class.forName(classname);
...
klappt es nicht.
Versuche das hier
Code:
URLClassLoader l = new URLClassLoader(new URL[] { new URL("file://localhost/" + file.getParent().getAbsolutePath()) });
Class c = l.loadClass(classname);
Method m = c.getMethod("main", new Class[] { String[].class });
m.invoke(null, new Object[] {new String[0]});
 
G

Guest

Gast
bei

Code:
file.getParent().getAbsolutePath()

kommt folgende Fehlermeldung:
Methode getAbsolutePath() is undefined for the typ String.
 
G

Guest

Gast
Das Problem mit dem String ist gelöst. Der richtige Aufruf war file.getParentFile.getAbsolutePath().
Aber beim Ausführen nach dem Erstellen der Jar Datei kommt noch immer eine ClassNotFound Exception. Ist die URL falsch? Was muss ich einsetzen, damit eine Datei im gleichen Folder wie die Jar Datei gefunden werden kann?
 

semi

Top Contributor
In Deinem Code sehe ich nichts mit Jar-Dateien.
In dem Clasloader-Beispiel gehe ich davon aus, dass die compilierte Datei
in einem Verzeichnis liegt (undauch keine package-Aweisung im Sourcecode)
Die Jar-URL sollte wie folgt aussehen

jar:file:/wo/auch/immer/archive.jar!/

Danach kannst Du die Klassen laden.
 
G

Guest

Gast
Die Datei liegt in keinem Jar File.
In der Klasse Algorithmus wird zuerst eine Java Datei erstellt (im gleichen Verzeichnis wie das selbstausführbare JarFile meiner Anwendung). Danach wird die Class-Datei mit dem gleichen Namen erstellt, auch im selben Verzeichnis mit der Java und der Jar Datei. Beim Ausführen unter Eclipse funktioniert alles wunderbar, nur beim Ausführen über das selbstausführbare JarFile kann er die Class-Datei nicht finden. Wieso ist da so ein Unterschied?
 
G

Guest

Gast
Ich hab den Quellcode noch mal geringfügig geändert, um mir zuerst den Pfad der Klassendatei beim Erstellen und dann in der URL auszugeben. Die Pfad an sich ist der gleiche, aber in der URL steht halt noch "file:/" davor und der Slash ist umgedreht. Der Pfad der angelegten ClassDatei geht also etwa so C:\...\...\Klasse.class. Die URL sieht so aus: file:/C:/.../.../Klasse.class

Der Code:
Code:
//Main Methode compilieren
	String[] args =new String[]{"-d",System.getProperty("user.dir"),filename};
	int status =Main.compile(args);
			
	switch(status)
	{
		case 0: 
			//Temporaere Datei wieder loeschen 
			File classFile=new File(file.getParentFile().getAbsolutePath(),classname + ".class");
			System.out.println("ClassFile pfad: "+classFile.getAbsolutePath());
			
			classFile.deleteOnExit();
			
			try
			{
				//Class clazz=Class.forName(classname);
				URL url=new File(classFile.getAbsolutePath()).toURL();
				
				URLClassLoader l = new URLClassLoader(new URL[] { url }); 
				
				System.out.println("URL pfad: "+url);
			
				Class clazz = l.loadClass(classname); 
				
				Method m = clazz.getMethod("main", new Class[] { String[].class }); 
				m.invoke(null, new Object[] {new String[0]});
					
			}catch(InvocationTargetException ex)
			{
				System.out.println("Fehler beim Ausfuehren!");
				System.out.println("Exception in main "+ ex.getTargetException());
				ex.getTargetException().printStackTrace();
				
			}catch(Exception ex)
			{
				System.out.println("Fehler beim Ausfuehren!");
				System.out.println(ex.toString());
				
			}
			break;
		case 1: System.out.println("Compile status: ERROR");break;
		case 2: System.out.println("Compile status: CMDERR");break;
		case 3: System.out.println("Compile status: SYSERR");break;
		case 4: System.out.println("Compile status: ABNORMAL");break;
		default: System.out.println("Compile status: Unknown exit status");
		}


Kann es darin liegen? Oder mache ich noch was anderes falsch? Die Frage ist halt immer noch: Wieso macht er dass denn unter Eclipse, aber nicht in meinem JarFile?
 

semi

Top Contributor
Also bei mir geht's. Hilft nicht weiter, was? :bae:

Kann es sein, dass sich die neu compilierte Klasse auf etwas bezieht,
was in dem Jar-Archiv vorhanden ist?

Versuche vielleicht noch den anderen Konstruktor.
new URLClassLoader(..wie gehabt.., this.getClass().getClassLoader());

Ansonsten habe ich keine Ahnung, was das Problem sein könnte.
 

semi

Top Contributor
Aghhh! :autsch:
Was ist das in Deinem Code?
Code:
...
URL url=new File(classFile.getAbsolutePath()).toURL(); 
URLClassLoader l = new URLClassLoader(new URL[] { url }); 
...
Mach' mal
Code:
...
URL url=classFile.getParentFile().toURL();
URLClassLoader l = new URLClassLoader(new URL[] { url }); 
...
daraus.
 
G

Guest

Gast
Ups,

da hab ich wohl beim vielen hin und her probieren mal schnell den Pfad verwechselt. Es geht jetzt!!
DANKE!!!!!!!!! :applaus:

Die Frage ist natürlich immer noch, wieso das Ausführen unter Eclipse funktioniert hat? Wie hat er die Klasse da gefunden?? ???:L
 

semi

Top Contributor
Anonymous hat gesagt.:
Die Frage ist natürlich immer noch, wieso das Ausführen unter Eclipse funktioniert hat? Wie hat er die Klasse da gefunden?? ???:L
Auch beim allerersten Aufruf?
Kann es sein, dass die compilierte Klasse bereits existriert hat, als es funktionierte?
Lösche mal die compilierte Klasse und starte es mal just for fun erneut.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B ClassNotFoundException JAR-File Allgemeine Java-Themen 3
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
V Maven Maven ClassNotFoundException MySQL JDBC Treiber Allgemeine Java-Themen 1
R Classnotfoundexception Fehler Allgemeine Java-Themen 3
F java.lang.ClassNotFoundException: .class Allgemeine Java-Themen 5
F classnotfoundexception Allgemeine Java-Themen 6
T ClassNotFoundException bei jar export Allgemeine Java-Themen 11
U java.lang.ClassNotFoundException: .jar Allgemeine Java-Themen 8
B ClassNotFoundException Allgemeine Java-Themen 4
W java.lang.ClassNotFoundException Allgemeine Java-Themen 10
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9
B Finde letztes veränderte File Allgemeine Java-Themen 4
E Zip-File entpacken: unterschiedlicher Zeitaufwand bei unterschiedlicher Puffergröße Allgemeine Java-Themen 2
Guybrush Threepwood File.canWrite() und UAC Allgemeine Java-Themen 7
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben