我在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
的数据文件?或者如果问题的根源在其他地方,请告诉我。
提前多多感谢!
修改
我发布了一个follow-up question,因为我认为我已经将问题缩小到了一些只在Ubuntu下发生的意外行为。
编辑2
我后续问题的答案(参见第一次编辑)已经解决了我的问题(正如那些在试图解决类似我的问题时发现这篇文章的人的注释)。
答案 0 :(得分:1)
如果文件wordlist.xml
无法由用户修改,您可以将其作为jar的一部分包含在内,并使用getResourceAsStream()
加载它。其他一些细节请见getResourceAsStream() vs FileInputStream
如果预计数据会被修改,您可以将其保留在某个已知位置。 Users home directory可通过user.home
媒体资源获取。 (可能是一个很好的区域)
如果是由java命令启动的纯java程序,则拥有相对于'installation'(MAIN_DIR)的文件会更加困难。您可以创建可执行文件并使用某些操作系统api(Linux上为readlink ("/proc/self/exe", ..)
)来解析安装位置。
使用本机可执行文件打包java程序可以通过exe4j等软件完成。
(Launch4J是一个具有类似功能的开源解决方案,在这里可能很有用)
(为了完成和将来的参考)。您还可以尝试在Linux上的Windows和shell脚本上创建一个小批量脚本。可以从两者中检测安装区域。
bat - 请参阅%~dp0% - Directory navigation in command prompts bash - Getting the source directory of a Bash script from within
答案 1 :(得分: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
。