2 Stimmen

JavaFx 2.0-Anwendung, die auf externe Jars verweist

Ich entwickle eine JavaFx 2.0 Anwendung mit Netbeans 7. Die Hauptanwendung verweist auf ein anderes Klassenbibliotheksprojekt, das durch Rechtsklick auf den Ordner 'Libraries' und Auswahl von 'Add Project...' hinzugefügt wurde. Das Ausführen der Anwendung aus Netbeans funktioniert einwandfrei.

Bei der Bereitstellung in einer jar-Datei durch "Clean and build" und dem Versuch, sie über die Konsole mit

java -jar TestApp.jar

Ich bekomme

Exception in thread "JavaFX-Launcher" java.lang.NoClassDefFoundError: net/pmoule/SomeClass
...

Der Ordner dist/lib meiner Anwendung enthält die referenzierte Bibliothek. IMHO sollte also alles in Ordnung sein. Wenn ich mir die Manifest.MF in meinem Anwendungs-Jar ansehe, erhalte ich folgendes

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_23-b05 (Sun Microsystems Inc.)
Implementation-Vendor: pmoule
Implementation-Title: TestApp
Implementation-Version: 1.0
Main-Class: com/javafx/main/Main
JavaFX-Application-Class: testapp.TestApp
JavaFX-Version: 2.0

Wo ist mein Klassenpfad? Wie bringe ich Netbeans dazu, den richtigen Klassenpfad hinzuzufügen?

Ich habe versucht, sie manuell zur Manifest.MF hinzuzufügen, indem ich die in der Jar-Datei enthaltene Datei bearbeitet habe

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_23-b05 (Sun Microsystems Inc.)
Implementation-Vendor: pmoule
Implementation-Title: TestApp
Implementation-Version: 1.0
Class-Path: lib/MyLib.jar        //THIS IS NEW
Main-Class: com/javafx/main/Main
JavaFX-Application-Class: testapp.TestApp
JavaFX-Version: 2.0

Kein Erfolg und derselbe Fehler.

Alle mit dem JavaFX 2.0 SDK gelieferten Beispiele funktionieren durch Doppelklick im WindowsExplorer oder von der Konsole aus durch Eingabe von z.B.

java -jar PathAnimation.jar

In keinem dieser Beispiele wird jedoch auf ein externes Gefäß verwiesen.

Einige Recherchen führten mich zu dieser Frage: Netbeans JavaFX 2.0 Anwendung Aber bisher gibt es keine Lösung.

Danke für jede Hilfe!

3voto

pmoule Punkte 4272

Ich habe selbst eine funktionierende Lösung gefunden.

Alle externen Bibliotheken im Ordner dist/lin hatten eine Größe von 0kb. Die Ausnahme war also natürlich korrekt.

Um meine Anwendung zum Laufen zu bringen, habe ich in der jfx-impl.xml des Projekts Folgendes getan:

Hinzufügen des Klassenpfads zu manifest.mf

<fxjar destfile="${jfx.deployment.dir}/${jfx.deployment.jar}" applicationClass="${main.class}" >
             <fileset dir="${build.classes.dir}"/>
              <manifest>
               <attribute name="Implementation-Vendor" value="${application.vendor}"/>
               <attribute name="Implementation-Title" value="${application.title}"/>
<!-- NEW -->   <attribute name="Class-Path" value="${jar.classpath}"/> <!-- NEW -->
               <attribute name="Implementation-Version" value="1.0"/>
              </manifest>
    </fxjar>

Erstellen eines Ausgabeverzeichnisses für die Webbereitstellung

<property name="jfx.deployment.web.dir" location="${jfx.deployment.dir}/web" />
<mkdir dir="${jfx.deployment.web.dir}" />

Ausgabeverzeichnis für fxdeploy-Aufgabe festlegen

<fxdeploy width="${jfx.applet.width}" height="${jfx.applet.height}"
              outdir="${jfx.deployment.web.dir}" <!-- NEW DIR -->
              embedJNLP="true"
              outfile="${application.title}">
        <info title="${application.title}"
              vendor="${application.vendor}"/>
        <application name="${application.title}"
                     appclass="${main.class}"/>
        <resources type="eager">
           <fileset dir="${jfx.deployment.web.dir}"> <!-- NEW DIR -->
              <include name="${jfx.deployment.jar}"/>
              <include name="lib/*.jar"/>
              <exclude name="**/jfxrt.jar"/>
           </fileset>
        </resources>
</fxdeploy>

Nun kann ich meine Desktop-Anwendung bereitstellen und per Doppelklick aus dem Windows-Explorer oder durch Eingabe von

java -jar TestApp.jar

Es gibt immer noch ein Problem mit dem Inhalt meines neu erstellten Web-Verzeichnisses.

  1. Die TestApp.jar ist nicht nach dist/web kopiert
  2. Die referenzierten externen Jars werden nicht nach dist/web kopiert

Das ist für mich in Ordnung und wird irgendwann später behoben werden.

Ich hoffe, das hilft allen anderen.

0voto

JimClarke Punkte 1381

Haben Sie in Netbeans unter Projekt => Eigenschaften => Bauen => Paketierung die Option "Abhängige Bibliotheken kopieren" aktiviert?

0voto

Splaktar Punkte 4540

Sie müssen der Aufgabe fx:jar Ihre Klassenpfad-Abhängigkeiten mitteilen:

<fxjar destfile="${jfx.deployment.dir}/${jfx.deployment.jar}" applicationClass="${main.class}" >
      <fileset dir="${build.classes.dir}"/>
      <manifest>
        <attribute name="Implementation-Vendor" value="${application.vendor}"/>
        <attribute name="Implementation-Title" value="${application.title}"/>
        <attribute name="Implementation-Version" value="1.0"/>
      </manifest>

      <!-- Setup the classpath for the generated .jar here -->
      <fx:resources>
        <fx:fileset type="jar" dir="lib" includes="MyLib.jar"/>
      </fx:resources>
</fxjar>

Außerdem müssen Sie in Ihrer fx:deploy-Aufgabe den Tag fx:resources statt nur resources verwenden. Damit sollten die letzten beiden Probleme in Ihrer Antwort gelöst sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X