classpath zum 1001. Mal

Status
Nicht offen für weitere Antworten.

Kiamur

Aktives Mitglied
Hallo!

Bitte beschimpft mich nicht, weil ich mal wieder eine classpath Frage stelle, aber ich raffe es einfach nicht.
Ich habe WIRKLICH schon die Suchfunktion und Google benutzt, aber noch keine Antwort auf meine Fragen gefunden.

Meine Rahmenbedingungen sind Win XP mit j2sdk1.4.2_06. Als IDE benutze ich den JCreator LE.

Also, ich habe mir heute aus der Bibliothek das Buch CoreJava - Band 1 Grundlagen ausgeliehen. Dieses Buch liefert einige nützliche Klassen mit, die man in seinem Programm einbinden kann.

Und zwar per

Code:
import corejava.*;

Sooo, wenn ich das so eigebunden habe spuckt mir der JCreator "package corejava does not exist" aus.
Jetzt habe ich mal versucht den fehler auszumerzen, und bin dann bei meiner Recherche auf die Umgebungsvariable Classpath gekommen, in die der Java Compiler, und wohl auch die Runtime reinschauen, wenn sie etwas nicht finden. In meinem Fall ist das ja das package corejava, was gesucht wird.
Die erste Ernüchterung war dann, dass auf der Buch CD keine Package drauf ist, sonder lauter einzelne *.java Dateien.
Frage 1: Damit kann ich doch so nichts anfangen, oder??? ich muss die doch zuerst mindestens in eine *.class datei kompilieren, oder???

Also habe ich alle *.java dateien kompiliert, was auch ohne Probleme geklappt hat. Jetzt habe ich also die Klassen in meinem Verzeichnis liegen, aber immer noch kein Package. Ich habe aber gelesen, dass es nicht umbeding ein Package sein muss, wo Classpath draufzeigt, sondern es reicht auch das Verzeichnis mit den entsprechenden Klassen.
Frage2: Stimmt das so, oder muss es umbedingt ein Package sein?

