Java Ubuntu上的File.getAbsolutePath不正确

Java Ubuntu上的File.getAbsolutePath不正确,java,file,ubuntu,netbeans,path,Java,File,Ubuntu,Netbeans,Path,这是一个后续问题(正如一个简短的描述:我已经能够通过双击OSX和Windows上的.jar文件来运行Java程序,但在Linux上没有,因为在Linux上我遇到了文件路径问题) 通过在Ubuntu(12.04)下使用NetBeans尝试一些东西,我发现问题似乎出在程序认为是其工作目录的地方(我从File.getAbsolutePath()的输出中得出结论)。如果我用NetBeans启动我的应用程序,一切都能正常工作(即使在Ubuntu下),并且 给我/home/my_home/projects/

这是一个后续问题(正如一个简短的描述:我已经能够通过双击OSX和Windows上的
.jar
文件来运行Java程序,但在Linux上没有,因为在Linux上我遇到了文件路径问题)

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

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

有人知道这种行为的原因吗?我如何解决这个问题

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)

我想你把罐子的位置和瓶子的位置搞混了


要确定前者,请查看原因,目前还不是真正的原因。但由于明显的不可预测性,你可能不想这样处理。假设您在下面的
getResource
call中使用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
编辑:我应该指出,这显然是骇客。您可以在启动时直接将文件的位置添加到类路径中(或者将要查找的文件包含在jar中)。由此,您可以使用
this.getClass().getClassLoader().getResource()
和您要直接查找的文件名,这将使您获得类似以下内容:

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

进一步编辑:好的,根据您缺少的协议进行调整,并将其展开,这样错误消息对您来说更易读。

谢谢您的回复!我可能做了一些愚蠢的事情(我是Java新手…),但URL“URL=this.getClass().getClassLoader().getResource(“qualified/class/VocabItem.class”);”给了我URL==null。我只是选了一个班的名字,但也许我误解了你的建议!?ah-假设您有一个类包,则将“qualified/class”位替换为相关类的包。类的“限定类名”是包前面的类名。为此,您需要将“.”字符替换为“/”字符。因此,如果您的VocabItem类在com.canavanin包中,那么您应该对该字符串使用“com/canavanin/VocabItem.class”。如果没有包,您应该能够省略字符串的这一部分。谢谢您的更新。现在我得到了一个错误的概念:java.net.malformedurexeption:no protocol:/home/my_home/projects/VocabTrainer/build/classes/my/VocabTrainer/VocabItem.classs非常感谢您的编辑,我今晚将试用它(这是一个私人项目,所以我只在家里做)。非常感谢您的帮助,您已经解决了我的问题!现在一切都回到了正轨:)
URL url = this.getClass().getResource("yourfile");
File file = new File(url.toURI());
//... use file directly from here