Einsatz von CLASSPATH

ExceptionOfExpectation

Bekanntes Mitglied
Hallo,
ich behandle gerade das Thema "CLASSPATH-Variable", leider komme ich mit der Verwendung nicht so voran.
Als ich einen Pfad mit dem Name "CLASSPATH" in der "Umgebungsvariablen" erstellt habe, wurde die ganze JDK-Package larmgelegt und es konnte kein Java-Befehl in der PowerShell aufgerufen werden. Danach habe ich mit Mühe und nach mehreren Neustartversuchen geschafft die Variable zu löschen.
Der Pfad sollte zu allgemeinen Resourcen führen, wie Images usw. So wie ich es verstanden habe, blockt die CLASSPATH-Variable die andere Variable, die zur Java(jdk-packages) führt. Nachhinein habe ich gelesen, dass man nach dem Semikolon weitere Pfade einbringen kann.

Daher die Frage, wie kann ich die CLASSPATH-Variable einfügen ohne den Java-Package zu beeinträchtigen und wie kann man den Pfad am besten in der Anwendung aufrufen?

PS.: Der Link für die ähnliche Frage hat nicht funktioniert.
 
Habe alles durchgelesen, leider gibt er keine Erklärung, wie man Classpath-Variable risikofrei in das Betriebssystem integriert, wie man Classpath kurzfristig im PowerShell/cmd definiert und einen Pfad zuweist oder wie ich einen Ressourcen-Pfad durch die Classpath-variable in meiner Applikation verwende, sei es durch getClass().getSystemRessource/AsStream() oder durch andere Paths-Methoden.
Oder mein ganz einfaches Beispiel:
[CODE lang="java" title="Auschnitt"]...

icon = new ImageIcon("icons/Add16.gif", "message"); //HIER HANDELT ES SICH UM EINEM GANZ EINFACHEN PFAD (NICHT CLASSPATH)
lab = new JLabel("ICON", icon, JLabel.CENTER);
...[/CODE]
Der Ordner "icons"(mit dem GIF-Icon) liegt im selben Package wie die Applikation selbst, aber es wird nur der JLabel angezeigt mit dem Inhalt "ICON". Das Icon selbst wird aber nicht angezeigt, kann nicht verstehen warum.
 
Habe alles durchgelesen, leider gibt er keine Erklärung, wie man Classpath-Variable risikofrei in das Betriebssystem integriert, wie man Classpath kurzfristig im PowerShell/cmd definiert und einen Pfad zuweist

Sieh es als dezenten Hinweis, dass man die CLASSPATH-Variable nahezu nie benutzt 😉


[…]wie ich einen Ressourcen-Pfad durch die Classpath-variable in meiner Applikation verwende, sei es durch getClass().getSystemRessource/AsStream() oder durch andere Paths-Methoden.
Oder mein ganz einfaches Beispiel:
[CODE lang="java" title="Auschnitt"]...

icon = new ImageIcon("icons/Add16.gif", "message"); //HIER HANDELT ES SICH UM EINEM GANZ EINFACHEN PFAD (NICHT CLASSPATH)
lab = new JLabel("ICON", icon, JLabel.CENTER);
...[/CODE]
Der Ordner "icons"(mit dem GIF-Icon) liegt im selben Package wie die Applikation selbst, aber es wird nur der JLabel angezeigt mit dem Inhalt "ICON". Das Icon selbst wird aber nicht angezeigt, kann nicht verstehen warum.
Das Laden von Resourcen wird in @mihe7's Beitrag doch relativ ausführlich erklärt.

Das Problem mit dem ImageIcon ist, dass der Konstruktor einen Datei-Pfad erwartet, also eine Datei in normalen Dateisystem, keinen Resource-Pfad. Wenn du eine Resource nutzt, müsstest du den Konstruktor mit URL nutzen.
 
Sieh es als dezenten Hinweis, dass man die CLASSPATH-Variable nahezu nie benutzt 😉
ich finde die Möglichkeit, Ressourcen einmalig auf dem Rechner zu speichern und dann auf diese Ressourcen aus jeder Applikation durch den Absoluten-Pfad zu greifen zu können, sehr verlockend. Dafür eignet sich die Classpath-Variable sehr gut, oder?
Was das ImageIcon betrifft, habe den Unterschied zwischen Datei-Pfad und Ressourcen-Pfad nicht ganz verstanden. Meinst du die Schreibweise von der Zeichenkette?
 
wie man Classpath-Variable risikofrei in das Betriebssystem integriert
Gar nicht.

Der Ordner "icons"(mit dem GIF-Icon) liegt im selben Package wie die Applikation selbst, aber es wird nur der JLabel angezeigt mit dem Inhalt "ICON". Das Icon selbst wird aber nicht angezeigt, kann nicht verstehen warum.
Warum? Das hast Du eigentlich schon als Kommentar danebengeschrieben: Du versuchst hier einfach eine Datei zu laden. Der Pfad ist relativ angegeben und damit abhängig vom aktuellen Arbeitsverzeichnis.

