0

我正在使用 Swing 开发一个小型 Java 应用程序,它应该在 Windows/Linux 和 MacOS 上运行。

最终它将作为一个可运行的 jar 发布,其中一些配置文件位于同一文件夹中。要加载它们,我需要 jar 存储在程序中的文件夹的路径。
已经有几个类似这个这个的线程。

我的问题是,当我从 eclipse 中运行程序或从终端调用可运行 jar 时,那里讨论的所有解决方案都可以正常工作,如下所示:

java -jar /path/to/jar/jarfile.jar

但是,当我单击 Cinnamon 或 Gnome 中的 jar 文件时(大多数用户都知道这样做),我没有得到正确的路径。(MacOS 用户报告同样的问题)

这是我到目前为止尝试过的以及通过双击运行时的输出(所有这些在从 Eclipse 或终端运行时都显示所需的路径):

ClassLoader.getSystemClassLoader().getResource(".").getPath()
Output: file:/usr/lib/jvm/java-6-openjdk-common/jre/lib/ext/pulse-java.jar!/

SomeClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();
Output: ./

System.getProperty("user.dir");
Output: /home/myusername

有没有其他方法可以做到这一点,或者我在导出 jar 时做错了什么?任何帮助,将不胜感激!

干杯尼克

4

3 回答 3

1

让它变得简单,并使用启动脚本(.bat/.sh 文件)来运行您的应用程序。该启动脚本将获取它自己在文件系统中的位置的路径,并将其作为参数或系统属性传递给 Java 应用程序。这具有能够传递其他参数的额外优势,例如堆的大小等。

在 Windows 上,%~dp0是包含已执行 bat 文件的目录的路径。在 Unix 上,您可以使用$(dirname $0).

于 2012-12-16T13:19:57.317 回答
0

您可以将所有配置文件作为资源存储在 jar 中,然后将它们复制到home.dir + ".AppName/" 中的文件中。

虽然很痛苦,但Preferences API Preferences.systemNodeForPackage似乎是最明智的选择,如果结构化配置数据很少的话。有一种inputStream导入方法;您的初始配置模板可能是 jar 中的资源。

于 2012-12-16T13:37:33.430 回答
0

只需使用 System.getProperty("java.class.path") 获取类路径并扫描它以查找您的“.jar”名称。请注意,路径分隔符取决于操作系统(File.pathSeparator)

于 2012-12-16T13:50:07.450 回答