Créer de la croix-plate-forme Java SWT Application
J'ai écrit une IHM Java à l'aide de SWT. Je le package de l'application à l'aide d'un script ANT (fragment ci-dessous).
<jar destfile="./build/jars/swtgui.jar" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="org.swtgui.MainGui" />
<attribute name="Class-Path" value="." />
</manifest>
<fileset dir="./build/classes" includes="**/*.class" />
<zipfileset excludes="META-INF/*.SF" src="lib/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f.jar" />
</jar>
Cela produit un seul pot sur Windows j'suffit de double cliquer pour lancer mon GUI. L'inconvénient, c'est que j'ai eu explicitement package windows SWT paquet dans mon bocal.
Je voudrais être en mesure d'exécuter mon application sur d'autres plates-formes (principalement Linux et OS X). La façon la plus simple serait de créer de la plate-forme de pots qui a emballé les appropriée SWT fichiers dans des Pots séparés.
Est-il une meilleure façon de le faire? Est-il possible de créer un seul POT qui fonctionne sur plusieurs plates-formes?
Vous devez vous connecter pour publier un commentaire.
Je viens de lancer dans le même type de problème. Je n'ai pas encore essayé, mais j'ai l'intention d'inclure les versions de
swt.jar
pour toutes les plates-formes et de charger la bonne dynamique du début de lamain
méthode.Mise à JOUR: Il a travaillé.
build.xml
comprend tous les pots:et mon
main
méthode commence avec l'appel de cette:[EDIT] Pour ceux qui recherchent le "pot-en-pot chargeur de classe": Il est inclus dans l'Éclipse du JDT (Java IDE construit sur Eclipse). Ouvrir
org.eclipse.jdt.ui_*version_number*.jar
avec un outil d'archivage et vous trouverez un fichierjar-in-jar-loader.zip
à l'intérieur.org.eclipse.jdt.*
org.eclipse.jdt.ui_*version_number*.jar
avec un outil d'archivage et il devrait avoir le fichierjar-in-jar-loader.zip
à l'intérieur. (J'ai 3.5.1 installé ici, mais je m'attends à 3.6 ne devrait pas être différent.)sun.arch.data.model
pour obtenir la JVM de l'architecture. stackoverflow.com/questions/2062020/...J'ai un travail de mise en œuvre qui est maintenant référencé à partir de la SWT FAQ.
Cette approche est maintenant disponible pour l'utiliser comme une tâche ANT: SWTJar
[MODIFIER] SWTJar a maintenant été mis à jour pour utiliser Alexey Romanov solution comme décrit ci-dessus.
build.xml
J'ai d'abord construire un bocal contenant l'ensemble de mes classes de l'application.
Ensuite, je construis un pot pour contenir tous les éléments suivants:
Voici le fragment de build.xml.
TraceClientLoader.java
Cette classe loader utilise le pot-en-pot-chargeur pour créer un chargeur de classe qui charge les classes de deux pots.
Une fois que nous avons ce chargeur de classe, nous pouvons lancer l'application principale méthode à l'aide de la réflexion.
[EDIT] Comme indiqué ci-dessus, pour ceux qui recherchent le "pot-en-pot chargeur de classe": Il est inclus dans l'Éclipse du JDT (Java IDE construit sur Eclipse). Open org.eclipse.jdt.ui_*version*.pot avec un outil d'archivage et vous trouverez un fichier jar-in-jar-loader.zip à l'intérieur. J'ai renommé ce jar-in-jar-loader.jar.
intrace-ui.jar - c'est le pot que j'ai construit à l'aide de la procédure décrite ci-dessus. Vous devriez être en mesure de l'exécuter seul bocal sur l'un de win32/64, linux32/64 et osx32/64.
[MODIFIER] Cette réponse est maintenant référencé à partir de la SWT FAQ.
D:\My Dropbox\Java\kEllyIRClient\swtjar-build.xml:16: The archive swtjar.jar doesn't exist
. Le taskdef a le droit classpath path, parce que si vous changer, il se plaint à ce sujet. Je n'ai aucune idée de la façon d'obtenir ce travail, et je préfère le faire à l'aide de votre tâche, que manuellement mettre en œuvre le reflet des choses.si vous n'êtes pas à la recherche de rouler le tout dans un seul fichier jar et l'utilisation pot-en-pot puis vous pouvez également résoudre ce problème en incluant nommé SWT pots pour chaque plate-forme cible dans votre application déployée le répertoire lib:
et le chargement de la bonne dynamiquement à l'exécution, par l'inspection de l'propriétés système Java
"os.name"
et"os.arch"
au moment de l'exécution à l'aide deSystem.getProperty(String name)
pour créer le bon nom de fichier jar.Vous pouvez ensuite utiliser un peu coquine peu de réflexion (OO puristes regarder loin maintenant!) en invoquant l'normalement protégée méthode
URLClassloader.addURL(URL url)
pour ajouter le bon pot pour le système de chargeur de classe classpath de l'avant de la première SWT classe est nécessaire.Si vous pouvez supporter le code-odeur j'ai mis un exemple ici http://www.chrisnewland.com/select-correct-swt-jar-for-your-os-and-jvm-at-runtime-191
Il est très étrange que toutes les réponses ici juste conseille pour emballer tous SWT Bocaux dans un seul géant application fichier JAR. À mon humble avis, c'est strictement l'encontre de l'objet de SWT: il y a un SWT bibliothèque pour chaque plate-forme, de sorte qu'il est censé paquet seul le SWT bibliothèque pour chaque plate-forme. C'est très facile à faire, il suffit de définir 5 de créer des profils dans votre ANT: win32, win64, linux32, linux64 et mac64 (vous pouvez le faire mac32 ainsi, mais tous les Macs sont de 64 bits).
De toute façon, si vous voulez avoir une bonne intégration de l'application dans l'OS, alors vous aurez à faire quelques OS spécifique de choses et vous êtes à établir des profils de nouveau. Pour l'application de bureau c'est pas pratique pour un package d'application pour toutes les plates-formes à la fois pour les développeurs et pour ses utilisateurs.
Remplacer le gras le texte sélectionné dans la src="lib/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f.jar" avec linux-spécifié swt jar-file