Jetzt habe ich über die Systemsteuerung die Umgebungsvariable Classpath gesetzt (und zwar unter meinem Benutzernamen UND unter Systemvariabeln.
Frage 3: Wo genau muss denn der Classpath gesetzt sein (Benutzer, System oder beides)????

Als Classpath habe ich das Verzeichnis angegeben, in dem meine Klassen liegen. Da steht genau das drin:
"F:\Daten\CoreJavaBand1\corejava\corejava". Lasst euch nicht von dem doppelten corejava irritieren, das ist nun einmal so bei mir.

Aber leider funktioniert es noch immer nicht. Der JCreator spuckt nach wie vor den gleichen fehler aus. Ich denke mal, dass liegt wirklich daran, dass ich keine Package habe, sondern nur einzelne Klassen.
Frage 4: Wie erstelle ich mir denn jetzt genau aus den vorhandenen Klassen ein Package?
Ich habe wohl schon mal gelesen, dass das mit dem Schlüsselwort
Code:
package
und dem tool "jar" funktioniert, bin mir aber nicht so sicher.

Frage 5: Kennt jemand von euch einen richtig guten Link zu dieser Classpath Geschichte, und zwar für Windows und nicht für Linux, oder Unix, oder so? (nicht, dass ich was gegen diese Betriebssysteme hätte, aber ich benutze nun mal zur Zeit Windows)

Also, vielen dank schon mal für eure Antworten.

Gruß
Maik
 

L-ectron-X

Gesperrter Benutzer
Damit der Compiler dein Programm übersetzen kann, musst du dein importiertes Package corejava auch auf deinem Rechner haben. Packages sind letztendlich nichts anderes als Verzeichnisse, in denen sich .java- bzw. .class-Dateien befinden.
Wenn dein Compiler nun das Programm ohne Fehler übersetzen soll, muss sich unterhalb der importierenden Klasse ein Verzeichnis namens corejava befinden, in dem dann die Klasse(n) des Packages corejava zu finden sind.
Die Klassen in diesem Verzeichnis/Package haben gleich zu Beginn ihres Quellcodes, also noch vor den import-Anweisungen, die Deklaration des Packages zu stehen.
Also:
Code:
package corejava;

Einen Classpath brauchst du also noch nicht zu setzen/verändern.
 

Kiamur

Aktives Mitglied
Hallo und Danke erst einmal!

Aber irgendwie verstehe ich es IMMER noch nicht :cry: .

Ich habe am Anfang meines Programms
Code:
import corejava.*;
stehen. Zugreifen will das Programm auf die Klasse Console.
In der Klassendefinition (.java-Datei) von Console steht in der ersten Zeile
Code:
package corejava;

Diese .java-Datei habe ich jetzt mal auf der Kommandozeile so kompiliert: javac Console.java

Heraus kommt ohne Fehlermeldung eine Datei Console.class. Diese .class-Datei habe ich jetzt in das Verzeichnis meines Programms kopiert, und dann versucht es auf der Kommandozeile zu kompilieren.
Als Fehlermeldung erhalte ich folgendes:

LotteryOdds.java:6: package corejava does not exist
.
.
.
bad class file: .\Console.class
class file contains wrong class: corejava.Console
Please remove or make sure it appears in the correct subdirectory of the classpath


Ich weiss echt nicht, was ich noch machen soll?

Bitte helft mir doch !!!!!

Gruß
Maik
 

Bleiglanz

Gesperrter Benutzer
wenn eine Klasse in einem Package liegt

dann MUSS die .java Datei in einem UNTERORDNER liegen, der genauso heisst wie das Package

also ein

foo.bar.pack.Console

würde einer Datei in der Ordnerstruktur

./foo/bar/pack/Console.java

entsprechen

gleiches gilt für die .class dateien
 

Kiamur

Aktives Mitglied
also, jetzt habe ich mal statt
Code:
import corejava.*;
Code:
import corejava.Console;
eingegeben, und das ganze im Verzeichnis meiner Hauptprogrammdatei in einen Unterordner corejava reinkopiert. Jetzt läuft es.

Aber so richtig schlau werde ich nicht daraus. Es kann doch nicht sein, dass ich bei jedem Projekt, das die Console Klasse benötigt immer wieder einen Unterordner corejava mit der Console.class Datei anlege.

Gibt es da nicht so was wie bei C/C++ mit den Headerdateien?!?

Habe nämlich das nächste Problem: möchte das "Toolkit" benutzen, und habe
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

eingebunden.

Wenn ich jetzt die Zeile
Code:
Toolkit tk = new Toolkit.getDefaultToolkit();
versuche, dann kennt er das wieder nicht: "cannot find symbol class getDefaultToolkit", obwohl das Beispiel 1:1 aus dem Buch abgeschrieben ist.

Was ist hier los?!?
 

AlArenal

Top Contributor
Das soll ja wohl so heißen:

Code:
Toolkit tk = Toolkit.getDefaultToolkit();
 

Kiamur

Aktives Mitglied
Okay, das war dann wohl meine Blödheit. Wieder mal den Wald nicht gesehen . . .

Aber was ist mit meinem anderen Problemchen, dass das Importieren SDK-fremder Klasse betrifft?

Außerdem habe ich die Sache mit dem Classpath auch noch nicht so ganz verstanden. Wofür brauche ich den denn nun genau, und warum kann ich damit nicht so etwas realisieren, dass ich nicht jedes Mal die benötigte Klasse in das Projektverzeichnis kopieren muss, sondern nur einmal per Classpath festlege, wo der "Pfad zu meinen zu importierenden Klassen" ist?
Dann könnte man doch alles was man irgendwann einmal braucht unter diesem Classpath ablegen, und der Javacompiler findet es dann auch.

Gruß
 

AlArenal

Top Contributor
Du solltest dir mal die Bedienungsanleitung zu deiner (mir unbekannten) IDE ansehen. NOrmalerweise gibts natürlich ne Möglichkeit andere Projekte oder JAR-Dateien mit einzubinden.
 

Kiamur

Aktives Mitglied
also zur Zeit mache ich ja alles über die Konsole. Aber weiter oben habe ich schon angegeben, dass ich den JCreator LE 3.50 verwende. Da habe ich leider noch keine Pfadangabe gefunden.

Aber welche Möglichkeiten habe ich denn, wenn ich aus der Konsole heraus kompiliere?

Aus euren spärlichen Antworten, was denn den classpath btrifft entnehme ich, dass der völlig unwichtig zu sein scheint. Sehe ich das richtig?
 

AlArenal

Top Contributor
Kiamur hat gesagt.:
also zur Zeit mache ich ja alles über die Konsole. Aber weiter oben habe ich schon angegeben, dass ich den JCreator LE 3.50 verwende. Da habe ich leider noch keine Pfadangabe gefunden.

Schon klar, nur kenne ich das Teil nicht und daher ist sie "mir unbekannt" :)

