Java 程序正在从 system32 文件夹加载,而不是从它所在的文件夹加载

Posted

技术标签:

【中文标题】Java 程序正在从 system32 文件夹加载,而不是从它所在的文件夹加载【英文标题】:Java program is loading from system32 folder, not from folder, which it is placed 【发布时间】:2013-09-12 18:17:26 【问题描述】:

我在 Windows 7 上用 Java 编写了桌面程序,并在启动时挂起它,方法是将 HKEY_CURRENT_USER/Software 中的 jar 文件的路径(类型 C:\Users\User\Documents\My App.jar)写入注册表/Microsoft/Windows/CurrentVersion/Run 分支。当我的程序与 Windows 一起加载时,它必须加载一些与程序放在同一文件夹中的文本文件:

File f = new File("text.txt"); // without full path to file
if(!f.exists())
    JOptionPane.showMessageDialog(null, "File not found: " + f.getAbsolutePath());

但做不到,我收到消息:“找不到文件:C:\Windows\system32\text.txt”。该程序似乎也分别位于 system32 文件夹和文本文件中。我做错了什么?

【问题讨论】:

那么,为什么从资源管理器 lounching 是成功的? 因为它将工作目录设置为您期望的位置。为了您的专业知识,添加一个快捷方式,打开快捷方式属性,您将看到配置工作目录,更改它并启动。您应该根据配置获得不同的文件路径。 将文件放在 system32 或其他地方不适合我... @DiegoCNascimento 是的,你是对的。不知道。 所以,有一段时间我决定将快捷方式放在自动运行文件夹中。稍后我将尝试从问题Getting the Current Working Directory in Java 中尝试解决方案 【参考方案1】:

我的理论:如果您通过传统安装程序安装 Java for Windows,除了您告诉它放置的位置(通常为 JAVA_HOME),安装程序还会在 system32 目录中删除一个 java.exe,因此,当您在启动时启动 JVM 时,system32 很可能是工作目录,它将在其中查找具有您提供的相对路径名称的文件。

最简单的解决方案是在代码中绝对指定文本文件的路径。我还建议在您的注册表项中指定java.exe 的完整路径(我猜现在它只是java.exe 没有路径),这样您就可以保证您正在运行哪个版本;如果您安装了多个 Java 版本,则仅最近安装的一个版本将在 system32 中具有 java.exe 并且没有合格的路径,我猜这就是您得到的那个,因为 PATH 在那时可能是最小的。

作为结束——与您的问题无关——我讨厌 Java 在 Windows 上执行此操作并立即擦除 java.exe 的副本,然后设置 PATH 以确保我想要的版本是按需执行。

【讨论】:

Java for windows 在system32目录下放了一个java.exe不,它在Program Files/Java/jdk#/bin跨度> 它也会将所有二进制文件安装到传统的“JAVA_HOME”空间中,但它也会将java.exe 的副本放入system32。 ***.com/questions/11063831/…***.com/questions/8223511/… 这是真的,我认为这就是为什么您在启动时会在 system32 作为工作目录结束。【参考方案2】:

您需要获取当前工作目录并将其用作文件绝对路径的一部分。

看看这个问题:Getting the Current Working Directory in Java

另一种解决方法是读取您描述的此注册表项并使用此信息从所需路径读取文件 - read/write to Windows Registry using Java

【讨论】:

【参考方案3】:

您所指的路径是工作目录,而不是应用程序的安装位置。就像如果你给它一个快捷方式,你可以改变工作目录,它会改变你得到的结果。但是当您将其自动启动时,可能是 windows 将其设置为工作目录。

像这样: Use registry to startup a program, and also change the current working directory? 1

您可以尝试使用注册表中的命令行参数将文件目录传递给您的应用程序。


1 - 这可能不会为您解决问题,您似乎没有,它只是一个解释

【讨论】:

【参考方案4】:

我认为@Omaha 的答案是描述正在发生的事情(您正在从 system32 目录启动 java.exe - JRE 安装程序将 java.exe 的副本放在 system32 中,以便用户更容易访问)。

针对您的情况的实际解决方案是调整您的 CurrentVersion\Run 注册表项,以便它为应用程序指定一个默认工作文件夹。签出:Use registry to startup a program, and also change the current working directory?

【讨论】:

如果我做得对,这个链接对我没有帮助。可能是因为jar,而不是exe 您是如何调整 CurrentVersion\Run 键的?您可能还想尝试显式运行 javaw.exe 来启动 JAR(而不是依赖文件关联)?可以尝试的东西...

以上是关于Java 程序正在从 system32 文件夹加载,而不是从它所在的文件夹加载的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让Windows 7 x64从本地目录加载ntdll.dll,而不是system32?

无法从加载器 dalvik.system 加载 alljoyn_java

为啥我能够将 x64 程序集加载到 AnyCPU Prefer 32 位可执行文件中?

加载C:\WINDOWS\system32\smiji.dll时出错 内存分配访问无效

无法加载文件或程序集“System.Runtime.InteropServices”

无法加载文件或程序集“System.Data.SQLite”或它的一个依赖。试图加载程序格式不正确