ich finde die Möglichkeit, Ressourcen einmalig auf dem Rechner zu speichern und dann auf diese Ressourcen aus jeder Applikation durch den Absoluten-Pfad zu greifen zu können, sehr verlockend. Dafür eignet sich die Classpath-Variable sehr gut, oder?
Ressourcen gehören in der Regel zum Programm. Diese Ressourcen werden mit dem Programm ausgeliefert und können dann einfach per getResource/getResourceAsStream geladen werden.

Solltest Du tatsächlich Resourcen zwischen verschiedenen Apps teilen wollen (z. B. weil große Dateien per Installer an einen gemeinsam verwendeten Ort gelegt werden), dann kannst Du das ja problemlos über das Dateisystem regeln.

Natürlich kannst Du dafür auch eine eigene Umgebungsvariable verwenden, z. B. MY_APP_RESOURCES=C:\shared\myapp\resources. Dann liest Du die halt im Programm aus (z. B. System.getenv("MY_APP_RESOURCES")) und verwendest den Pfad ganz normal wie jeden anderen auch.

Alternativ bietet sich an, die Pfade über die Preferences API zu verwalten, das hängt von der Anwendung ab.

Auch möglich wäre es, die Umgebungsvariable bei der Ausführung in den Classpath zu integrieren:
Code:
java -cp oneapp.jar;%MY_APP_RESOURCES% my.app.App
java -cp otherapp.jar;%MY_APP_RESOURCES% my.otherapp.App

Kurz: Möglichkeiten gibt es viele.
 
Was wurde denn noch nicht beantwortet?

Dieser Part:
Das Problem mit dem ImageIcon ist, dass der Konstruktor einen Datei-Pfad erwartet, also eine Datei in normalen Dateisystem, keinen Resource-Pfad. Wenn du eine Resource nutzt, müsstest du den Konstruktor mit URL nutzen.
Verstehe nicht warum der ImageIcon-Konstruktor, den ich mit dem String Parameter benutze, keinen Icon erzeugt. Ich habe in der Dokumentation gelesen und habe nichts gefunden, was dagegen spricht. Das ist die ZeichenKette von dem Pfad: "icons/Add16.gif" und dieser Verzeichnis existiert zusammen mit dem Icon. Es handelt sich hier um einen Datei-Pfad.
 
Das Verzeichnis existiert in deinem aktuellen Arbeitsverzeichnis? Also dort, wo du die Anwendung startest, nicht im Source-Ordner oder irgendeinem Package?

Wenn es eine Resource ist, also zB in einem Package liegt, musst du es explizit als Resource laden, und die URL dann nutzen.
 
Verstehe nicht warum der ImageIcon-Konstruktor, den ich mit dem String Parameter benutze, keinen Icon erzeugt.
Ich will ja nichts sagen, aber genau darum dreht sich der verlinkte Artikel aus #2 und auch hier in #9 und #11 wurde die Frage beantwortet und @mrBrown hat es jetzt in #15 nochmal geschrieben: eine relative Pfadangabe bezieht sich auf das aktuelle Arbeitsverzeichnis.

Führst Du Dein Programm unter C:\ aus (Arbeitsverzeichnis ist C:\), muss das Bild unter C:\icons\Add16.png zu finden sein. Führst Du das Programmm unter C:\XYZ (Arbeitsverzeichnis ist C:\XYZ) aus, muss das Bild unter C:\XYZ\icons\Add16.png zu finden sein.
 
Das Verzeichnis existiert in deinem aktuellen Arbeitsverzeichnis? Also dort, wo du die Anwendung startest, nicht im Source-Ordner oder irgendeinem Package?

Wenn es eine Resource ist, also zB in einem Package liegt, musst du es explizit als Resource laden, und die URL dann nutzen.
Ja, genau wo die Anwendung (kompilierte Datei) sich befindet, dort befindet sich auch das Verzeichnis.

Ich verwende noch keinen Source-Order
 

Anhänge

  • TestApp.java
    TestApp.java
    810 Bytes · Aufrufe: 0
  • Add16.gif
    Add16.gif
    238 Bytes · Aufrufe: 0
Du kannst ja mal eine Ausgabe machen von new File("icons/Add16.gif").getAbsolutePath() - dann siehst Du, an welcher Stelle er es versucht zu finden.

Nur weil da sich die kompilierte Datei befindet hat das noch nichts zu sagen!
 
was für beide? Ich habe nur diese eine Ausgabe durch:
Java:
System.out.println(new File("icons/Add16.gif").getAbsolutePath());
C:\Users\IRahi\Desktop\Java\Studienhefte\Jav05\Lektion4\icons\Add16.gif
 

Zurück
Oben