2012-09-12 2 views
3

문제점 설명 : 경로가 상대 경로 인 경우 ClassName.class.getResourceAsStream()이 리소스를로드하거나 찾지 않습니다. 경로가 절대 경로라면 제대로 작동합니다.ClassName.class.getResourceAsStream()이 Java 7 U 7에서 상대 경로로로드되지 않습니다.

최근 JavaFx 2.1이 설치된 Java 6에서 JavaFX 2.2가 설치된 Java SE 7 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을 사용하여 또 다른 Simple Java 프로젝트를 만들고 ClassName.class.getResourceAsStream ("../ newproperties.properties");을 사용하여 속성 파일을로드하려고 시도했습니다. 상대 경로와 절대 경로 모두에서 잘 작동합니다. 기본적으로 JAVAFX 2.2 프로젝트 인 경우에는로드되지 않습니다. 어디에 그것의 간단한 자바 프로젝트, 나는 아주 이상한 찾을 동일한 코드가 작동합니다.

참고 : 위의 코드는 Java 6 with Javafx 2.1에서 잘 작동합니다.

도움이 될 것입니다.

+0

"정리 및 작성"을 수행하려고 시도 했습니까? –

+0

예 여러 번 청소하고 세웠습니다. 또한 테스트를 위해 Netbean IDE 7.2에 새로운 샘플 JavaFx 프로젝트를 만들었습니다. 프로젝트가 자바 프로젝트 일 경우에는 작동하지만 JavaFX 프로젝트 인 경우에는 작동하지 않습니다. – user1332356

답변

0

응용 프로그램이 jar로 패키지되어 있으면 (JavaFX 응용 프로그램은 일반적으로 JavaFX 응용 프로그램이므로) get resource 작업의 기본 구현에 사용 된 jar 프로토콜은 상대 경로의 부모 .. 지정자를 확인하지 않습니다.

앱이 패키지되지 않고 단순히 파일 시스템에 클래스 및 기타 파일의 모음 인 경우 .. 지정자는 리소스 조회가 jar 프로토콜과 반대되는 파일 프로토콜을 사용하기 때문에 해결됩니다. 위의 점을 입증

샘플 : 샘플의

package classpathtest; 

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

사용. java -jar ClassPathTest.jar 만약

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 
[email protected] 

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 

이전 버전의 JDK에 당신을 위해 null을 반환하지 않습니다,하지만 jdk7u7 +에 당신을 위해 null을 반환 않습니다, 당신은 JDK의 버그를 발견했다. 나는 내가 설치 한 것보다 다른 jdk 버전을 테스트하지는 않았지만, 이것과 관련된 jdk 버그가있을 가능성은 낮다고 생각한다.

+0

답장을 보내 주셔서 감사합니다. netbeans 7.2, JavaFx Project -> Properties -> Build -> Packaging에서 프로젝트를 체크했는데 .jar로 패키징되어 있습니다. 간단한 Java 프로젝트조차 jar로 패키징되어 리소스를로드 할 수 있습니다. 동일한 소스가 JavaFx 프로젝트에서 실행되지 않는 곳. 또한 이전 버전의 JAvafx 2.0 및 JavaFX 2.1은 jar로 패키징되어 리소스를로드 할 수있었습니다. 최신 버전 JavaFX 7u7에서만로드되지 않습니다. – user1332356

+0

테스트 샘플을 포함하도록 답변이 업데이트되었습니다. – jewelsea

+0

명령 프롬프트에서 jar를 실행하면 리소스 파일을 인식하지 못합니다. 그것은 모든 버전에서 발생하며 의심의 여지가 없습니다. 내가 관찰하고있는 문제는 IDE에서 응용 프로그램을 실행 한 다음 상대 URL (JAVAFX 2.0 버전)에서 실행했지만 Java 7u7로 Javfx2.2로 업 그레 이드 한 후 IDE에서 실행되지 않는 경우입니다 상대 URL. "/"로 시작하는 루트 참조를 원합니다. 따라서 최신 버전에서 동일한 코드가 실패한 원인을 알고 싶습니다. – user1332356

관련 문제