# SWT - Wie Windows erstelltes .jar auf einem MAC ausführen?



## Tinobee (7. Mrz 2008)

hallo,

ich muss eine auf einem windows pc erstellte arbeit in ein .jar file kompilieren und der empfänger benutzt einen mac. ich habe mal gelesen, dass es da zu problemen kommen kann beim ausführen. jedoch weiß ich nicht, wie ich das verhindern könnte. kann man das irgendwie abfangen? wenn ja, wie?

tinobee


----------



## Wildcard (7. Mrz 2008)

jars funktionieren, lediglich die nativen Bibliotheken (in deinem Fall SWT) musst du pro Plattform austauschen.


----------



## Tinobee (7. Mrz 2008)

hallo,

ich bin grad echt verzweifelt. ich kriegs net hin. ich muss meine anwendung mit ant kompilieren laut vorgabe und ich weiß nicht, was ich für dateien / ordner wohin kopieren muss, damit alles dabei ist. ich habe im buildpath meines projektordner unter SWT insgesamt 4 .jar archive stehen





> org.eclipse.swt
> org.eclipse.jface
> org.eclipse.core.commands
> org.eclipse.equinox.common


wenn ich diese jetzt in den lib ordner meines projektes lege, reicht das? und wie genau muss ich das austauschen, was du meintest? ich hab mir den ordner swt-3.3.1.1-carbon-macosx runtergeladen da ist nur ne swt.jar und ne swtdebug.jar enthalten. was muss ich jetzt genau holen und in welcher form wohin legen?

bitte entschuldigt, falls euch das zu einfach vor kommt, aber ich hab noch nie eine anwendung in ein jar exportiert und erst garnicht mit externen bibliotheken und ich will nicht, dass das ding bei meinem prof net läuft und ich durchfalle. bin echt sehr in panik, weil in 2,5 stunden abgabe ist und noch lange kein ende in sicht ist  - vieles läuft schief......

muss ich in der musterdatei noch was ändern? dazu steht in der anleitung nix. da steht nur ich soll das in eine build.xml schreiben und dann ein kommando aufrufen. muss ich da was austauschen?

```
<?xml version="1.0" encoding="UTF-8"?>
<project name="MeinProjekt" default="dist">
  <property name="MyApp" value="MeineAnwendung" />
  <path id="compile.classpath">
    <fileset dir="lib" />
    <pathelement path="bin" />
  </path>
  <target name="compile">
    <javac srcdir="src" destdir="bin">
      <classpath refid="compile.classpath" />
    </javac>
  </target>
  
  <target name="dist" depends="compile">
    <delete file="${MyApp}.jar"/>
    <delete file="dist/${MyApp}.zip"/>
    <mkdir dir="dist" />
    <jar jarfile="${MyApp}.jar"
         basedir="bin"
         manifest="manifest.txt" />
    <zip destfile="dist/${MyApp}.zip">
      <fileset dir="." includes="lib/*" />
      <fileset dir="." includes="${MyApp}.jar" />
    </zip>
  </target>
</project>
```

aktuell funktioniert das nicht. ich hab in zeile 1 unter "MeinProjekt" den namen des projektordners eingegeben und in zeile 2 unter "MeineAnwendung" den gewünschten programmnamen. und ich bekomme für den befehl ant -f build-jar.xml die fehlermeldung 





> build-jar.xml does not exist
> build failed!


rufe ich nur ant -f build.xml wird zwar compiliert, aber die anwendung startet mit einem "Could not find the main class" error und stürzt ab.


gruß, tino


----------



## Wildcard (7. Mrz 2008)

In 2 Stunden? Denke nicht das du das noch schaffst. Du musst Standalone SWT runterladen, den Library Path setzen, den Class-Path ins Manifest aufnehmen und kannst es für Macs nichtmal testen.
Vielleicht hilft dir diese Anleitung:
http://eclipsewiki.editme.com/CreateStandAloneApplication


----------



## Tinobee (7. Mrz 2008)

also wenn ich mich beeile, schaff ichs vielleicht noch. erste versuche, zu kompilieren, glückten zwar, aber ich bekomme probleme beim starten der anwendung. das des integrierten logwriters weiß ich ,dass es daran liegt





