Java Code in der Konsole kompilieren

F

Fr3eMaN

Neues Mitglied
Thread Starter
Dabei seit
30.11.2007
Beiträge
16
Reaktionspunkte
0
Hallo

Ich möchte meinen in Java geschriebenen Code in der Console kompilieren, hat bisher auch immer gut geklappt.
Ich mache das in der Regel mit dem aufruf
Code:
javac datei.java && java datei

Jetzt ist mir aber aufgefallen wenn ich eine normale source datei habe mit, die die "package" Anweisung enthält bekomm ich einen Fehler.
Hier mal Beispielcode :
Code:
package testpacket;

public class test{

    void hallowelt(){
        System.out.println("Hallo Welt\n");
    }
    
    public static void main(String[] argv){       
        test t = new test();
        t.hallowelt();    
    }
}

kompilieren per javac test.java funktioniert einwandfrei, wenn ich jetz die datei starten möchte mit "java test" bekomme ich eine lange fehlermeldung:
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: test (wrong name: testpacket/test)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
	at java.net.URLClassLoader.access$100(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:316)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:280)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)

muss ich diese Pakete speziell aufrufen, wo liegt der Fehler ?
Danke euch
 
Kompilierte Java-Klassen, die zu einem package gehören, müssen sich per Vereinbarung in einem entsprechenden Unterordner mit gleichem Namen befinden.

Wenn in deinem Fall dein working directory, also das Verzeichnis, in dem du dich befindest und von wo du dein Java-Programm aufrufen möchtest z. B.
Code:
~/Desktop
ist, dann benötigst du das Verzeichnis
Code:
~/Desktop/testpacket
, in dem sich die Datei test.class befinden muss.

Beim Aufruf der Klasse musst du dann mit angeben, in welchem package sich die Klasse befindet, die du aufrufen möchtest.

Code:
java testpacket.test
Dabei wird dann also die Datei test.class im Unterordner ./testpacket/ aufgerufen.


Zwei Anmerkungen:

Meistens werden package-Namen hierarchisch aufgebaut und mit einem Punkt getrennt.
Code:
de.meineFirma.meinProjekt.meinModul
In diesem Fall benötigt man ein Verzeichnis de. Darin befindet sich ein Verzeichnis meineFirma. Darin… usw.

Per Vereinbarung fangen Namen von Java-Klassen mit einem Großbuchstaben an.

Code:
public class Test { … }

Als Dateiname dann Test.java. So kann man unnötige Verwirrung vermeiden, besonders wenn man in irgendeiner Form mit anderen/anderer Leute Code arbeiten muss.
 
Die Verzeichnisstruktur mit den *.class-Dateien muss der Paketstruktur entsprechen.

