在Java Webstart中更改工作目录

时间:2013-10-31 15:36:18

标签: java java-web-start jnlp

有没有办法在运行Java Webstart时更改JVM的工作目录? 当我使用system.setProperties(“user.dir”,newDir)时,它设置它(system.getProperties()显示它)但忽略它。

这是Java Webstart中的一个限制,总是使用我启动jnlp文件的工作目录吗? 我正在使用jnlp文件中的所有权限。

请帮忙!

编辑:无论我现在做什么,我的webstart总是使用user.dir来保存文件。令人沮丧!

4 个答案:

答案 0 :(得分:4)

我过去曾经有过这个问题,但我总是发现,最后,我并不需要它。我为什么这么说?

因为您的java web start应用程序与Program Files的可执行文件不同。它甚至不像大多数程序一样存在于您的计算机上(它被分解为一堆不同的文件并由JVM重新组装)。因此,您不能说程序有自己的目录来完成它所需要的工作。

但它不需要。原因如下:

  1. 当您需要存储数据时,Java有Preferences API可以提供帮助。 Preferences API的工作原理与JWS一样神秘,因此它们非常适合。无论哪种方式,如果您需要将文件写入文件,您应该检查此API以确定它是否能满足您的需求。
  2. 如果您需要为用户编写文件,那么提示他们并允许他们选择位置显然意味着您不会使用当前的工作目录来读/写文件。
  3. 如果需要序列化对象,则应该使用@ {1}}资源创建一个程序目录,如@AndrewThompson建议的那样。这将是“你的”目录,并且与user.home中的目录一样好(实际上更好)(例如,如果你在Windows上运行,那么)。
  4. 总之,在所有情况下(我都遇到过),您无需更改当前的工作目录。如果您需要自己的文件夹,请在Program Files中创建一个(因为您不会遇到文件权限问题)。

答案 1 :(得分:2)

  

..我使用的所有设置文件都是在user.dir中创建的。

有错误。将它们放在user.home&的子目录中问题解决了。

答案 2 :(得分:0)

在假设中你确实需要转移user.dir属性来执行Java WebStart,这是我找到的唯一选项:设置此系统环境变量(系统范围内):

_JAVA_OPTIONS="-Duser.dir=C:\Temp"

但是关心它,这个选项被读取并应用于任何JVM执行。

为什么在我的背景下需要它?因为Java WebStart ClassLoader在从缓存中的jar文件获取它之前在用户配置文件中查找任何单个资源(类,属性...)。随着用户配置文件被移动到网络存储,应用程序启动变得非常慢。我仍在调查Java源代码以了解(并避免)这种行为。所以我的应用程序完美无需设置user.dir,但这是我们目前遇到的性能问题的唯一解决方法。

答案 3 :(得分:-1)

传递运行时参数或用户特定设置的推荐方法是通过jnlp参数

<application-desc main-class=".....">
   <argument>user.home</argument>
   ..............