Java SE 6 et Java SE 8 JRE se comportent différemment sur Windows 7 (autorisations de fichiers)


J'ai une application Java en ligne de commande qui lit et écrit des fichiers sur la plate-forme Windows 7 x64. Actuellement, l'application s'exécute avec IBM JAVA SE 6 livré. Structure comme suit:

APP_ROOT
    some_folder
    jre
        bin
        lib
    myjarfile.jar
    appl_start.bat 

Maintenant, j'ai remplacé le dossier jre par le paquet JRE 8 décompressé. Et l'application a commencé à se plaindre qu'elle ne pouvait pas "accéder" (en fait, c'est l'opération d'écriture) aux fichiers dans some_folder. Si je crée manuellement un nouveau some_folder_1 sous APP_ROOT et reconfigure l'application pour l'utiliser - l'application s'exécute simplement fin. Si je supprime some_folder_1 nouvellement créé et renommer some_folder en some_folder_1 - application se plaignant qu'elle ne peut pas y accéder (même en mode lecture).

Si je remplace le dossier jre par des fichiers JRE 6 - l'application commence à fonctionner correctement.

J'ai essayé de comparer les autorisations efficaces via les propriétés - tout se ressemble, rien de suspect. UAC est activé, je travaille et je fais le remplacement des dossiers sous utilisateur régulier.

MISE À JOUR : Après avoir désactivé UAC dans Windows 7 et redémarré, l'application a commencé à fonctionner correctement avec JRE 8. Mais je dois le faire fonctionner avec UAC activé. Lorsque l'UAC est revenu à on et redémarré-l'application avec JRE 8 a échoué à nouveau. En outre, remarqué que semble JRE 8 ne crée pas correctement les fichiers dans "C:\Users\username\AppData\Local\VirtualStore\Program Files (x86)\", où il est normalement créé lorsque le programme tente d'écrire dans des fichiers de programme.

MISE À JOUR 2 : Fait plus de dépannage, et rétréci problème:

  1. L'application avec JRE 8 échoue uniquement lorsqu'elle écrit dans "C:\Program Fichiers \ APP_ROOT \ some_folder"
  2. Par la conception de Windows 7 dans ce fichier de cas devrait être créé dans C:\User..\ VirtualStore, mais JRE 8 ne peut pas le faire ( ce qui est faux et la racine du problème)
  3. JRE 6 peut créer des fichiers correctement dans VirtualStore.
  4. Le contenu de VirtualStore a été nettoyé avant de réexécuter avec JRE 8
  5. L'exécution réussie avec "some_folder_1" et JRE 8 la combinaison était parce que JRE 8 a écrit à l'intérieur C:\Program Files / APP_ROOT / some_folder_1 - ce qui est une violation À mon HUMBLE avis. Donc, c'est un autre problème-pourquoi JRE 8 n'a pas redirigé l'écriture vers le système de fichiers dans le VirtualStore, et modifié à la place C:\Program Sous-dossier Fichiers.
  6. Si je définis % localusrdir% à certains C:\temp répertoire, JRE 8 montre le même problème, donc ce n'est pas seulement un problème spécifique du dossier VirtualStore, À mon humble avis.

Donc, je tire une conclusion - pour une raison quelconque JRE 8 impossible de rediriger la sortie d'écriture vers C:\Program Fichiers... dans C:\Users...\VirtualStore

Comment cela peut-il être corrigé, alors JRE 8 commence à écrire dans VirtualStore bien comme le fait JRE 6?

MISE À JOUR 3 : la version JRE défaillante:

C:\Program Files (x86)\APP\jre\bin>java.exe -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build pwi3280-20150129_02)
IBM J9 VM (build 2.8, JRE 1.8.0 Windows 7 x86-32 20150116_231420 (JIT enabled, AOT enabled)
J9VM - R28_Java8_GA_20150116_2030_B231420
JIT  - tr.r14.java_20150109_82886.02
GC   - R28_Java8_GA_20150116_2030_B231420
J9CL - 20150116_231420)
JCL - 20150123_01 based on Oracle jdk8u31-b12
Author: Barat Sahdzijeu, 2015-03-12

1 answers

Vous ne le faites pas. JRE 8 dit probablement à Windows de ne pas rediriger et j'imagine que ce n'est pas quelque chose que vous pouvez changer. (En passant, la redirection automatique vers VirtualStore est une fonctionnalité Windows, pas Java.)

VirtualStore est destiné aux programmes anciens et mal conduits-pas aux nouveaux. Vous devriez stocker vos données où les données utilisateur/application sont censées aller , et dans ce cas, elles seraient dans AppData. Si vous avez des données existantes (par exemple, il s'agit d'une mise à niveau ancien programme) ensuite, vous devez migrer les données de cet emplacement vers un nouveau dans lequel l'utilisateur peut écrire.

Si vous avez besoin de plusieurs utilisateurs pour pouvoir écrire dans les mêmes fichiers, vous devrez peut-être modifier les autorisations ACLs / file afin que ces autres utilisateurs puissent écrire dans les mêmes fichiers-cela ne devrait pas nécessiter de droits d'administrateur.

Alternativement, l'utilisateur pourrait s'approprier / ajouter des autorisations d'écriture à APP_ROOT, mais cela nécessiterait des droits d'administrateur.

Enfin, si vous vraiment vous voulez toujours utiliser VirtualStore, alors vous pouvez probablement détecter la version JRE (ou faire une tentative de lecture/écriture et attraper l'exception) et utiliser directement le chemin VirtualStore, ce qui est probablement quelque chose que vous pouvez écrire normalement si vous le souhaitez.

 2
Author: Keilaron, 2017-05-23 11:44:11