非法参数异常:URI不具有可运行的.jar文件的分层结构

时间:2015-01-14 06:12:27

标签: java eclipse

我知道这个问题之前已经被问了很多次,但是我已经通过所有其他线程并尝试了一些东西,但找不到能解决我问题的任何东西。我有一个在Eclipse中编译和运行没有问题的程序,但是当我导出一个可运行的.jar文件时,它不会启动。我尝试从cmd提示符运行它,并收到错误Illegal Argument Exception: URI in not hierarchical。这发生在包含的声音文件中,我将其作为类路径资源。代码是这样的:

try {
    pop = new File(IntroView.class.getResource("/model/pop.wav")
                .toURI());
} catch (URISyntaxException e1) {
     // TODO Auto-generated catch block
    e1.printStackTrace();
}

从我所读到的内容来看,文件被打包到.jar中的方式存在问题,但是我很难绕过它。任何人都可以对此有所了解并可能提供解决方案吗?感谢。

2 个答案:

答案 0 :(得分:0)

我很抱歉,但似乎你不能代表JAR内部的File对象。使用File对象查找文件时,它仅检查OS目录结构中的文件。 File对象可以在目录中找到JAR本身,但不能找到里面的内容。

您可以将InputStream放到JAR中的文件中,如下所示:

InputStream input = PlaySound.class.getResourceAsStream("Kalimba.mp3");

您可以选择以下选项:

  1. 从JAR中读取文件并将其写在目录中 然后获取文件对象。
  2. 将JAR解压缩到一个文件夹,并使用File指向该文件夹。
  3. 只需获取InputStream并播放文件,如下所示:     How can I play sound in Java?

答案 1 :(得分:0)

好吧所以我让它运转起来,但它并不是一个理想的解决方案。我最终做的是在项目中创建一个文件夹,但在源代码之外。所以以前,资源都在

Project/src/Model/pop.wav

现在他们在

Project/Resources/pop.wav

然后我就这样访问了

pop = new File("Resources/pop.wav");

因此,它仍然只能在从IDE启动时工作,但我所做的是在运行.jar的同一文件夹中添加一个新文件夹,其中包含所有相同的资源文件。文件引用相对于程序(来自pop.wav的IDE中)的任何目录查找.jar,因此它在此新文件夹中找到文件并且工作正常。我觉得它不是最漂亮的解决方案,但它无论如何都有效。