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

标签 java windows

我在 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 文件夹和文本文件中。我做错了什么?

最佳答案

我的理论:如果您通过传统安装程序安装了 Windows 版 Java,除了您告诉它放置的位置(规范地,JAVA_HOME)之外,安装程序还会在其中放置一个 java.lang.java 文件。 exe 位于 system32 目录中,因此当您在启动时启动 JVM 时,system32 可能是工作目录,并且这就是它要查找的位置具有与您提供的相对路径名类似的文件。

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

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

关于Java 程序是从 system32 文件夹加载的,而不是从它所在的文件夹加载的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18771581/

相关文章:

java - 如何删除 xml 文档中的独立属性声明?

java - XML p-命名空间属性的等效 Java 配置是什么?

windows - 如何从 Perl 创建然后使用长 Windows 路径?

php - 将视频添加到 php

windows - 如何从命令行启动这个程序?

java - 具有通用类型的 WebFlux WebClient

java - 切换行为 - java

java - Spring Boot/Thymeleaf - 循环中的循环

windows - Docker Toolbox Windows登录quay.io

c++ - 将菜单资源添加到对话框