2010-11-11 25 views
2

Beaucoup de gens ont le problème que quand ils commencent à partir de nautilus une application JAR, que le CWD (Current Working Directory) est défini dans leur dossier de base (et non le dossier dans lequel le JAR est). C'est un bug dans Nautilus, pas spécialement Linux.Java + Linux: Répertoire de travail est mon dossier de base

Si vous connaissez une astuce pour faciliter le démarrage d'un Jar au lieu d'ouvrir un terminal et d'y entrer manuellement java -jar myJar.jar, veuillez l'indiquer ci-dessous.

Merci


Un court exemple de code du problème:

File f = new File("ASimpleTextFile.txt"); 
System.out.println(f.getAbsolutePath()); 

Sous Windows, cette impression: [The Path To The Jar]/ASimpleTextFile.txt
Mais sous Linux, il imprime: /home/[yourName]/ASimpleTextFile.txt

C'est une très mauvaise idée car nous utilisons souvent des chemins relatifs aux fichiers de configuration. De cette façon, ils ne seront pas trouvés, car le fichier pointe vers le dossier homefolder.

+2

De quelle manière votre programme Java utilise-t-il le répertoire courant? Vous ne pouvez même pas faire 'chdir' en Java, donc, l'idée est que votre programme devrait être cwd-agnostique. –

+0

@Chris: Pas du tout vrai; J'utilise souvent le répertoire courant pour écrire des données, exigeant que l'utilisateur configure l'application pour que le répertoire actuel soit là où il veut écrire les données. –

+1

@Software Monkey: c'est une approche judicieuse lorsque votre application est une application de ligne de commande. Mais pour une application d'interface utilisateur, il ne devrait y avoir aucune dépendance sur le répertoire en cours (sauf peut-être en tant que l'emplacement par défaut des boîtes de dialogue d'ouverture de fichier ou des choses similaires). –

Répondre

0

J'ai fait cette question parce que je tiens à partager ma solution self-made. J'ai écrit une petite application C++ que vous devez mettre /usr/bin.

Le code de l'application peut vous voir here (PASTEBIN). L'application elle-même peut être téléchargée here (My Own FTP) ou MegaUpload.

Ainsi, pour le mettre dans /usr/bin ouvrir un terminal et entrez:

sudo cp java-jar-launch /usr/bin/ 
[enter your password] 

ensuite naviguer dans Nautilus à un de vos Jar-fichiers, sélectionnez et cliquez droit dessus puis choisissez pour
" ouvrir avec". Ensuite, choisissez une commande personnalisée et tapez java-jar-launch. N'oubliez pas de cocher la case pour vous en souvenir pour le type Java-JAR. Appuyez sur OK et fermez.

Terminé.
Si vous double-cliquez sur un fichier Jar dans Nautilus, il sera ouvert avec mon application, qui appelle javaavec le bon répertoire de travail.

+0

Cela pourrait être mauvais. Je voudrais que le CWD soit l'endroit où je peux écrire des données - l'emplacement exécutable ne devrait pas être accessible en écriture pour un utilisateur standard. Je suis habitué aux raccourcis Windows où vous pouvez définir le CWD dans le cadre des paramètres de lancement. –

+0

@Software Monkey: Mon application change d'abord le répertoire en JAR-file-parent, puis l'invoque. –

+0

vous pouvez envisager d'apprendre l'écriture de scripts shell et d'étudier comment utiliser 'basename' et' dirname' dans un script shell. Ce que vous avez écrit est probablement l'équivalent d'un script shell à ligne unique. –

3

Fondamentalement, il n'y a aucune garantie sur le répertoire de travail actuel. Ce que vous pouvez faire, cependant, est de demander à la JVM l'URL où elle a trouvé le code d'octet pour une classe donnée (que vous savez où est placé) et l'utiliser pour localiser les autres ressources "à côté".

Voir Determine location of a java class loaded by Matlab

+0

Oooh, stackoverflow affiche maintenant les titres des questions de stackoverflow lors de la liaison. Agréable! –