tutorials.de Buch-Aktion 05/2012
Like Tree6Danke
  • 1 Beitrag von Technoblade
  • 1 Beitrag von Technoblade
  • 1 Beitrag von genodeftest
  • 1 Beitrag von SE
  • 1 Beitrag von genodeftest
  • 1 Beitrag von Technoblade
ERLEDIGT
JA
ANTWORTEN
14
ZUGRIFFE
469
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    HADDUNG HADDUNG ist offline Rookie
    Registriert seit
    Jun 2011
    Beiträge
    7
    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
     

  2. #2
    Technoblade Technoblade ist offline Mitglied Gold
    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
    HADDUNG bedankt sich. 

  3. #3
    HADDUNG HADDUNG ist offline Rookie
    Registriert seit
    Jun 2011
    Beiträge
    7
    Wow Danke! Habe gedahct ich habe das ausprobiert Aber sehr cool, danke =)
     

  4. #4
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  5. #5
    Technoblade Technoblade ist offline Mitglied Gold
    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.
    HADDUNG bedankt sich. 

  6. #6
    HADDUNG HADDUNG ist offline Rookie
    Registriert seit
    Jun 2011
    Beiträge
    7
    Zitat Zitat von genodeftest Beitrag anzeigen
    lass dir doch mal die URL von this.class.getResource("/paket/zum/klass/file/TestTest.class") ausgeben.
    Wo meinst du, soll ich das genau hinsetzten? Steh grad aufm schlauch!
     

  7. #7
    HADDUNG HADDUNG ist offline Rookie
    Registriert seit
    Jun 2011
    Beiträge
    7
    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?
     

  8. #8
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Zitat Zitat von HADDUNG Beitrag anzeigen
    Wo meinst du, soll ich das genau hinsetzten? Steh grad aufm schlauch!
    in ein System.out.println();

    Vielleicht kannst du weitere Informationen über den Speicherort herausfinden. Oder einfach mal ein bisschen durchprobieren.
    HADDUNG bedankt sich. 
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  9. #9
    HADDUNG HADDUNG ist offline Rookie
    Registriert seit
    Jun 2011
    Beiträge
    7
    Zitat Zitat von genodeftest Beitrag anzeigen
    in ein System.out.println();

    Vielleicht kannst du weitere Informationen über den Speicherort herausfinden. Oder einfach mal ein bisschen durchprobieren.
    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!
     

  10. #10
    genodeftest genodeftest ist offline Mitglied Brillant
    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 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 die Pfade aus deiner Ausgabe stammen, sollte es eigentlich richtig sein.

    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  11. #11
    SE 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".
    HADDUNG bedankt sich. 

  12. #12
    genodeftest genodeftest ist offline Mitglied Brillant
    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.
    HADDUNG bedankt sich. 
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  13. #13
    HADDUNG HADDUNG ist offline Rookie
    Registriert seit
    Jun 2011
    Beiträge
    7
    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
     

  14. #14
    HADDUNG HADDUNG ist offline Rookie
    Registriert seit
    Jun 2011
    Beiträge
    7
    Zitat Zitat von SPiKEe Beitrag anzeigen
    Klassen von Paketen läd man sowieso nicht mit einem Slash sondern mit einem Punkt. .
    Was meinst du damit? Wie würdest du/ihr denn den Code schreiben, wenn die Datei immer im gleichen Ordner liegt?

    Grüße!
    Geändert von HADDUNG (05.06.11 um 10:02 Uhr) Grund: erweiterung der Frage
     

  15. #15
    Technoblade Technoblade ist offline Mitglied Gold
    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;
        }
    HADDUNG bedankt sich. 

Ähnliche Themen

  1. Class Datei mit Quellcode verknüpfen
    Von HeaDHunteR im Forum .NET Café
    Antworten: 40
    Letzter Beitrag: 20.10.10, 10:57
  2. Hab ein Problem mit einer .class datei...
    Von Sniky76 im Forum Java
    Antworten: 3
    Letzter Beitrag: 18.04.08, 19:12
  3. Problem mit Rcon Class Datei.
    Von k0riz0n im Forum PHP
    Antworten: 3
    Letzter Beitrag: 05.07.06, 16:05
  4. Aus *.java-Datei eine *.class Datei machen!
    Von Unlimited im Forum Java
    Antworten: 4
    Letzter Beitrag: 23.06.05, 11:19
  5. Position von Datei/Class ermitteln
    Von NomadSoul im Forum Java
    Antworten: 0
    Letzter Beitrag: 20.05.05, 14:43