我开发了一个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/