2

我在 Mac(OS 版本 10.6.8)上的 NetBeans(v. 7.2.1)中开发了一个 GUI 应用程序。这个应用程序需要一个 XML 文件(包含程序使用的数据),我想把它放在一个子目录data中。

问题是如果我想在 NetBeans 中运行我的应用程序,这个数据目录必须放在项目主目录中;但是,如果我想简单地运行.jar位于主目录的子目录中的文件(使用双击),dist我必须将数据文件夹移动到dist- 然后程序将不再从 NetBeans 中运行。

这是在程序中指定数据文件路径的方式:

public String vocabPath = "data" + File.separator + "wordlist.xml";
public File vocabFile = new File(vocabPath);

起初,这本身似乎没有问题,因为对于应用程序的重新分发,我认为我可以简单地将数据目录移动到dist中,然后分发它(在 OS X 和 Windows 7 上运行良好);但是,在 Ubuntu 上,我收到一条错误消息,提示找不到数据文件。

我是 Java 新手,所以也许这是一个愚蠢的问题,但无论如何:我怎样才能让我的应用程序始终访问位于的数据文件MAIN_DIR/dist/data?或者如果问题的根源在其他地方,那么请告诉我。

提前非常感谢!

编辑

我已经发布了一个后续问题,因为我认为我已经将问题缩小到一些仅在 Ubuntu 下发生的意外行为。

编辑 2

对我的后续问题(见第一次编辑)的回答已经解决了我的问题(就像那些在尝试解决与我类似的问题时发现这篇文章的人的说明一样)。

4

2 回答 2

1

如果wordlist.xml用户无法修改该文件,则可以将其作为 jar 的一部分包含并用于getResourceAsStream()加载它。getResourceAsStream() vs FileInputStream有一些额外的细节

如果预计数据会被修改,您可以将其保存在某个已知位置。用户主目录可通过user.home属性获得。(并且可能是一个很好的区域)

如果它是由 java 命令启动的纯 java 程序,则拥有与“安装”(MAIN_DIR)相关的文件会更加困难。您可以创建一个可执行文件并使用某些操作系统 api(readlink ("/proc/self/exe", ..)在 Linux 上)来解析安装位置。

使用本机可执行文件打包 java 程序可以通过exe4j等软件完成。

(Launch4J 是一个具有类似功能的开源解决方案,在这里可能很有用)

(为了完成和将来参考)。您还可以尝试在 Windows 上创建小批量脚本,在 Linux 上创建 shell 脚本。可以从两者检测安装区域。

bat - 请参阅 %~dp0% -命令提示符中的目录导航
bash -从内部获取 Bash 脚本的源目录

于 2012-11-19T07:58:57.413 回答
0

我会为文件保留一个系统属性并dist默认保留路径。如果文件存在于data开发环境中,应用程序会选择它,否则它将总是去选择dist.

你可以这样做:

// This would pick up system property if set otherwise default value provided.
String filePath = (String) System.getProperty("VOCAB_FILE_PATH","<<path with dist>>"); 
public File vocabFile = new File(filePath);

在您的 NetBeans 环境中,只需设置一个系统属性VOCAB_FILE_PATH,其中提到的路径为data.

于 2012-11-21T04:39:49.570 回答