Java system.getProperty ("user.dir")在 ubuntu 中给出错误结果

标签 java ubuntu

我开发了一个Java应用程序,它能够跨平台运行,条件是JRE版本至少为1.6.0.14。在 Windows 计算机 (JRE1.6.0.14) 上一切正常,但在使用 JRE1.6.0.14 的 Ubuntu 8.04 中却出现了不需要的结果。

我在这里发现了错误:

Document doc = docBuilder.parse (new File("webservices.xml"));

在 Windows 机器上,一切正常,docBuilder 将引用我的应用程序所在的文件。 示例:如果我的应用程序位于 C:\myApp\start.jar ,它将引用 C:\myApp\webservices.xml 处的 webservives.xml (这意味着无论我将应用程序文件夹移至何处,它始终会引用正确的目录)

但在 Ubuntu 8.04 中它不起作用。

我可以通过在应用程序中使用它来解决问题:

String curDir = System.getProperty("user.dir");
System.out.println(curDir);

无论我将应用程序文件夹放在哪里,curDir 始终返回“/home/user”。 Document doc = docBuilder.parse (new File("webservices.xml")) 在我将 webservices.xml 放入目录/home/user/webservices.xml 之前不起作用。

在 Ubuntu 中使用 Netbean 6.5.1 运行我的应用程序返回正确的 curDir,但独立运行我的应用程序返回错误的 curDir(我使用与 Windows 机器相同的 JDK1.6.0.14 和 JRE1.6.0.14)

为什么Document doc = docBuilder.parse(new File("webservices.xml"))在ubuntu JRE1.6.0.14中无法正常工作?

有什么想法可以让我的应用程序在 Ubuntu 8.04 中独立工作,就像在 Windows 机器中一样吗?

最佳答案

不要依赖当前目录来读取应用程序附带的文件。相反,使用 ClassLoader.getResource() (访问相对于类路径的文件)或 Class.getResouce()访问包内的文件。

编辑:以上内容仅适用于只读访问。将要修改的文件应存储在用户的主目录(系统属性user.home)中,而不是应用程序目录中,因为后者会导致许多问题:

  • 多个用户同时运行应用程序可能会覆盖彼此的更改
  • 用户无法轻松备份或迁移数据
  • 它与适当安全的用户权限系统不兼容,在该系统中,普通用户没有对应用程序目录的写入权限,无法防止病毒感染应用程序。

对于少量数据,您可以使用 Java preferences API .

编辑2: 对于该特定要求,这应该可行(需要文件位于类路径中):

Document doc = docBuilder.parse (
    new File(getClass().getClassLoader().getResource("webservices.xml").toURI()););

关于Java system.getProperty ("user.dir")在 ubuntu 中给出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554488/

相关文章:

javascript - 在 Ubuntu 上查找 Node JS 实例

ubuntu - Rust Ubuntu 20.04.1安装问题

java - 具有不同返回值的 Panache 查询 PanacheQuery<Entity> 而不是 ArrayList<String>

java - 在 JScrollPane 中重新绘制 JPanel 时闪烁

java - Lombok @Getter 和 Collections 的副本

java - 方法不明确

java - 如何在arraylist android中显示所有值

ubuntu - 在 rustup show 中未显示事件工具链的已安装目标

java - ubuntu运行java代码报错

当我在 Ubuntu 16.04 上下载大文件 (40GB) 时,Docker 构建崩溃