【问题标题】:Java system.getProperty("user.dir") gives wrong result in ubuntuJava system.getProperty("user.dir") 在 ubuntu 中给出错误的结果
【发布时间】:2009-10-12 13:10:41
【问题描述】:

我开发了一个 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(我使用的 JDK1.6.0.14 和 JRE1.6.0.14 与窗口机器相同)

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

任何想法让我的应用程序在 Ubuntu 8.04 中像在窗口机器中一样独立运行?

【问题讨论】:

  • 为什么jar文件中没有webservices.xml?需要换吗?

标签: java ubuntu


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我对使用 ClassLoader.getResource() 感到困惑。我需要不时修改存储服务器IP的webservices.xml的内容,我可以在包内修改它吗?
  • 我的应用程序文件夹概念类似于便携式浏览器文件夹,只要复制整个应用程序文件夹就可以执行我的应用程序。这意味着无论您将文件夹放在哪里(即使在便携式驱动器中),程序仍然可以访问文件 webservices.xml,这就是为什么我需要访问与应用程序相同目录的文件。在窗口机器上一切正常,但不是 ubuntu 8.04 ...
【解决方案2】:

System.getProperty("user.dir")返回用户正在执行程序的当前目录,而不是程序所在的位置。

【讨论】:

  • 我在我的应用程序中使用 System.getProperty("user.dir")。我添加该行只是为了调试我的应用程序,因为这些行无法在 ubuntu 中工作: Document doc = docBuilder.parse (new File("webservices.xml"));
  • @winston:没关系。如果您提供相对文件名(例如“webservices.xml”),则会在该系统属性返回的当前目录中搜索它。
【解决方案3】:

user.dir 是你 shell 的当前工作目录,所以你先 cd 到它 Sun Java tutorial definition of user.dir

【讨论】:

    【解决方案4】:

    试试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2014-09-02
      • 2011-05-17
      相关资源
      最近更新 更多