2011-06-04 3 views
1

Je travaille sur une application Java qui est bien sûr censé fonctionner sur les principaux systèmes d'exploitation d'une clé USB. Pour les utilisateurs Mac, j'ai regroupé les pots (application et mise à jour) dans les programmes Apple .app. Maintenant: quelle est la meilleure façon de laisser les jars se lancer l'un l'autre et d'utiliser le chemin relatif du dossier sur le bâton. Je demande parce que j'ai remarqué que sur un Mac, c'est comme si le dossier .app est le fichier lancé (et non le jar à l'intérieur) et donc le répertoire parent est le répertoire de travail où tous mes fichiers seront stockés. Sous Windows et Linux, c'est juste un dossier MyApp.app et les fichiers seront à l'intérieur. Est-ce que le changement de casse et de chemin par code est vraiment le seul moyen de résoudre ce problème? Merciprogrammes Java sous Windows, Mac et Linux (Unix)

Répondre

2

Vous pouvez demander à la machine virtuelle Java pour l'emplacement physique d'une classe donnée. De http://www.exampledepot.com/egs/java.lang/ClassOrigin.html:

// Get the location of this class 
Class cls = this.getClass(); 
ProtectionDomain pDomain = cls.getProtectionDomain(); 
CodeSource cSource = pDomain.getCodeSource(); 
URL loc = cSource.getLocation(); // file:/c:/almanac14/examples/ 

Cela fonctionne même pour pot-fichiers.

Lorsque vous connaissez l'emplacement, vous pouvez naviguer à partir de là.

+0

je besoin de l'emplacement de la classe pour le faire, ou que je reçois quelque chose de mal? Un problème est également que les fichiers jar nécessaires dans le dossier .app ne se trouvent pas dans un dossier lib, donc lorsque vous lancez console/runtime, ClassNotFoundExceptions sont lancés. – Magreet

+0

J'ai une solution de contournement en 1. Regroupant le .app 2. En entrant dans le fichier .app et en déplaçant les fichiers jar dans un dossier lib 3. En commençant par .app doubleclick et par Runtime.getRuntime(). Exec() fonctionne ... Mais ce n'est pas joli: -/ – Magreet

+0

Cela sonne comme si vous ne le faites pas comme prévu. Vous devriez utiliser le bundler officiel Apple Jar pour créer un joli paquet. –

1

La meilleure option serait de créer des lanceurs pour chacun des systèmes d'exploitation et de ces lanceurs appellent la machine virtuelle Java pour exécuter pot de. Pour Linux faire un script shell, sur Mac ce serait .app (ou script shell aussi) et sur Windows un .bat ou un exécutable fonctionnerait.

+0

Oui, c'était mon intetion, mais ces jars doivent aussi "communiquer" – Magreet

+0

Cela dépend de l'application Normalement, vous seriez en mesure de faire des objets hors des classes de ces pots s'ils sont dans classpath. – Xolve

Questions connexes