1

这是这个问题的后续问题(只是作为一个简短的描述:我已经能够通过双击.jarOS X 和 Windows 上的文件来运行 Java 程序,但不能在 Linux 上运行,因为我得到了后者文件路径问题)。

通过在 Ubuntu (12.04) 下使用 NetBeans 尝试一些事情,我发现问题似乎出在程序认为是它的工作目录的地方(我从 的输出中得出结论File.getAbsolutePath())。如果我在 NetBeans 中启动我的应用程序,一切正常(即使在 Ubuntu 下),并且

System.out.println(new File(".").getAbsolutePath());

给我/home/my_home/projects/VocabTrainer/.,这是我的项目文件夹,因此是正确的。但是,如果我双击.jar位于 中的文件,/home/my_home/projects/VocabTrainer/dist我突然在 Ubuntu 下得到的输出仅仅是/home/my_home/.这有问题,因为我想访问位于我的distdir 的子目录中的数据文件。

有谁知道这种行为的原因,以及我该如何解决这个问题?

PS:我不知道这是否需要,但这是输出java -version

java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
OpenJDK Server VM (build 20.0-b12, mixed mode)
4

2 回答 2

2

我认为您将 JAR 的位置与当前工作目录混淆了。

要确定前者,请参阅如何获取正在运行的 JAR 文件的路径?

于 2012-11-21T22:11:39.070 回答
1

原因,不是真的,目前。但是由于明显的不可预测性,您可能不想那样处理它。getResource假设您在下面的调用中使用 jar 中某些东西的限定类名,这样的东西应该会获取文件:

URL url = this.getClass().getClassLoader().getResource("thepackage/ofyourclass/JunkTest.class");  //get url of class file.  expected: ("jar:file:/somepath/dist/yourjar.jar!qualified/class/name.class")
File distDir = null;
if(url.getProtocol() == "jar") {
    String classPath = null;
    String jarPath = url.getPath();
    if(jarPath.matches(".*:.*")) jarPath = new URL(jarPath).getPath();
    classPath = jarPath.split("!")[0];
    distDir = new File(classPath).getParentFile(); //may need to replace / with \ on windows?
} else { //"file" or none
    distDir = new File(url.toURI()).getParentFile();
}    
//... do what you need to do with distDir to tack on your subdirectory and file name

编辑:我应该指出这显然是 hacky。您可以在启动时直接将文件的位置添加到类路径(或在 jar 中包含您要查找的文件)。从这里你可以this.getClass().getClassLoader().getResource()直接使用你正在寻找的文件名,这会让你得到类似的东西:

URL url = this.getClass().getResource("yourfile");
File file = new File(url.toURI());
//... use file directly from here

进一步编辑:好的,适应您缺少的协议,并将其展开,因此错误消息对您来说更具可读性。

于 2012-11-21T22:29:54.273 回答