> org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: file:\E:\Studium\EclipseWorkspace\ProjectControl\MeineAnwendung.jar!\de\prog3SemesterAufgabe\tb\icons\pageWhite.png (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch))
> at org.eclipse.swt.SWT.error(SWT.java:3563)
> at org.eclipse.swt.SWT.error(SWT.java:3481)
> at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:156)
> ...


jedoch verstehe ich den grund nicht

die icons sind alle da und in eclipse läuft es doch primstens. was mache ich da falsch?


----------



## Wildcard (7. Mrz 2008)

Die Bilder liegen im jar. Du scheinst aber zu versuchen mit der File API darauf zuzugreifen. Das kann nicht funktionieren, da es keine Dateien, sondern Entries in einer jar sind.
getClass().getResourceAsStream


----------



## Tinobee (7. Mrz 2008)

was kann ich denn nur machen? ich packs nicht


----------



## Wildcard (7. Mrz 2008)

Was genau hast du an der Antwort nicht verstanden? new File(...) funktioniert nicht mit Resourcen die im jar liegen.


----------



## Tinobee (7. Mrz 2008)

Wildcard hat gesagt.:
			
		

> Was genau hast du an der Antwort nicht verstanden?


 ich hab nicht verstanden, was ich ändern muss. ich bin mit dieser sachen noch total unerfahren. ich bin allgemein noch total unerfahren. ich verstehe die zusammenhänge nicht und weiß nicht, ob ich jetzt was in meiner build.xml ändern muss oder meiner mainfest.txt . das ist das problem. ich bin wirklich gewillt, das zu lernen und zu verstehen. im augenblick (T-60 min) hilft mir nur noch ne klare ansage, was ich wo ändern muss. damit es endlich läuft...

ich bin genau nach dieser anleitung vorgegangen


----------



## Wildcard (7. Mrz 2008)

Im Code. Dort wo du versuchst Bilder zu laden.


----------



## Tinobee (7. Mrz 2008)

ich hab die pfade alle extra realtiv gestaltet um das zu verhindern

```
newProjectMenuItem.setImage(new Image( display, getClass().getResource("/de/prog3SemesterAufgabe/tb/icons/pageWhite.png").getFile()));
```


----------



## Wildcard (7. Mrz 2008)

getFile geht aber nicht. Es *ist* keine Datei.


----------



## Tinobee (7. Mrz 2008)

wie kann ichs sonst lösen und dabei relativ bleiben? und warum läuft es so in eclipse? PS: für mein laienhaftes verständnis ist ein bild eine datei 
 :bahnhof:


----------



## Wildcard (7. Mrz 2008)

Weil das Zeug in Eclipse noch kein zip ist, du also noch eine Datei hast.
Ich hab's dir doch schon gesagt, benutz getResourceAsStream


----------



## Tinobee (7. Mrz 2008)

```
newProjectMenuItem.setImage(new Image( display, getClass().getResourceAsStream("/de/prog3SemesterAufgabe/tb/icons/pageWhite.png")));
```
so?


----------



## Wildcard (7. Mrz 2008)

Und ja, in deinem Fall ist dein Bild natürlich eine Datei, aber dann packst du alles in ein zip (bzw. jar) und damit ist es keine Datei mehr, sondern ein Eintrag in deinem Zip Archiv. Yet another bunch of bytes...


----------



## Wildcard (7. Mrz 2008)

Tinobee hat gesagt.:
			
		

> ```
> newProjectMenuItem.setImage(new Image( display, getClass().getResourceAsStream("/de/prog3SemesterAufgabe/tb/icons/pageWhite.png")));
> ```
> so?


Ja, wenn der Pfad passt. Bei SWT verwendet man normalerweise eine ImageRegistry, aber dafür wird wohl keine Zeit mehr bleiben...


----------



## Tinobee (7. Mrz 2008)

also ich hab den code geändert. er ist zumindest fehlerfrei. jetzt bekomme ich beim starten die exeption





> Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-carbon-3347 or swt-carbon in swt.library.path, java.library.path or the jar file


dann muss ich die wohl noch hinkopieren und die manifest anpassen


----------



## Wildcard (7. Mrz 2008)

