Javafx 2 ClassName.class.getResourceAsStream()不';在Java7u7中使用相对路径加载

Javafx 2 ClassName.class.getResourceAsStream()不';在Java7u7中使用相对路径加载,javafx-2,java-7,Javafx 2,Java 7,问题陈述:如果指向的路径是相对的,则ClassName.class.getResourceAsStream()不会加载/查找资源。如果路径是绝对路径,则它可以正常工作 我最近使用JavaFX2.1从Java6升级到JavaSE7U7,使用JavaFX2.2。它在JavaFX2.0/JavaFX2.1的早期版本中运行良好。使用的IDE是NetBean IDE 7.2 我面临一个我觉得很奇怪的问题。我使用IDE创建了一个JavaFX项目,并尝试加载属性文件。当指定绝对路径时,它可以正常工作。但当我切

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

我最近使用JavaFX2.1从Java6升级到JavaSE7U7,使用JavaFX2.2。它在JavaFX2.0/JavaFX2.1的早期版本中运行良好。使用的IDE是NetBean IDE 7.2

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

ClassName.class.getResourceAsStream(“../resources/newproperties.properties”)//不起作用

ClassName.class.getResourceAsStream(“/resources/newproperties.properties”)//使用绝对路径

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

注意:上面的代码在Java6和JavaFX2.1中运行良好


任何帮助都将不胜感激。

如果您的应用程序被打包为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
C:\dev\javafx\ClassPathTest\build\classes>echo any text>roundbutton.css
C:\dev\javafx\ClassPathTest\build\classes>echo主类:ClassPathTest.ClassPathTest>manifest.txt
C:\dev\javafx\ClassPathTest\build\classes>jar cvfm ClassPathTest.jar manifest.txt roundbutton.css ClassPathTest
新增舱单
添加:roundbutton.css(in=521)(out=257)(缩减50%)
添加:classpathtest/(输入=0)(输出=0)(存储0%)
加上:classpathtest/classpathtest.class(in=680)(out=399)(缩减41%)
C:\dev\javafx\ClassPathTest\build\classes>java-jar ClassPathTest.jar
无效的
C:\dev\javafx\ClassPathTest\build\classes>java ClassPathTest.ClassPathTest
java.io。BufferedInputStream@927e4be
C:\dev\javafx\ClassPathTest\build\classes>java-version
java版本“1.8.0-ea”
Java(TM)SE运行时环境(构建1.8.0-ea-b54)
Java HotSpot(TM)64位服务器虚拟机(构建24.0-b21,混合模式)
C:\dev\javafx\ClassPathTest\build\classes>dir/s
C:\dev\javafx\ClassPathTest\build\classes目录
2012年12月9日下午02:31课堂路径测试
2012年12月9日下午2:37 1414 ClassPathTest.jar
2012年12月9日02:36 PM 42 manifest.txt
2012年12月9日02:31 PM 521 roundbutton.css
C:\dev\javafx\ClassPathTest\build\classes\ClassPathTest的目录
2012年12月9日02:31 PM 680 ClassPathTest.class

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

您是否尝试过执行“清理并构建”?是的,我多次清理并构建。另外,在Netbean IDE 7.2上创建了新的JavaFx示例项目来测试这一点。如果该项目只是一个java项目,那么它可以工作,但是如果是JavaFX项目,它就不能工作。谢谢你的回复。我在netbeans 7.2中签入了我的项目,JavaFx项目-->属性-->构建-->打包,它打包为.jar。即使是简单的Java项目也打包为jar,它能够加载资源。其中与JavaFx项目中未运行的源代码相同。另外,我的早期版本javafx2.0和javafx2.1被打包为jar,它们能够加载资源。只有在最新版本的JavaFX7U7中,它没有加载。更新了答案以包含测试样本。当我们从命令提示符运行jar时,它将无法识别资源文件。这在所有版本中都会发生,毫无疑问。我观察到的问题是,当我在IDE中运行应用程序时,它使用的是相对URL(在JavaFX2.0版本中),但当我使用Java7U7升级到Javfx2.2时,它在具有相对URL的IDE中就没有运行。它希望引用以“/”开头的根。因此,我很想知道是什么原因使最新版本的NetBeans(7.2之前)中的相同代码失败,NetBeans允许您通过对文件系统上的类执行来运行JavaFX应用程序。我相信NetBeans 7.2已经发生了变化,所以当您运行JavaFX应用程序时,它必须从jar运行(尝试右键单击java文件以尝试运行JavaFX项目中的文件,您将在NetBeans 7.2中看到阻止您这样做的新消息)。感谢您的回复。我注意到Netbeans 7.2不允许从应用程序内部执行单个文件(仅适用于JavaFX项目)。对于简单的java项目,它确实允许单文件执行。这就是为什么它使用相对路径,并让我思考新版本的一些问题。再次感谢你的帮助。