Aber welche Möglichkeiten habe ich denn, wenn ich aus der Konsole heraus kompiliere?

Dir mal anzulesen wozu JARs so da sind und sie entsprechend zu nutzen, das spart das rumkopieren irgendwelcher Packages. Über Kommandozeile ist das aber alles reichlich unkomfortabel.

Aus euren spärlichen Antworten, was denn den classpath btrifft entnehme ich, dass der völlig unwichtig zu sein scheint. Sehe ich das richtig?

Nein, das siehst du falsch :)
Aber der Classpath ist nichts, wo man alle Nase lang dran rummacht.
 

Kiamur

Aktives Mitglied
Zitat:
Aus euren spärlichen Antworten, was denn den classpath btrifft entnehme ich, dass der völlig unwichtig zu sein scheint. Sehe ich das richtig?


Nein, das siehst du falsch
Aber der Classpath ist nichts, wo man alle Nase lang dran rummacht.

Genau das will ich ja. Einmal einstellen, und dann immer alles in dieses Verzeichnis kopieren, was man öfters mal gebaruchen kann. Aber leider weiss ich nicht genau, wie ich den Classpath nun einstellen muss, denn ich habe mein 1. Beispiel ja schon zum laufen bekommen, aber eben nur, wenn ich ein Verzeichnis corejava in dem Projektordner anlege, wo dann die Klasse drin war. Aber wenn ich den Classpath auf ein Verzeichnis irgendwo im System zeigen lasse, wo eben diese Dateien auch drin sind, dann funktioniert es nicht. Also denke ich, dass ich Classpath-mäßig irgendwas noch nicht kapiert habe, obwohl ich
1. Alles so wie im Buch Core Java gemacht habe
2. Versucht habe mir Infos über Google zu besorgen.

Aber damit hat es ja nicht geklappt. Könnt ihr mir nicht mal ein Idiotensicheres Beispiel geben??

Gruß
Maik
 
N

na-oma

