Java SE 6和Java SE 8 JRE在Windows 7上的行为不同(文件权限)

时间:2015-03-12 10:17:38

标签: java windows java-8 file-permissions windows-7-x64

我有一个命令行Java应用程序,可以在Windows 7 x64平台上读写文件。目前,应用程序与IBM Java SE 6一起运行。结构如下:

APP_ROOT
    some_folder
    jre
        bin
        lib
    myjarfile.jar
    appl_start.bat 

现在,我用解压缩的JRE 8包替换了jre文件夹。应用程序开始抱怨它无法访问" some_folder中的文件(实际上是它的写操作)文件。如果我在APP_ROOT下手动创建新的some_folder_1并重新配置应用程序以使用它 - 应用程序运行正常。如果我删除新创建的some_folder_1并将some_folder重命名为some_folder_1 - 应用程序抱怨它无法访问它(即使在读取模式下)。

如果我用JRE 6文件替换jre文件夹 - 应用程序开始工作正常。

尝试通过属性比较有效权限 - 所有看起来都一样,没什么可疑的。 UAC已启用,我正在工作并在常规用户下更换文件夹。

更新:在Windows 7中关闭UAC并重新启动后,应用程序开始正常运行JRE 8.但我需要让它与UAC打开一起工作。将UAC恢复为打开并重新启动时 - 使用JRE 8的应用程序再次失败。此外,注意到似乎JRE 8无法在" C:\ Users \ username \ AppData \ Local \ VirtualStore \ Program Files(x86)\"中创建正确的文件,它通常在程序尝试写入时创建在程序文件中。

更新2 :做了更多问题排查,并缩小了问题:

  1. JRE 8的应用程序只有在写入" C:\ Program Files \ APP_ROOT \ some_folder"
  2. 时才会失败
  3. 在这种情况下,Windows 7设计文件应该在C:\ User .. \ VirtualStore中创建,但是JRE 8不能这样做(这是错误的,问题的根源
  4. JRE 6可以在VirtualStore中创建良好的文件。
  5. 在使用JRE 8
  6. 重新运行之前清除了VirtualStore内容
  7. 使用" some_folder_1"成功运行和JRE 8的组合是因为JRE 8实际写在C:\ Program Files / APP_ROOT / some_folder_1中 - 这是违反恕我直言。所以,这是另一个问题 - 为什么JRE 8没有重定向写入VirtualStore中的文件系统,而是修改了C:\ Program Files子文件夹。
  8. 如果我将%localusrdir%定义到某个C:\ temp目录,JRE 8会显示同样的问题,因此它不仅仅是VirtualStore文件夹的特定问题,恕我直言。
  9. 所以,我得出结论 - 由于某种原因,JRE 8无法将输出写入C:\ Program Files ...重定向到C:\ Users ... \ VirtualStore

    如何解决这个问题,所以JRE 8会像JRE 6那样开始在VirtualStore中写作吗?

    更新3 :失败的JRE版本:

    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
    

1 个答案:

答案 0 :(得分:2)

你没有。 JRE 8可能告诉Windows不要重定向,我想这不是你可以改变的。 (顺便说一句,自动重定向到VirtualStore是一个Windows功能,而不是Java功能。)

VirtualStore适用于旧的和行为不端的程序 - 不适用于新程序。您应该存储数据where user/application data is meant to go,在这种情况下,它将存储在AppData中。如果您有现有数据(例如,这是从旧程序升级),那么您应该将数据从该位置迁移到用户可以写入的新数据。

如果您需要多个用户能够写入相同的文件,那么您可能必须修改ACL /文件权限,以便其他用户可以写入相同的文件 - 这不应该要求管理员权限。 / p>

或者,用户可以获得APP_ROOT的所有权/添加写入权限,但这需要管理员权限。

最后,如果确实想要仍然使用VirtualStore,那么您可以检测JRE版本(或进行读/写尝试并捕获异常)并直接使用VirtualStore路径,如果需要,你可以正常写一些东西。