Die Lib muss im library path liegen. Auf deinem Windows Rechner läuft das natürlich sowieso nicht mit dem Mac SWT.


----------



## Tinobee (7. Mrz 2008)

ich hab mir die datei swt-3.3.1.1-carbon-macosx.zip runtergeladen und in den lib ordner gelegt und die manifest geupdatet auf 





> Manifest-Version: 1.0
> Main-Class: de.prog3SemesterAufgabe.tb.GUI
> Class-Path: . lib/org.eclipse.core.commands_3.3.0.I20070605-0010.jar lib/org.eclipse.equinox.common_3.3.0.v20070426.jar lib/org.eclipse.jface_3.3.1.M20070910-0800b.jar lib/org.eclipse.swt.win32.win32.x86_3.3.2.v3347a.jar lib/swt-3.3.1.1-carbon-macosx.zip


und bekomme noch dasselbe problem. ich hab sonst keine *carbon* datei finden können oder im buildpath stehen?
jetzt sind dann wohl diese gemeint





> 22.10.2007  19:28            30.608 libswt-agl-carbon-3347.jnilib
> 22.10.2007  19:28           274.808 libswt-carbon-3347.jnilib
> 22.10.2007  19:28            76.784 libswt-cocoa-carbon-3347.jnilib
> 22.10.2007  19:28           798.028 libswt-pi-carbon-3347.jnilib
> ...


was mach ich mit denen? einfach in den lib ordner und jede einzeln noch in die manifest adden?


----------



## Wildcard (7. Mrz 2008)

Wird wohl im zip sein...


----------



## Tinobee (7. Mrz 2008)

nope, aber nachdem ich das jetzt gemacht hab, hab ich die jnilib dateien alle im lib folder zusammen mit der *carbon*.zip und den übrigen 4 .jars - außerdem hab ich aus der swt-3.3.1.1-carbon-macosx.zip noch die swt.jar mit ins lib gelegt und in die mainfest geaddet. aber es geht immernoch nicht. der meckert immernoch über diese dateien obwohl ich die manifest.txt angepasst hab

du sagtest vorhin, ich müsse  lediglich die nativen Bibliotheken austauschen. wie mache ich das? und wenn ich die austausche, fehlen sie dann nicht für windows?

PS: Danke, dass du mir beistehst!!!


----------



## Wildcard (7. Mrz 2008)

leg sie doch daneben und setz das property java.library.path oder swt.library.path, oder kopier alles in java/bin.
Wie gesagt, laufen wird es sowie nicht mit dem Mac Kompilat


----------



## Tinobee (7. Mrz 2008)

ich verstehe nicht, was du meinst mit daneben und dem property. wo daneben und welches property? ich hab auch keinen ordner java/bin. ich hab jetzt alle files aus dem lib ordner nach jdk/bin und jre/bin kopiert. das sind im ganzen diese





> 22.10.2007  19:28            30.608 libswt-agl-carbon-3347.jnilib
> 22.10.2007  19:28           274.808 libswt-carbon-3347.jnilib
> 22.10.2007  19:28            76.784 libswt-cocoa-carbon-3347.jnilib
> 22.10.2007  19:28           798.028 libswt-pi-carbon-3347.jnilib
> ...


aber es will einfach nicht laufen wegen dieser doofen *carbon* sache. ich blick da echt nicht durch. hätte im leben nicht gedacht, dass das sooooo kompliziert ist


----------



## Tinobee (8. Mrz 2008)

so, game over!  :cry: 

danke nochmal für deine geduld und unterstützung!

würde nach wie vor gern noch wissen, was du zuletzt gemeint hast. ich bin der einzige in meinem kurs, der die gui mit swt gebaut hat. hab das im rahmen des projektes gelernt und bin echt noch grün hinter den ohren damit. ich kenne von meinen leuten niemanden, der mir bei der problematik helfen könnte, da meist swing oder python verwendet wurde.

würde mich also über eine antwort trotz der abgelaufenen frist noch sehr freuen.

.... zeit fürs bett.... hab viel nachzuholen :autsch: 

gruß, tino


----------



## Wildcard (8. Mrz 2008)

Steht doch alles in dem Link den ich dir weiter oben gepostet habe. Ob nun Windows oder Mac ist für die Systematik egal.


----------

