我有一个命令行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 :做了更多问题排查,并缩小了问题:
所以,我得出结论 - 由于某种原因,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
答案 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路径,如果需要,你可以正常写一些东西。