Hallo, mein Problem ist, dass die kompilierten Java-Dateien nicht ausführbar sind.
Habe mittlerweile gelesen, dass man beim kompilieren den CLASSPATH der JRE mit angeben muss (angeblich die rt.jar). Mein Befehl sieht daher mittlerweile so aus:
Ziel ist eigentlich, JUnits auf der Konsole zum laufen zu bringen, aber bei
"java TestDice"
verabschiedet sich das Programm mit folgendem Fehler:
"Exception in thread "main" java.lang.NoClassDefFoundError: TestDice (wrong name: main/TestDice)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: TestDice. Program will exit."
Ich denke mir fehlt noch irgendeine CLASSPATH-Angabe, aber er meckert darüber ja leider beim kompilieren nicht (also der javac Befehl geht Problemlos durch).
Weiß jemand was fehlt / was ich grundlegen falsch mache?
Mein Fehler, dass ich den Quellcode nicht gepostet habe. Für eine Main-Methode ist gesorgt:
Code:
package main;
public class Dice {
private static Integer number = 1;
public static Integer rollDice(){
Dice.number = new Integer( (int) Math.floor(Math.random()*10*6) );
return Dice.number;
}
public static Integer getNumber(){
return Dice.number;
}
}
Code:
package main;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class TestDice {
public TestDice(){
}
@Test
public void testDiceRoll(){
assertTrue(Dice.rollDice() == Dice.getNumber());
}
public static void main(final String[] args) {
/*System.out.println(
org.junit.runner.JUnitCore.runClasses(TestDice.class)
.toString());*/
System.out.println("Test");
}
}
Fehler dürfte übrigens nicht am JUnit liegen, da auch ein anderes Programm, was eine main-Methode hat, nicht funktioniert. Dabei bin ich mir sicher, dass ich das schonmal lauffähig kompiliert hatte ... *seufz*. Soweit ich mich erinnere musste ich damals die JRE direkt mit einbinden, aber mache ich das nicht mit dem rt.jar CLASSPATH?
java muss so dort aufgerufen werden, wo das Verzeichnis main liegt, weil die Klasse mit der main()-Methode in deinem Fall in einem Paket namens main liegt.
Wie du schon richtig vermutet hast (und es mir grad selbst aufgefallen ist), habe ich die package-Struktur missachtet und direkt im package kompiliert & ausgeführt. Jetzt läuft es erstmal! =D Muss man erstmal wissen, dass man die Dateien in den Packages ansprechen muss und nicht darin sein darf (ich hatte zur Lösung ersmal die package-Information im Quellcode entfernt, aber mit dem Wissen wie es richtig geht ist natürlich schöner). Danke Ark!
Hab mich dann gleich mal an den JUnit-Test versucht und gemerkt, dass ich jetzt auf deinen Hinweis zurückgreifen konnte habi55. =) Muss tatsächlich den Runner angeben, auch wenn es in der Main drinsteht usw. Jetzt läuft das Programm ohne Laufzeitfehler und die JUnit-Information wird auch ausgegeben. *freu*.
Das einzige Problem besteht jetzt mit JUnit: Es sagt "Could not find class: main.TestDice.class". Ist an dem aufruf irgendwas unvollständig / falsch?
Code:
public static void main(final String[] args) {
org.junit.runner.JUnitCore.runClasses(TestDice.class);
System.out.println("Test");
}
Gruß und vielen Dank an euch beide!
Bloodredangel
Edit: Hab im Internet geforscht und herausgefunden, dass ich immer den eigenen Classpath dafür angeben muss. Nehme jetzt auch die main-Methode von JUnitCore, aber der Fehler besteht leider weiter. ;(
Problem gelöst!
Wenn ich den Runner auf der Konsole nehme, versucht er nicht die Klasse mit java zu starten, sondern nimmt das ja direkt als Eingabe für seine main-Methode. Einfach mit java aufrufen hat zwar Anfangs warumauchimmer nicht funktioniert, aber jetzt bringt es die gewünschten Ergebnisse. :toll:
:rtfm: bildet! Auch wenn der Weg manchmal schon für einfache Dinge recht lang dauert. ^^
Gruß Bloodredangel
Edit: Achso der Fehler war, dass es "main.TestDice" heißen muss und nicht "TestDice.class". API zum Runner lesen hat viel gebracht. =) Diesen Namen dann so übergeben:
org.junit.runner.JUnitCore.main("main.TestDice");
und es klappt. runClasses ist nicht für den Direktaufruf gedacht *schäm*.