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"); // 絶対パスで動作します。

次に、Netbeans 7.2 IDE で Java 7u7 を使用して別の単純な Java プロジェクトを作成し、ClassName.class.getResourceAsStream("../newproperties.properties"); を使用してプロパティ ファイルをロードしようとしました。相対パスと絶対パスの両方で正常に機能します。基本的にJAVAFX 2.2のプロジェクトなら読み込まない。単純なJavaプロジェクトの場合、同じコードが機能しますが、非常に奇妙です。

注: 上記のコードは、Javafx 2.1 を使用する Java 6 で問題なく動作していました。

どんな助けでも大歓迎です。

4

1 に答える 1

0

アプリが jar としてパッケージ化されている場合 (通常の JavaFX アプリのように)、get resource 操作の基になる実装で使用される 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 に答える