D.h. ausgehend von dem Verzeichnis, in dem Du die VM aufrufst, muss sich test.class im Verzeichnis testpacket (Die Dinger heißen übrigens "Packages" nicht "Packets) befinden. Der Aufruf muss dann natürlich auch mit
Code:
java testpacket.test
erfolgen.
 
danke euch beide, ihr habt mir sehr geholfen!
 
kann gelöscht werden...sorry wegen Doppelpost
 
Zuletzt bearbeitet:
Blödsinn geschrieben :D
 
ui, ich sehe es auch grad. Ich hab mein Problem gelöst... "javac Editor/datei.java . Aufgrund des Package Befehls.....puh..
 
Habe ein ähnliches Problem.

Habe folgende beide Dateien im Ordner "Bla" auf dem desktop:

Text.java

package Bla;

public class Text {
private String info ="HelloWorldIGetIt";
public String getinfo() {
return info;
// TODO Automatisch erstellter Konstruktoren-Stub
}

}

TextOut.java

package Bla;

public class TextOut {


public static void main(String[] args) {
Text f1 = new Text ();
// TODO Automatisch erstellter Methoden-Stub
System.out.println(f1.getinfo());
}

}

Text.java lässt sich compilieren, package Befehl liefert auch keinen fehler.
allerdings lässt sich TextOut.java nicht compilieren. Es kommt immer die Fehlermeldung:

TextOut.java:7: cannot find symbol
symbol : class Text
location: class Bla.TextOut
Text f1 = new Text ();
^
TextOut.java:7: cannot find symbol
symbol : class Text
location: class Bla.TextOut
Text f1 = new Text ();
^
2 errors

Wär klasse wenn mir da jemand helfen kann!
 
Such mal nach den Schlüsselwörtern 'package java' in Verbindung mit CLASSPATH.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Spratz
Hab ich bereits gemacht,a ber 100%ig bin ich da noch nicht durchgestiegen. Nen Beispielquelltest würde mir da helfen.
 
versuch mal

javac -cp . Bla/TextOut.java
 
  • Gefällt mir
Reaktionen: Spratz
Hab ich bereits gemacht,a ber 100%ig bin ich da noch nicht durchgestiegen. Nen Beispielquelltest würde mir da helfen.

Dein Quelltext ist schon richtig, du musst nur die Optionen für den Compiler richtig setzen, das hat _ebm_ ja schon für dich gemacht.

'javac -cp . Bla/TextOut.java' gliedert sich auf in die Teile 'javac', '-cp .' und 'Bla/TextOut.java'.

'javac' ist der Compileraufruf, das sollte dir bekannt sein. Im Terminal kannst du dir mit dem 'man'-Befehl die Beschreibungen von Befehlen anschauen, also 'man javac': Als Ausgabe bekommst du die Synopsis (den Aufbau des Befehls): 'javac [ options ] [ sourcefiles ]'.
Wir haben als option '-cp .' und als sourcefile 'Bla/TextOut.java'. Da du in 'Bla/TextOut.java' deine Text-Klasse verwendest, wird diese gesucht. Wo sie gesucht wird wird dir hier erklärt. Und genau hier passiert das Interessante. Durch angeben der Option '-cp .' geben wir das aktuelle Verzeichnis ( ist immer . unter Unix) als Suchpfad für verwendete Klassen an. Klingt nicht ganz logisch, da laut obigem Link eben das aktuelle Verzeichnis automatisch dabei sein sollte. Wir geben hier aber den Pfad zu unserem package an, das ist der Unterschied. Und deswegen findet er deine Textklasse jetzt.

@_ebm_: die neue '-cp' Option kannte ich gar nicht
 
  • Gefällt mir
Reaktionen: Spratz
Die ist nicht neu, das ist nur die Kurzform für -classpath und ist imho in allen Java-Versionen vorhanden gewesen. Anfänger sollten eigentlich die Langform verwenden, da sie den Sinn besser erklärt. Ich bin da nur immer zu faul zu. "." entpricht unter Dos/Windows übrigens auch dem aktuellen Verzeichnis. So verschieden sind dann die Shells doch nicht. ;)
 
  • Gefällt mir
Reaktionen: Spratz
Ah.. hab meinen Fehler jetzt selber gefunden...
Habs immer direkt im Ordner Bla compilieren wollen.. es ging wegen dem Packagepfad natürlich aber nur von außerhalb also mit Bla/Textout.java.
classpath war dazu gar nicht nötig.
Trotzdem danke für eure Hilfe!!

Hab allerdings ne neue Frage :D

Hab dieses Java-Applet:

import java.applet.Applet;
import java.awt.*;

// assume that the drawing area is 150 by 150
class MyApplet extends Applet
{
final int areaSide = 150 ;
final int width = 100, height = 50;

public void paint ( Graphics gr )
{
setBackground( Color.white );
gr.setColor( Color.blue );

// outline the drawing area
gr.drawRect( 0, 0, areaSide-1, areaSide-1 );

gr.setColor( Color.red );

// draw interiour rectange.
gr.drawRect( areaSide/2 - width/2 ,
areaSide/2 - height/2, width, height );
}
}

Es lässt sich auch kompilieren. allerdings nicht starten und wird in einer HTML-Seite eingebunden auch nicht angezeigt.
Ich vermute, dass der vielleicht die oben zu importierenden Sachen nicht findet, kann das sein?
 
Nein, java.awt.* und java.applet.Applet sind Bestandteil der JRE. Das ist nicht das Problem. Wie sieht der HTML-Code aus, mit dem du das Applet einbindest?

Nachtrag: Bitte vermeide Wildcards in den Imports. Gib die Klassen direkt an. Das kann dir viel Gesuche und Ärger ersparen.
 
Der HTML-Code sieht folgendermaßen aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>MyApplet.html</title>

</head>

<body>

<applet align="right" code="MyApplet.class" width="300" height="150" alt="MyApplet"></applet>

</body>

</html>
 
wo relativ zur html-datei liegt die class-datei?
 
im selben ordner.
Die class-datei lässt sicha ber auch so schon nicht starten, der fehler muss also irgendwo bei ihr liegen.
im ordner der class-datei liegen halt nur noch die .java datei und die html-datei.
 
Wie willst du die class-Datei starten? Das ist ein Applet. Der Kontrollfluß wird vom Applett-Framework des JRE übernommen. Füge mal eine main() hinzu, welche die Klasse instanziiert

Ach ja, sehe ich gerade, auf welchem Canvas zeichnest du???
 
Hm.. als mainklasse passiert auch nicht viel mehr...

auf welchem canvas? sry bin absoluter java-anfänger.. arbeite grad nen paar tutorials durch und da war das nen beispielprogramm, dass bei mir nur nicht laufen will..
 
Zurück
Oben Unten