Est-il possible de définir une variable d'environnement lors de l'exécution de Java?
Est-il possible de définir une variable d'environnement lors de l'exécution de Java
application?
Dans Java 1.5 de java.lang.Le système de classe, il ya la fonction getenv() la méthode, je
seulement besoin d'un setenv() la méthode...
Est-il possible de modifier les variables d'environnement dans le processus java lui-même; non pas dans le processus de l'enfant.
Est-il possible de l'atteindre par JNI? Et comment cela fonctionnerait-il?
Grâce.
EDIT:
Ok permettez-moi de le dire de cette façon - Peut-on effectuer les opérations suivantes avec Java. S'il vous plaît répondre.
- Peut-on modifier l'environnement de l'actuel processus?
- Peut-on modifier l'environnement du processus parent?
- Peut-on modifier l'environnement de l'enfant processus?
Hemal Pandya a répondu que "Vous pouvez modifier l'environnement de l'actuel et de l'enfant les processus, mais pas du processus parent à l'origine de ce processus." Êtes-vous d'accord avec cela ?
- Ce que vous essayez d'atteindre Vicky?
- Je soupçonne que cette question est étroitement liée à cette question précédente: stackoverflow.com/questions/529474/...
- Et cette question: stackoverflow.com/questions/525212/...
- Les réponses à vos questions précédentes contiennent beaucoup de renseignements qui pourraient être utiles dans la résolution de votre problème. Peut-être que vous pourriez nous expliquer ce que vous avez essayé tout pourquoi les solutions déjà donné ne fonctionne pas pour vous.
- avez-vous finalement trouvé une réponse à ce problème?
- Je viens de trouver un éventuel besoin. Je suis en cours d'exécution d'une application qui doit charger une bibliothèque native. Il dépend des autres bibliothèques natives dans le même répertoire, il est en. Mais java peut ne pas s'exécuter dans le même dossier que les bibliothèques et que le dossier n'est pas dans le "path". De penser que le natif du côté du chargeur de DLL regarde le processus en cours de chemin si j'ajoute le dossier de la bibliothèque de la VOIE et ensuite appeler "le Système de.load("mylibrary"); il va trouver ses dépendances.
Vous devez vous connecter pour publier un commentaire.
Si mon intuition est correcte, et que vous voulez vraiment modifier l'environnement pour le bénéfice d'une engendré (fourche) sous-processus (
Runtime.getRuntime().exec()
), puis utilisez ProcessBuilder au lieu deexec()
. Vous pouvez créer un environnement personnalisé par l'intermédiaire de votreProcessBuilder
de l'instance l'environnement() méthode.Si c'est pas ce que vous essayez d'atteindre puis de bien vouloir tenir compte de la présente réponse.
Mise à JOUR
La réponse à vos trois mises à jour, des questions spécifiques sont comme suit:
System.getenv()
dans la même JVM, ou les deux.setenv
ou de sa plate-forme-équivalent en particulier via JNI. Vous pouvez également employer le très alambiqué méthode de point 2 ci-dessous, qui fonctionne pour n'importe quel processus (à condition d'avoir les autorisations). Toutefois, sachez que dans la plupart des machines virtuelles ce changement pourrait ne jamais être reflétées dans les valeurs retournées parSystem.getenv()
, que l'environnement est le plus souvent pas mis en cache au démarrage de la machine virtuelle dans unjava.util.Map
(ou document équivalent).System.java
, quelle que soit la JVM de la distribution que vous allez utiliser pour déployer), vous pouvez essayer de piratage de la mise en œuvre (par l'intermédiaire de la classe ordre de chargement, la réflexion, ou instrumentation.) Dans le cas de SUN v1.6 JVM, par exemple, l'environnement de cache est géré par les sans-papiersProcessEnvironment
classe (que vous pouvez patch.)gdb
sera suspendu pour une non-zéro d'un montant de temps.ProcessBuilder
quand la ponte du processus.Noter que toutes les méthodes ci-dessus, sauf pour l'un impliquant
ProcessBuilder
, sont fragiles, sujettes à erreur, non portable, à des degrés divers, et sujettes à des conditions de course dans les environnements multi-threadés.En réponse à la mise à jour de votre question:
Oui, si vous utilisez JNI pour appeler
setenv()
ou quelque chose. Vous n'avez probablement pas besoin de faire cela, et il peut ne pas fonctionner dans toutes les situations.Pas.
Oui, à l'aide de
ProcessBuilder
.Vous pouvez obtenir une poignée sur la carte sous-jacente que ProcessEnvironment est maintenant sur, et puis les mettre de nouvelles choses et d'enlever des choses tout ce que vous voulez.
Cela fonctionne sur java 1.8.0_144. Ne peut pas garantir qu'il fonctionne sur une autre version de java, mais c'est probablement semblables, si vous avez vraiment besoin de changer l'environnement au moment de l'exécution.
Après que vous obtenez la référence à la carte, il suffit d'ajouter ce que vous voulez et vous pouvez maintenant extraire à l'aide de l'ordinaire ancien Système.la fonction getenv("") appel.
J'ai essayé ce que son travail dans le MAC ne fonctionne pas dans Windows dans les deux os version java 1.8_161
Je ne le pense pas, du moins pas uniquement en Java, mais pourquoi avez-vous besoin de faire cela? En Java, il est préférable d'utiliser les propriétés via
System.getProperties()
, que vous pouvez modifier.Si vous devez vraiment, je suis sûr que vous pouvez rassembler le C
setenv
fonction dans un JNI appel - en fait, je ne serais pas surpris si quelqu'un a déjà fait. Je ne connais pas les détails du code.Vous pouvez modifier l'environnement de l'actuel et de l'enfant les processus, mais pas du processus parent à l'origine de ce processus.