2013-06-01 7 views
13

내가이 오류자바 FX 예외 : 자바 FX/응용 프로그램/응용 프로그램

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Ap 
plication 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at java.security.SecureClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.access$100(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: javafx.application.Application 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 13 more 

내 클래스 파일을 실행하려고지고있어,이 소스

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

import java.util.concurrent.Executor; 

public class TestApplication extends Application{ 

    @Override 
    public void start(Stage stage) throws Exception { 
     new TestApplication(); 
    } 

    public TestApplication() { 
     try{ 
      final Parent root = FXMLLoader.load(Executor.class.getResource("test.fxml")); 
      final Stage stage = new Stage(){{ 
       setScene(new Scene(root, 300, 250)); 
       setTitle("Test"); 
       setResizable(false); 
       show(); 
      }}; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
입니다

fxml 파일에는 간단한 GUI가 포함되어 있습니다.

+1

가능한 중복 [jdk1.7의 javac의이 -cp 옵션을 사용하지 않고 자바 FX 항아리를 찾을 수 없습니다 (http://stackoverflow.com/question/16849992/jdk1-7s-javac-cant-find-javafx-jar-without-cp-option) – jewelsea

+0

내 클래스 경로를 jfxrt.jar 디렉토리로 선언했는데 지금이 오류가 발생한다. 메인 클래스를 찾지 못하거나로드하지 못했습니다.' – Archey

+1

자세한 내용은 classpath =>에 현재 디렉토리가 있어야합니다. [JavaFX 2.0 수동 컴파일] (http://stackoverflow.com/questions/9436219/compile-javafx-2-0 -Manually) – jewelsea

답변

0

리눅스에서 간단한 웹 애플리케이션을 개발 중입니다. 동일한 오류가 발생하지만 실제로는 쉽게 수정할 수 있습니다 (명령 줄에서 직접 개발한다고 가정).

cat compile.sh 
#!/bin/bash 

/usr/lib/jvm/jdk1.7.0_25/bin/javac WebViewSample.java -cp /usr/lib/jvm/jdk1.7.0_25  
/jre/lib/jfxrt.jar 

$ cat run.sh 
#!/bin/sh 
JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25/bin/ 
CLASSPATH=/usr/lib/jvm/jre1.7.0_25/lib/jfxrt.jar:. 

$JAVA_HOME/java -cp $CLASSPATH WebViewSample $* 2>&1 /dev/null | awk -F\| '{ print $2"|"$3 ; exit $1 }' 

exit $? 
8

저는 지난 몇 시간 동안 아주 똑같은 문제를 해결했습니다. 명시 적으로 작성한 것을 본 적이 없지만 은 반드시이어야합니다. JavaFX 패키징 도구 중 하나는 Ant 태스크 또는 javafxpackager 실행 파일 중 하나입니다. (http://docs.oracle.com/javafx/2/deployment/packaging.htm, 5.3.1 절 참조). NetBeans IDE는 Ant를 사용하여 코드를 패키지화합니다.

/com/javafx/main/Main$1.class 
/com/javafx/main/Main$2.class 
/com/javafx/main/Main.class 
/com/javafx/main/NoJavaFXFallback.class 

로 : 당신의 출력 JAR 파일에 다음

당신이 응용 프로그램의 코드와 모든 리소스뿐만 아니라, 그 포장 방법 중 하나를 사용, 그것은 또한 추가 (내가 IntelliJ를 사용하고 있습니다) 이 위치에, 당신은 명령 줄에서 응용 프로그램을 실행할 수 있습니다 :

java -jar outjar.jar 

그리고 모두 잘 작동합니다. 추가 com.javafx.main 파일을 제거하면 앱이 실행되지 않습니다.

이 것을 다시 확인하려면 JavaFX 샘플 (BrickBreaker, Ensemble, FXML-LoginDemo 및 SwingInterop)의 네 가지 JAR 파일을 모두 살펴 보았습니다. 그들은 모두 "추가"파일을 가지고 있습니다. 이 도움이

javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1 

희망 : 내 작은 테스트 앱

는, 나는 "실행"JAR 파일을 작성하려면이 명령 줄을 사용!

+0

MANIFEST.MF가 어떻게 생성되는지 보여줄 수 있습니까? – Math

+0

Intellij를 사용하고 있는데이 문제가 있습니다. 그러나 나는 그것을 구축하고 javafxpacker를 배치하기 위해 개미를 사용한다는 것을 알았다. 아직도이 대체 클래스가 없습니다. Intellij에서 해결 방법이 없다고 확신합니까? – gadelkareem

+0

Java 1.8이 설치되어 있고 javascx를 의도적으로 가리키는 CLASSPATH가있는 경우에도이 오류 메시지가 표시됩니다. DbSchema 7.6.5에서 classpath를 제외 된 javafx로 하드 코딩했습니다. 쉘 스크립트를 편집 한 후에이 문제는 사라졌습니다. –

1

javafx 응용 프로그램을 시작하는 "적절한"방법이 아닐지 모르지만 당분간이 문제로 고민하고 외부 패키징 응용 프로그램을 사용하지 않아도되는 해결 방법을 생각해 냈습니다.

이 솔루션은 Utils4j를 사용하여 런타임시 jfxrt를 동적으로로드합니다. 당신은 별도의 클래스에서 수행 javafx.application.Application 확장 클래스에서로드 예를 들어 그것을 이름을 수 없습니다 실행기에게

import org.fuin.utils4j.Utils4J 

public class Launcher { 

    public static void main(String[] args) { 
     Utils4J.addToClasspath("file:///"+System.getProperty("java.home")+ File.separator+"lib"+File.separator+"jfxrt.jar"); 

// CODE TO RUN YOUR CLASS THAT EXTENDS javafx.application.Application goes here. 

    } 
} 

프로젝트와 Utils4j를 포함 할 수 있습니다 (받는다는 사용하는 경우) :

<dependency> 
     <groupId>org.fuin</groupId> 
     <artifactId>utils4j</artifactId> 
     <version>0.7.0</version> 
    </dependency> 
1

필자는 maven을 사용하고 터미널에서이 mvn install:install-file -Dfile="/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar" -DgroupId=com.oracle.javafx -DartifactId=javafx -Dversion=2.2 -Dpackaging=jar을 실행합니다 (Windows에서 약간의 차이가있을 수 있음).당신이 나 같은 넷빈즈를 사용하고 설치 JDK의 두 가지 버전이있는 경우 다음 받는다는는 단순히

<dependency> 
    <groupId>com.oracle.javafx</groupId> 
    <artifactId>javafx</artifactId> 
    <version>2.2</version> 
</dependency> 
0

로 참조 할 수 있습니다 다음 jfxrt.jar를 설치합니다, 당신은 config 파일에서 적절한 자바 설치에 대한 클래스 경로를 변경해야합니다 . 이것은 또한 넷빈즈의 버그 :
는 어느 쪽이를 실행하여 --jdkhome와 넷빈즈를 시작합니다 :

"C:\Program Files\NetBeans Dev 201402160001\bin\netbeans.exe" --jdkhome "C:\Program Files\Java\jdk1.7.0_51" 

또는/etc/넷빈즈에서 "netbeans_jdkhome"속성을 설정을 할 수있는 두 가지 방법이 있습니다 . conf 예

# Default location of JDK, can be overridden by using --jdkhome <dir>: 
netbeans_jdkhome="C:\Program Files\Java\jdk1.7.0_51" 
1

IntelliJ 및 기타 IDE는 실행/디버그 구성을 리팩터링하지 않습니다. Main 클래스의 이름 앞에 패키지 이름을 수동으로 변경해야합니다. 예를 들어 'sample.Main'을 'com.company.package.ui.Main'으로 변경하면 다음에 실행을 시도 할 때 올바르게 실행됩니다. IDE가 이미 주 클래스를 찾을 수 없기 때문에 적색 십자가가있는 실행/디버그 버튼을 이미 표시했을 수 있습니다. 또한 Run/Debug 구성을 열 때 경고 메시지가 나타납니다.

2

이 문제를주지해야 자바 (8)를 사용하지만, 그것은 나를

이클립스 수출이 처음 내 항아리를 만들어

위해 한 -> Runnable를 항아리과 잘했다. 내가 Maven으로 이사했을 때 위와 같이 실패했다.

두 개의 jar를 비교하면 fx와 관련된 것은 jar로 패키징되지 않았지만 Eclipse에서 생성 된 manifest는 Class-Path: .이라는 것을 보여주었습니다. 받는다는을 얻는 것은이 (자바 8) 나를 위해 일한 다음과 항아리 패키지에

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <configuration> 
      <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>com.pg.fxapplication.Main</mainClass> 
      </manifest> 
       <manifestEntries> 
        <Class-Path>.</Class-Path> 
       </manifestEntries> 
      </archive> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build>