Gast
Nämmer ma an, du willst meine Highend-Library namens "highend" benutzen.
Diese habe ich in ein package namens "highend" gepackt, indem ich alle zugehörigen java-dateien in ein Verzeichniss namens "highend" gepackt und mit dem Schlüsselwort "package highend;" versehen habe. (packages sollten immer klein geschrieben werden, is son quasi-standard.

Dabei muss das Verzeichniss highend direkt in einem Verzeichniss liegen, welches du im CLASSPATH stehen hast.

meine Lib:

Datei "P.java" im Verzeichniss highend.

Code:
package highend; //muss der erste non-kommentar befehl sein

import java.util.*;	//nur mal so eingebunden, dass du weisst, wo das hinkommt...wird nicht benutzt

//geklaut bei [url]http://www.mindview.net/Books/TIJ/[/url]
public class P {

	public static void rint(Object o) {
		System.out.print(o);
	}

	public static void rintln(Object o) {
		System.out.println(o);
	}

	//muss man eigentlich für jeden nicht-object typ ne einzelne Funktion schreiben...
	public static void rint(int i) {
		System.out.print(i);
	}

	public static void rintln(int i) {
		System.out.println(i);
	}

}

Datei "Aquarium.java" im Verzeichniss highend.

Code:
package highend;

class Fisch {
	Fisch() {
		P.rintln("Fisch erstellt!");
	}
	
	void feed(Object o) {
		P.rint("Fisch isst: ");
		P.rintln(o);
	}
}


public class Aquarium {
	final Fisch singleFisch;
	
	public Aquarium() {
		singleFisch = new Fisch();
	}

	public void essensresteInsWasserStreuen(Object o) {
		singleFisch.feed(o);
	}
}

Datei "PTest.java" in "nahezu" beliebigem Verzeichniss. gehört ned zum Package, sondern nur zum Testen

Code:
import highend.*;

public class PTest {

	public static void main(String[] args) {

		P.rint("hallo");
		P.rintln("Welt");
		
		Aquarium aq = new Aquarium();
		aq.essensresteInsWasserStreuen(new P());

	}

}


nunja ich bin mit dem Package villeicht etwas übers Ziel hinaus geschossen :) ...wichtig ist:
-"import packagename.*;" wo du das package benutzen willst
-package-verzeichniss in nem Verzeichniss liegen haben, wo CLASSPATH drauf gesetzt ist. !!!
-"package packagename;" in jeder Datei die zum Package gehören soll. Diese Datei muss im Verzeichniss ./packagename liegen.

-bei "Unter-packages" also wie z.b. java.util ein Unterpackage vom Package java ist, muss eine Datei die in dieses Package gehört (z.B. java.util.ArrayList) im Verzeichniss ./java/util/ liegen, also ./java/util/ArrayList.java bzw. *.class

-man kann statt packages per import zu importieren auch direkt auf die Klassen zugreifen (da du grade von C++ geredet hast: das ist wie auf "std::cout" ohne "using namespace std;" zuzugreifen.)
das macht man so:

Der import-befehl kann, genau wie die c++-using-Klausel weggelassen werden, wenn man den vollen Klassennamen angibt:
Code:
public class PTest {

	public static void main(String[] args) {

		highend.P.rint("hallo");
		highend.P.rintln("Welt");
		
		highend.Aquarium aq = new highend.Aquarium();
		aq.essensresteInsWasserStreuen(new highend.P());

	}

}
ist äquivalent zum oberen PTest. Is allerdings mehr Schreibarbeit + Code schlechter lesbar.

So, das ist erstmal alles was ich so im Groben weiss, ich denke das reicht auch um alles zum funzen zu bringen und genau so eine Highend-Lib zu schreiben wie ich. :)
Probier mal meine Beispiele aus, geht wunderbar.

p.s.
wenn man zufällig zwei klassen mit dem selben namen aus verschiedenen packages importiert, dann meckert der Compiler, wenn man nur per ClassName.x() darauf zugreift. dann muss man auch den vollen Namen verwenden: java.util.ClassName.x(); und so...

