Ich habe ein Problem mit meinem jar Archiv.
Ich habe da Ordner drin(Sound,Bilder,org).
Wenn ich die Datei vom Desktop starte läuft das Prog nicht an.
Dazu brauche ich den org Ordner auch auf dem Desktop.Dann gehts.
Ist komisch weil die anderen Ordner brauch er ja auch nicht.
Im org Ordner befinden sich SystemTray Klassen.
Hat jemand damit schon mal Erfahrung gemacht?
Hallo,
das sieht wie nach einem falsch gesezten Classpath aus. Also, der org-ordner ist mit 99,99% Wahrscheinlichkeit ein von der Main-Klasse importiertes Package - wenn der noch Unterordner hat, zähl nochmal 0.01% dazu. :wink:
Wenn du das jar so startest:
Code:
javaw -jar jarfile Klassenname
oder so:
Code:
javaw -jar jarfile
wird dabei kein ClassPath gesetzt. Im zweiten Codebeispiel wird die Main-Class anhand des im jar gespeicherten Manifests ermittelt. Die Windows-Dateiverknüpfung - ich denk mir mal, mit dem Desktop meinst du jetzt nicht unbedingt den von GNOME unter Linux - macht in etwa sowas mit jar-files:
Code:
javaw -jar %1
Dabei steht %1 für das Objekt, auf das im Explorer oder auf dem Desktop gedoppelklickt wird.
Was immer geht ist ein explizites setzen des CLASSPATH in das Jar hinein, etwa so (Dosboxmäßig):
Code:
javaw -cp .;jarfile Klassenname
nur das geht dann eben schlecht als Dateiverknüpfung.
Du kannst diese Dateiverknüpfung aber auch tunen. Das geht mit den Ordneroptionen, Reiter Dateitypen. Bearbeite den Vorgang open so, dass in etwa folgendes drinsteht (Anwendung für den Vorgang):
Code:
javaw -cp ".;%1;%CLASSPATH%" "%1"
dann ist das jar auch im Klassen-Suchpfad und das org.bladibla-Paket sollte auch gefunden werden können. Sprich: ich hab's noch nicht probiert, mir ist der Start über die Kommandozeile da lieber - soll ja auch Proggies geben die im catch-Block für irgendwelche Exceptions ein System.err.println("Oops"); haben, davon sieht man bei Verwendung von javaw eben nix.
Danke für die Antwort.Ich kann damit leider nicht viel anfangen.
Er findet das org package nicht. Aber warum? Was muß ich beim Erstellen ändern?
In der Startklasse habe ich das eingefügt:
Ich erstelle eine "manifest.txt =>Inhalt: Main-Class: Meine Startklasse" Datei im Order wo die Klassen liegen.
Dann Ausführen und cmd aufrufen und in den Ordner gehen wo die Klassen liegen.
Dann gebe ich "jar -cmf manifest.txt Test.jar *.*" ein.
Und das *.* steht doch für alles was im Ordner ist.Die anderen Ordner gehen ja auch.
Dann Ausführen und cmd aufrufen und in den Ordner gehen wo die Klassen liegen.
Dann gebe ich "jar -cmf manifest.txt Test.jar *.*" ein.
Und das *.* steht doch für alles was im Ordner ist.Die anderen Ordner gehen ja auch.
Wenn du zuerst in den org-Ordner wechselst, werden die darin enthaltenen Klassen und die Ordner als Verzeichnis-Root im Jar eingefügt. Im Klartext: die ganze Paketstruktur ist futsch. Im Jar ist kein Verzeichnis .\org\amdesign\beans\systrayicon, sondern die zum Paket gehörenden Klassen liegen im root-Verzeichnis des Archivs.
Die JVM erwartet aber eine Klasse aus einem Paket org.amdesign.beans.systrayicon in einem Verzeichnis org\amdesign\beans\systrayicon, das im CLASSPATH (in diesem Fall: im JAR) liegt.
Probiers mal so: Nicht in das Verzeichnis wechseln, stattdessen (aus dem Verzeichnis, welches org enthält):
Code:
jar -cmf manifest.txt Test.jar *.class org bilder undwassonstnoch
Nach dem *.class kommen die ganzen Ordner. Damit ist org\amdesign mit allen Unterordnern ins JAR aufgenommen, inclusive der Verzeichnisstruktur. Jetzt kann die JVM die Importe der org-Pakete wieder in eine entsprechende Verzeichnisstruktur auflösen, mit dem JAR als root-Verzeichnis.
Danke Dir für die Antwort.
Leider funktioniert es denn auch nicht.
Die anderen Pfade hat er ja auch, wie Bilder oder Sound Ordner.
Es geht nur bei dem org Ordner nicht.
Woran kann das nur liegen?
Hab mal in des SysTray-Code reingelinst. Der hat einen statischen (Klassen)-Konstruktor:
Code:
static
{
try
{
System.loadLibrary("org/amdesign/beans/systrayicon/resources/SysTrayIcon");
}
catch(UnsatisfiedLinkError unsatisfiedlinkerror)
{
System.out.println("Could not find the SysTrayIcon.dll. Program exit!");
System.exit(0);
}
}
Und zu System.loadLibrary meint die API:
public static void loadLibrary(String libname)
Loads the system library specified by the libname argument. The manner in which a library name is mapped to the actual system library is system dependent.
...
Throws:
...
UnsatisfiedLinkError - if the library does not exist.
Soll heissen: Die VM kriegt das rausschälen aus dem JAR zwar gebacken, nicht aber Windoof. Das schert sich nicht um ClassPathes...
Kam mir gleich komisch vor, dass SysTrayIcon als ZIP vertrieben wird, nicht als JAR - und dass beim Auspacken die Verzeichnisstruktur erstellt wird, aber kein JAR dabei ist. Das Teil läuft halt entschiedenermassen nur unter Windows, das hat wenigstens ein System Tray (schon bei Linux' KDE sieht das ganz anders aus).
Ich denke, man könnt's mit Rumpuhlen in der Source sogar hinkriegen. Dazu bräucht man aber grünes Licht vom Autor, der sich leider auch auf seiner Seite zu Lizenzbedingungen nicht weiter äußert. Eventuell hilft auch eine Mail direkt an info@amdesign.org