2009-12-22 13 views
1

Existe-t-il un moyen d'ajouter un répertoire spécifique à la variable système Windows% PATH%? Cela ne semble pas fonctionner:Définir les variables système Windows avec Java

String[] cmd = { "cmd", "/c", "set", "PATH=\"%PATH%;c:\\test\"" }; 
Runtime.getRuntime().exec(cmd); 

c: \ test \ ne figure pas dans System.getenv ("chemin"); ou dans la sortie de

String[] cmd = { "cmd", "/c", "echo", "%PATH%" }; 
Runtime.getRuntime().exec(cmd); 

Ce que je besoin est de modifier le% PATH% -variable pour Java-Process en cours sous Windows. La raison en est que j'ai besoin de charger des fichiers dll natifs qui se recoupent mutuellement. Donc, je voudrais ajouter le chemin de l'application à l'environnement Windows.

La prochaine chose que j'ai essayé était une petite JNI-Wrapper pour la fonction C "putenv" qui ressemble à ceci:

JNIEXPORT void JNICALL Java_com_splitscreen_AppletTest_PutEnv_putEnv 
    (JNIEnv *env, jobject jobj, jstring val) { 

    jboolean iscopy; 

    const char *mvalue = (*env)->GetStringUTFChars(
       env, val, &iscopy); 

    putenv(mvalue); 
} 

Voici comment je l'appelle:

final String curPath = System.getenv("PATH"); 
final PutEnv pe = new PutEnv(); 
pe.putEnv("PATH=" + curPath + ";c:\test"); 

final String newPath = System.getenv("PATH"); 
System.out.println(newPath); 

Mais les chemins sont égaux. Je ne suis pas sûr que la carte de l'environnement système Java ne soit pas mise à jour ou que putenv ne fonctionne pas. Y a-t-il un moyen de vérifier cela?

+0

Oui, vous pouvez utiliser un simple 'System.getEnv (" PATH ")' pour vérifier PATH directement à partir de Java. –

Répondre

9

La raison pour laquelle cela ne fonctionne pas est que les deux invocations exec() démarrent deux shells différents; celui dans lequel vous définissez le chemin n'est pas celui dans lequel vous l'avez enregistré.

Il est difficile de modifier le paramètre de chemin permanent du système. Mais vous pouvez changer le chemin pour la durée de l'invocation d'un ou plusieurs programmes dont vous avez besoin.

Plus précisément, la chose à faire est de vous écrire un fichier batch (.CMD ou .BAT, comme vous s'il vous plaît), définissez le PATH près du début, suivez avec vous tout les commandes DOS/Windows aimeriez voir exécuté avec ce chemin , puis exec() ce fichier de script.


Mise à jour le chemin du processus Java actuel semble assez inutile. Java, une fois en cours d'exécution, ne se soucie pas du chemin. Ou utilisez-vous du code de bibliothèque?

Si vous exécutez des commandes DOS/Windows à partir de Java en utilisant exec(), l'astuce ci-dessus fonctionnera.


Mise à jour: OK, vous avez du code bibliothèque que pour des raisons de sa propre veut la voie tracée tellement, et que vous voulez lui donner ce qu'il veut.

Ce que je considère ici est de lancer une nouvelle JVM. Vous pouvez utiliser exec(cmd, envp) pour démarrer une nouvelle application Java ("vous-même", à la rigueur) avec un ensemble personnalisé de variables d'environnement dans envp. Il suffit de copier ceux qui sont déjà là et manipuler le contenu de PATH, le cas échéant.

La façon standard de démarrer une nouvelle application Java consiste à créer un nouveau ClassLoader, et il existe diverses descriptions sur la façon d'y parvenir. Mais je ne suis pas sûr que vous pouvez utiliser cette procédure pour créer un nouvel environnement - donc exec -sur la JVM peut non seulement être plus simple, mais peut-être le seul moyen.

+0

Salut, oui, je cours du code de bibliothèque. J'ai édité ma question. – Philip

+0

Mis à jour ma suggestion, j'espère que vous trouverez la mise à jour utile. –

+0

Merci pour votre réponse, mais le lancement d'une nouvelle JVM n'est pas une option car je cours dans une applet (avec un JAR signé). J'ai mis à jour ma question avec un autre essai avec JNI. – Philip

1

Cela n'est pas possible si vous exécutez simplement un fichier de commandes. Voir ici pour details.

Votre solution ne fonctionne pas, car elle modifie uniquement la variable d'environnement au niveau du processus et non au niveau du système.

1

Vous pouvez passer les chemins d'accès aux bibliothèques natives via l'option -Djava.library.path si vous utilisez des extensions JNI, cela peut également fonctionner pour votre cas d'exécution. L'autre option consiste à lancer l'application java à partir d'un fichier batch et à modifier les paramètres PATH dans l'interpréteur de commandes "avant" de lancer l'application java, l'application java héritera de ces paramètres PATH.

La NASA WorldWind utilise des bibliothèques natives et peut être exécutée en tant qu'Applet, voici un howto pour la configuration avec JNLPAppletLauncher. Ce que cela fait essentiellement est de détecter le système d'exploitation, de récupérer les bibliothèques natives appropriées, de les enregistrer dans un emplacement dans le chemin jvm par défaut et de les exécuter. Appeler exec à partir d'une applet Java viole toutes sortes de principes de sécurité et de sandboxing sains et je l'éviterais vraiment.

+0

+1 pour java.library.path, je dirais que ça vaut le coup d'essayer! Mais apparemment, l'application est une applet, donc malheureusement l'approche par lots semble être sur :( –

0

Vous pouvez essayer d'utiliser setenv.exe (à partir de here) au lieu de cmd /c.
ou setx.exe de Microsoft.

Questions connexes