http://www.mindview.net/Books/TIJ/ is ganz gutes buch, allerdings die ersten 200 seiten kein Praxis bezug, sollte man sich bei gelegenheit mal antuen, is aber etwas hardcore für meinen Geschmack.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
Michi__ Modulepath und Classpath fehlen Java Basics - Anfänger-Themen 2
A CLASSPATH Java Basics - Anfänger-Themen 4
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
A Class not found - Jar liegt am classpath Java Basics - Anfänger-Themen 2
J .classpath und .project? Java Basics - Anfänger-Themen 1
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
N Eclipse - eigene Icons unter ClassPath Resource Java Basics - Anfänger-Themen 0
C Die CLASSPATH Variable Java Basics - Anfänger-Themen 1
S Classpath: Alle .jars innerhalb eines Ordners einbinden Java Basics - Anfänger-Themen 4
S Classpath Findet die Klasse nicht classpath setzen? Java Basics - Anfänger-Themen 8
T File aus Classpath verwenden Java Basics - Anfänger-Themen 3
M Unterschied zwischen Classpath eines Eclipse Projektes und dem CLASSPATH? Java Basics - Anfänger-Themen 3
F Classpath Dateien einbinden und Classpath durchsuchen Java Basics - Anfänger-Themen 2
Q Classpath mit Text Editor progammieren (Classpath) Java Basics - Anfänger-Themen 5
B Umgebungsvariable + Classpath Java Basics - Anfänger-Themen 2
V Erste Schritte Ausführen mit cmd + Classpath Java Basics - Anfänger-Themen 13
H Classpath Eclipse? Java Basics - Anfänger-Themen 13
L Classpath anlegen Java Basics - Anfänger-Themen 6
P Classpath falscher Classpath, aber nicht immer Java Basics - Anfänger-Themen 19
H Classpath konnte nicht gefunden werden? Java Basics - Anfänger-Themen 2
C Java3d Classpath?!? Java Basics - Anfänger-Themen 11
M Classpath Jar nicht ausführbar, Classpath warscheinlich falsch Java Basics - Anfänger-Themen 10
M Classpath Java Basics - Anfänger-Themen 11
D Classpath compiler zur Laufzeit aufrufen & lib-classpath Java Basics - Anfänger-Themen 6
C Classpath Classpath in Jar Dateien Java Basics - Anfänger-Themen 15
J Classpath Java Basics - Anfänger-Themen 9
S ClassPath Java Basics - Anfänger-Themen 12
Z CLASSPATH + Packages Java Basics - Anfänger-Themen 6
J classpath Java Basics - Anfänger-Themen 10
S import - Anweisung; Setzen der Classpath Java Basics - Anfänger-Themen 2
J Frage zu jars/classpath Java Basics - Anfänger-Themen 7
K MySQL, Classpath, Java, MAC OSX Java Basics - Anfänger-Themen 3
D Classpath setzen Java Basics - Anfänger-Themen 4
J Classpath bestimmen, unter Windows 7 Java Basics - Anfänger-Themen 2
E Classpath Java Basics - Anfänger-Themen 4
B XOM...Classpath etc.??? Java Basics - Anfänger-Themen 2
L set Classpath für JDK Java Basics - Anfänger-Themen 2
L Lucene Classpath unter linux setzen Java Basics - Anfänger-Themen 8
B Classpath setzen - UNTER MAC OS X Java Basics - Anfänger-Themen 2
J classpath funktioniert nur in eclipse nicht auf der konsole?! Java Basics - Anfänger-Themen 6
P ClassPath in Ubuntu Java Basics - Anfänger-Themen 4
S dauerhafte CLASSPATH-Umgebungsvariable Java Basics - Anfänger-Themen 3
E Classpath Frage Java Basics - Anfänger-Themen 2
C Textpad, classpath, java = Probleme Java Basics - Anfänger-Themen 21
F probleme mit classpath/auslagerung von klassen Java Basics - Anfänger-Themen 5
L Classpath-Probleme Java Basics - Anfänger-Themen 2
A Classpath im manifest einbinden? Java Basics - Anfänger-Themen 3
GilbertGrape findet jar aus Classpath nicht Java Basics - Anfänger-Themen 4
Z Ant java -classpath befehl Java Basics - Anfänger-Themen 2
G Wo fnde ich den classpath, um dort z.b. eine html abzulegen? Java Basics - Anfänger-Themen 13
G Classpath Problem Java Basics - Anfänger-Themen 4
F Classpath problem Java Basics - Anfänger-Themen 2
G Classpath . zum Xten Mal Java Basics - Anfänger-Themen 16
G Plugins einbinden und Classpath setzen Java Basics - Anfänger-Themen 4
F Classpath: Wichtig für Runnable JAR? Java Basics - Anfänger-Themen 2
G unbound classpath container Java Basics - Anfänger-Themen 1
J Anfänger-Frage zu jar-Files / Manifest.mf / Classpath Java Basics - Anfänger-Themen 16
G Java mit libs und classpath? Java Basics - Anfänger-Themen 5
P JAR erzeugen-CLASSPATH-Probleme Java Basics - Anfänger-Themen 4
S CLASSPATH in Windows Java Basics - Anfänger-Themen 8
G JDBC - Classpath - Ich werd wahnsinnig! Java Basics - Anfänger-Themen 18
N Frage zur Classpath-Variable in der Manifest-Datei Java Basics - Anfänger-Themen 7
S CLASSPATH-Fehler Java Basics - Anfänger-Themen 8
K classpath eintrag funktioniert nicht Java Basics - Anfänger-Themen 8
T [Dringend] Classpath-Problem Java Basics - Anfänger-Themen 3
G Probleme mit JAVA_HOME bzw. classpath Java Basics - Anfänger-Themen 12
W classpath / jar / Programm aus Konsole Starten Problem Java Basics - Anfänger-Themen 2
G Eclipse, FatJar, Export, Classpath Java Basics - Anfänger-Themen 13
M Mal wieder der classpath. Java Basics - Anfänger-Themen 13
C Probleme mit .jar Datei und CLASSPATH Java Basics - Anfänger-Themen 2
G Classpath richtig setzen Java Basics - Anfänger-Themen 4
Q Classpath nach dem Deployen - Manifest-File Java Basics - Anfänger-Themen 4
T kopieren in den classpath Java Basics - Anfänger-Themen 4
F Frage zu Jars und Classpath Java Basics - Anfänger-Themen 2
D classpath setzen Java Basics - Anfänger-Themen 10
G Leidiges Thema Classpath Java Basics - Anfänger-Themen 5
C jar in jar - Classpath? Java Basics - Anfänger-Themen 12
D Applet starten (Classpath ? ) Java Basics - Anfänger-Themen 7
Z Jar-Archiv Classpath Variable Java Basics - Anfänger-Themen 6
L Classpath Java Basics - Anfänger-Themen 4
Q [javac] Zu blöd für -classpath? Java Basics - Anfänger-Themen 2
G Classpath JUnit geht net (?) Java Basics - Anfänger-Themen 11
A classpath zur Laufzeit erweitern Java Basics - Anfänger-Themen 4
H CLASSPATH unter j2sdk1.4.2_10 Java Basics - Anfänger-Themen 2
P Absolute Verzweiflung: Linux + Java + CLASSPATH Java Basics - Anfänger-Themen 8
G Wie muss classpath lauten? Package kompilieren/interpretiere Java Basics - Anfänger-Themen 4
L Schon wieder ClassLoader bzw. Classpath :-( Java Basics - Anfänger-Themen 3
S classpath Java Basics - Anfänger-Themen 6
A Classpath oder Path? Java Basics - Anfänger-Themen 7
A Umgebungsvariable Classpath Java Basics - Anfänger-Themen 8
C classpath in eclipse Java Basics - Anfänger-Themen 2
G Probleme mit Classpath Java Basics - Anfänger-Themen 4
X Classpath setzen Java Basics - Anfänger-Themen 5
G Problem mit classpath Java Basics - Anfänger-Themen 5
N Packages definieren bzw. zum Classpath hinzufügen Java Basics - Anfänger-Themen 4
G Classpath für Java in Suse 9 setzen Java Basics - Anfänger-Themen 2
R JAR wird nicht gefunden, ist aber im classpath. Java Basics - Anfänger-Themen 12
T Nerv! Packages und Classpath Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben