3

问题陈述: ClassName.class.getResourceAsStream() 如果路径是相对的,则不会加载/查找资源。如果路径是绝对的,它工作正常。

我最近从带有 JavaFx 2.1 的 Java 6 升级到带有 JavaFX 2.2 的 Java SE 7 u 7。它在早期版本的 JAvaFX 2.0 / Java FX 2.1 中运行良好。使用的 IDE 是 NetBean IDE 7.2。

我面临一个我觉得很奇怪的问题。我使用 IDE 创建了一个 JAVA FX 项目并尝试加载属性文件。指定绝对路径时它工作正常。但是当我更改为相对路径时,它会异常失败。

ClassName.class.getResourceAsStream("../resources/newproperties.properties"); // 不起作用。

ClassName.class.getResourceAsStream("/resources/newproperties.properties"); // 使用绝对路径。

然后,我使用 JAva 7u7 在 Netbeans 7.2 IDE 中创建了另一个 Simple Java 项目,并尝试使用 ClassName.class.getResourceAsStream("../newproperties.properties"); 加载属性文件。它适用于相对路径和绝对路径。基本上,如果是 JAVAFX 2.2 项目,它不会加载。如果它是一个简单的 java 项目,那么相同的代码可以工作,我觉得这很奇怪。

注意:上面的代码在 Java 6 和 Javafx 2.1 上运行良好。

任何帮助将不胜感激。

4

1 回答 1

0

如果您的应用程序被打包为一个 jar(就像 JavaFX 应用程序通常那样),那么在获取资源操作的底层实现中使用的 jar 协议将不会解析..相对路径中的父说明符。

如果您的应用程序未打包并且只是文件系统中的类和其他文件的集合,那么说明..符将解析,因为资源查找将使用文件协议而不是 jar 协议。

演示以上几点的示例:

package classpathtest;

public class ClassPathTest {
  public static void main(String[] args) {
    System.out.println(ClassPathTest.class.getResourceAsStream("../roundbutton.css"));
  }
}

样品的使用。

C:\dev\javafx\ClassPathTest\build\classes>echo any text > roundbutton.css

C:\dev\javafx\ClassPathTest\build\classes>echo Main-Class: classpathtest.ClassPathTest > manifest.txt

C:\dev\javafx\ClassPathTest\build\classes>jar cvfm ClassPathTest.jar manifest.txt roundbutton.css classpathtest
added manifest
adding: roundbutton.css(in = 521) (out= 257)(deflated 50%)
adding: classpathtest/(in = 0) (out= 0)(stored 0%)
adding: classpathtest/ClassPathTest.class(in = 680) (out= 399)(deflated 41%)

C:\dev\javafx\ClassPathTest\build\classes>java -jar ClassPathTest.jar
null

C:\dev\javafx\ClassPathTest\build\classes>java classpathtest.ClassPathTest
java.io.BufferedInputStream@927e4be

C:\dev\javafx\ClassPathTest\build\classes>java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b54)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b21, mixed mode)

C:\dev\javafx\ClassPathTest\build\classes>dir /s
 Directory of C:\dev\javafx\ClassPathTest\build\classes

09/12/2012  02:31 PM    <DIR>          classpathtest
09/12/2012  02:37 PM             1,414 ClassPathTest.jar
09/12/2012  02:36 PM                42 manifest.txt
09/12/2012  02:31 PM               521 roundbutton.css

 Directory of C:\dev\javafx\ClassPathTest\build\classes\classpathtest

09/12/2012  02:31 PM               680 ClassPathTest.class

如果java -jar ClassPathTest.jar在早期的 jdk 版本上没有为您返回 null,但在 jdk7u7+ 上确实为您返回 null,那么您发现了一个 jdk 错误。除了我安装的版本之外,我还没有测试过其他 jdk 版本,但我认为存在与此相关的 jdk 错误的可能性很低。

于 2012-09-12T19:58:09.047 回答