6Danke
ERLEDIGT
JA
JA
ANTWORTEN
14
14
ZUGRIFFE
469
469
EMPFEHLEN
-
HalliHallo zusammen!
Ich hoffe der Titel ist nicht zu verwirrend, aber ich werde es einfach versuchen zu erklären.
Ich beschäftige mich gerade mit der Programmierung eines PlugIns für JUnitTests.
Der Teil der mir Probleme macht, ist das "Einlesen" einer .class-Datei. Nicht den Inhalt sondern wikrlich das "Einfügen".
Hier erstmal den Codeteil um des es geht:
Code java:1 2 3
JUnitCore core = new JUnitCore(); RunListener listener = new RunListener(); core.addListener(listener);
Danach soll mit der Methode core.run(Class clazz) der eigentliche Testlauf getstartet werden. Hierfür benötige ich als Parameter ein .class Datei! Wenn ich diese einfach per Hand reinschreibe funktioniert auch alles super, bringt mir natürlich für den richtigen Einsatz nichts...
Deshalb habe ich versucht diese gefolgt einzulesen ("TestTest.class" soll hier dem Namen des Tests entsprechen):
Code java:1 2 3 4 5 6 7 8 9 10 11
private Class createClass() throws Exception { Class result; URI uri = new File(System.getProperty("user.dir")).toURI(); URL url = uri.toURL(); URLClassLoader urlClassLoader = new URLClassLoader( new URL[]{ url } ); result = urlClassLoader.loadClass("TestTest.class"); return result; }
Leider folgt diese Fehlermeldung:
java.lang.ClassNotFoundException: TestTest.class
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Es funktioniert also das Laden der class-Datei nicht. Eigentlich müsste es meiner Meinung nach passen (tut es aber ja nicht
).
Würde mich sehr freuen, wenn jemand eine Idee hätte! Danke schonmal!
Beste Grüße, Kai
-
03.06.11 23:58 #2
- Registriert seit
- Feb 2009
- Beiträge
- 193
Da kann ich dir schnell helfen. Du musst einfach nur das .class weglassen. Dann funktioniert alles.
Liegt daran, dass der ClassLoader nicht nach einer Datei, sondern wirklich nach einer Klasse sucht. Wenn der URL-ClassLoader also den richtigen Pfad hat, kannst du auch z.B. java.lang.String laden.
MfG Technoblade
-
Wow Danke! Habe gedahct ich habe das ausprobiert
Aber sehr cool, danke =)
-
04.06.11 00:03 #4
- Registriert seit
- Jun 2009
- Beiträge
- 870
lass dir doch mal die URL von this.class.getResource("/paket/zum/klass/file/TestTest.class") ausgeben. Dies sollte funktionieren, wenn eine TestTest.class im Paket paket.zum.klass.file liegt. Diese Methode arbeitet intern mit dem Classloader und sollte dir damit genauere Ergebnisse zum Debuggen geben. Wichtig ist der Pfad, ohne ihn geht es nicht.
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
04.06.11 00:07 #5
- Registriert seit
- Feb 2009
- Beiträge
- 193
Gerngeschehen
,
sehe gerade, dass das hier dein erster Beitrag ist, dann nochmal herzlich Willkommen im Namen aller. Den Danke-Button hast du ja anscheind schon gefunden, das freut mich
.
Wenn du es ganz sauber machen willst kennzeichnest du das Thema auch noch als erledigt indem du unten neben "Auf Thema antworten" auf das Häkchen klickst.
Schönen Abend noch.
-
-
Hi!
Ist es jetzt aber doch noch nicht... schade!
Jetzt kommt folgender Fehler:
java.lang.NoClassDefFoundError: TestTest (wrong name: interfaces/TestTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at interfaces.Runner.createClass(Runner.java:61)
at interfaces.Runner.runTest(Runner.java:35)
at interfaces.Runner.<init>(Runner.java:18)
at interfaces.RunnerTestManual.RunnerTestRight(RunnerTestManual.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Irgendwelche Ideen?
-
04.06.11 00:28 #8
- Registriert seit
- Jun 2009
- Beiträge
- 870
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
Problem ist aber doch, dass irgendwas mit dem ClassLoader nicht stimmt, deswegen kann ich ja auch nichts von der Klasse aufrufen. Oder versteh ich dich falsch?
Wenn ich mir den Ordner auslese passts soweit eigentlich:
C:\Users\HADDE\workspace\uTest\src\interfaces\TestTest.class (Datei)
und meine url ist:
file:/C:/Users/HADDE/workspace/uTest/src/interfaces/ und mein Dateiname: TestTest
Kann es mit den Slashes zu tun haben?
Grüße!
-
04.06.11 01:27 #10
- Registriert seit
- Jun 2009
- Beiträge
- 870
Ja, Backslashes musst du escapen. Um C:\WINDOWS\system32 im Java-Quellcode korrekt anzugeben, musst du "C:\\WINDOWS\\system32" schreiben. Wenn du die mit der CMD eingibst, sollte das aber kein Problem sein. Ist das hier:
Wenn die Pfade aus deiner Ausgabe stammen, sollte es eigentlich richtig sein.Wenn ich mir den Ordner auslese passts soweit eigentlich:
C:\Users\HADDE\workspace\uTest\src\interfaces\TestTest.class (Datei)
und meine url ist:
file:/C:/Users/HADDE/workspace/uTest/src/interfaces/ und mein Dateiname: TestTest
Wenn du willst, kannst du ja mal Procmon von der Sysinternals Suite darüber laufen lassen: http://technet.microsoft.com/de-de/sysinternals
Diese Sysinternals-Suite ist übrigens das einzige, was ich bei Linux wirklich vermisse....Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
04.06.11 09:54 #11SE Tutorials.de Gastzugang
Hehe ... nein ... der Fehler wird ganz wo anderst liegen.
Erstens : gewöhne dir gleich an IMMER Slaches *also /* zu schreiben ... diese werden von Java immer richtig erkannt und lösen auch solche Escape-Probleme.
Zweitens : dein Pfad ist falsch. Du brauchst den Pfad "file:/C:/Users/HADDE/workspace/uTest/src/" und als Klassenname "interfaces.TestTest". Das setzt natürlich vorraus das du in der Klasse auch als Paketname "interfaces" festgelegt hast. Ansonsten wird das natürlich so auch nichts. Die Exception hat es dir eigentlich schon gesagt : ClassDefNotFound ... beduetet nicht mehr und nich weniger als das es in allen momentan geladenen Klassen eben keine gibt deren Signatur auf das passt was du laden willst. Klassen von Paketen läd man sowieso nicht mit einem Slash sondern mit einem Punkt. Genaueres dazu findest du in der JavaInsel *Google* unter dem Thema "Klassen und Pakete".
-
04.06.11 11:09 #12
- Registriert seit
- Jun 2009
- Beiträge
- 870
ach ja, noch etwas:
Deine .class-Datei wird wahrscheinlich nicht im Ordner */src/*, sondern unter */bin/* liegen, da du offensichtlich mit Eclipse arbeitest.Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
Hi!
Danke für eure Antworten! SPiKEe hat den letzten nötigen Tipp gegeben, Danke!
Mir war ja klar, dass die Klasse nicht gefunden wird, aber wusste halt nicht warum
Des mit der Classdatei in "bin" ist klar, war nur für ein ersten Test so... jetzt kanns weiter gehen
Also nochmal danke! Viele Grüße, Kai
-
-
05.06.11 11:50 #15
- Registriert seit
- Feb 2009
- Beiträge
- 193
Es so wie ich es oben bereits erwähnt habe, in loadClass gibst du keinen Dateinamen an, sondern einen Klassennamen, wie du ihn auch bei import angeben würdest. Also ist H:/Programme/Java/src/plugin/Test.class ungültig. Gültig sind Klassennamne in der Form java.lang.String, oder (wenn ich das richtig raus gefiltert habe) in deinem Fall interfaces.TestTest, da die Klasse TestTest ja im package interfaces ist. Damit der URL-ClassLoader die findet musst du ihm den richtigen Such-Pfad mitgeben.
Um abzuschließen, so müsste dein Code funktionieren:
Code java:1 2 3 4 5 6 7 8 9 10 11
private Class createClass() throws Exception { Class result; URI uri = new File("C:/Users/HADDE/workspace/uTest/bin/interfaces/").toURI(); URL url = uri.toURL(); URLClassLoader urlClassLoader = new URLClassLoader( new URL[]{ url } ); result = urlClassLoader.loadClass("interfaces.TestTest"); return result; }
Ähnliche Themen
-
Class Datei mit Quellcode verknüpfen
Von HeaDHunteR im Forum .NET CaféAntworten: 40Letzter Beitrag: 20.10.10, 10:57 -
Hab ein Problem mit einer .class datei...
Von Sniky76 im Forum JavaAntworten: 3Letzter Beitrag: 18.04.08, 19:12 -
Problem mit Rcon Class Datei.
Von k0riz0n im Forum PHPAntworten: 3Letzter Beitrag: 05.07.06, 16:05 -
Aus *.java-Datei eine *.class Datei machen!
Von Unlimited im Forum JavaAntworten: 4Letzter Beitrag: 23.06.05, 11:19 -
Position von Datei/Class ermitteln
Von NomadSoul im Forum JavaAntworten: 0Letzter Beitrag: 20.05.05, 14:43





Zitieren
Login





