2012-05-10 13 views
7

Ho un progetto con struttura come questa:applicazioni JavaFX nel progetto Maven

principale progetto
-libary-1
-library-2
-i-bisogno-JavaFX-app-qui

Quindi, ho bisogno di un'applicazione JavaFX 2 nel mio progetto di maven, e dovrebbe usare library-1 e library-2 con le sue dipendenze. Non riesco a trovare nessun archetipo di maven per i progetti JavaFX 2 e non trovo alcuna informazione adeguata su come posso creare l'app JavaFX da Maven 3. Non ho bisogno di alcuna distribuzione sul web, sarà solo l'app desktop.

Quindi, qualcuno può aiutare con questo problema?

UPD:

java.lang.NoClassDefFoundError: javafx/application/Application
...
Caused by: java.lang.ClassNotFoundException: javafx.application.Application

eccezione è verificato quando si tenta di eseguire l'applicazione, che è costruito da pgras modo.

+0

Vedere [Come posso aggiungere una classe JavaFX 2.0 a un progetto Maven esistente?] (Http://stackoverflow.com/questions/8916461/how-can-i-add-a-javafx-2-0-class -to-an-existing-maven-project/8918191) – jewelsea

+0

Stai lavorando su Windows o su un altro SO? Lo chiedo perché ho anche avuto alcune difficoltà a configurarlo e finora ho una soluzione funzionante su Windows e alcuni problemi su MacOS. Posso dare una spiegazione più lunga di come l'ho fatto su Windows ... – pgras

+0

BTW come si tenta di eseguire l'applicazione? – pgras

risposta

4

quindi credo che si utilizza già Java 7, I d'ont sapere esattamente ciò che serve, per la compilazione è necessario solo la dipendenza da JavaFX, così nel vostro pom per l'applicazione JavaFX:

<dependencies> 
    <dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>javafx</artifactId> 
     <version>2.0</version> 
     <systemPath>${javafx.rt.jar}</systemPath> 
     <scope>system</scope> 
    </dependency> 
</dependencies> 

e nel tuo settings.xml Maven aggiungere (e adattare il percorso al vostro sistema):

<profile> 
    <id>javafx</id> 
    <activation> 
    <activeByDefault>true</activeByDefault> 
    </activation> 
    <properties> 
    <javafx.rt.jar>C:\Program Files (x86)\Oracle\JavaFX 2.0 SDK\rt\lib\jfxrt.jar</javafx.rt.jar> 
    <ant.javafx.jar>C:\Program Files (x86)\Oracle\JavaFX 2.0 SDK\tools\ant-javafx.jar</ant.javafx.jar> 
    </properties> 
</profile> 

dovrebbe essere sufficiente per compilare e rendere file jar ... Se non mi dica e io invierò ulteriori informazioni ..

+0

Quindi, ho provato a farlo ... – Anton

0

Aggiungo un'altra risposta perché è lunga e mostra come faccio a generare anche un jar firmato e un file webstart JNLP.

Quindi, prima creo un certificato per essere in grado di firmare il vaso (ti verrà chiesto di inserire alcune informazioni, ho usato "SuperPass" per le password, guarda dove viene utilizzato in POM):

cd src/main/java 
mkdir jnlp 
cd jnlp 
keytool -genkey -alias signFiles -keystore keystore.jks 

e poi ho utilizzare questo pom.xml (che ha un pom genitore, ma non contiene tutto ciò che riguarda JavaFX):

<?xml version="1.0" encoding="UTF-8"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<modelVersion>4.0.0</modelVersion> 
<parent> 
    <artifactId>testfx</artifactId> 
    <groupId>ch.pgras</groupId> 
    <version>1.0-SNAPSHOT</version> 
</parent> 
<groupId>ch.pgras</groupId> 
<artifactId>hellofx</artifactId> 
<version>1.0-SNAPSHOT</version> 
<name>hellofx</name> 
<url>http://maven.apache.org</url> 
<dependencies> 
    <dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>javafx</artifactId> 
     <version>2.0</version> 
     <systemPath>${javafx.rt.jar}</systemPath> 
     <scope>system</scope> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <configuration> 
         <overWriteReleases>false</overWriteReleases> 
         <overWriteSnapshots>false</overWriteSnapshots> 
         <overWriteIfNewer>true</overWriteIfNewer> 
        </configuration> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <version>1.7</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <configuration> 
         <target> 
          <taskdef name="jfxdeploy" classname="com.sun.javafx.tools.ant.DeployFXTask" 
            classpathref="maven.plugin.classpath"/> 

          <taskdef name="jfxsignjar" classname="com.sun.javafx.tools.ant.FXSignJarTask" 
            classpathref="maven.plugin.classpath"/> 

          <jfxdeploy width="800" height="600" outdir="${project.build.directory}/deploy" 
             outfile="${project.build.finalName}"> 
           <info title="${project.name}"/> 
           <application name="${project.name}" mainclass="webmap.WebMap"/> 
           <resources> 
            <fileset dir="${project.build.directory}" includes="*.jar"/> 
            <fileset dir="${project.build.directory}/dependency" 
              includes="*.jar"/> 
           </resources> 
           <platform javafx="2.0"> 
            <jvmarg value="-Xms64m"/> 
            <jvmarg value="-Xmx256m"/> 
           </platform> 
          </jfxdeploy> 
          <jfxsignjar destdir="${project.build.directory}/deploy" 
             keystore="${project.basedir}/src/main/java/jnlp/keystore.jks" 
             storepass="superpass" alias="signFiles" keypass="superpass"> 
           <fileset dir="${project.build.directory}/deploy" includes="*.jar"/> 
          </jfxsignjar> 
         </target> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>com.oracle.javafx</groupId> 
        <artifactId>ant-javafx</artifactId> 
        <version>2.0</version> 
        <systemPath>${ant.javafx.jar}</systemPath> 
        <scope>system</scope> 
       </dependency> 
      </dependencies> 
     </plugin> 

    </plugins> 
</build> 

finalmente corro mvn installare, e il risultato sarà essere in tar get/deploy ...

buona fortuna :)

+0

Grazie, ma quando provo a eseguire jnlp, quando cerco di eseguirlo tramite il plugin di esecuzione di Maven o tramite "java -jar myapp.jar", ClassNotFoundException esiste ancora . Non ho bisogno di jnlp, ho bisogno di eseguire l'applicazione in seconda istanza, è possibile con JavaFX? – Anton

+0

Non ancora testato ma questo può essere d'aiuto: https://forums.oracle.com/forums/thread.jspa?threadID=2373227&tstart=240 – pgras

+0

Quando provo questo, viene visualizzata un'icona in "JavaFX clic per aggiornamento gratuito". Se faccio clic su "Fai clic per avviare", ho solo bisogno di una versione più recente di JavaFX. Ho provato a cambiare la versione 2.0 alla 2.2 sopra. Comunque non penso che il problema sia la versione di JavaFX/Java nel mio browser non è aggiornata perché sono stato quasi in grado di costruirlo usando il plugin maven di jfx https://github.com/zonski/javafx-maven- plugin ma fallisce quando provo ad accedere alle risorse di rete anche se avrebbe dovuto firmare l'applicazione. –

2

Grazie molto, questo collegamento è utile. Così, ora il mio pom assomiglia a questo:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>info.kosmonaffft</groupId> 
    <artifactId>javafx-maven-example</artifactId> 
    <version>0.1</version> 
    <packaging>jar</packaging> 
    <name>javafx-maven-example</name> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.1</version> 
       <executions> 
        <execution> 
         <id>copy-dependencies</id> 
         <phase>prepare-package</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${project.build.directory}/lib</outputDirectory> 
          <excludeArtifactIds>junit,hamcrest-core</excludeArtifactIds> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-antrun-plugin</artifactId> 
       <version>1.7</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <configuration> 
          <target> 
           <taskdef name="jfxjar" classname="com.sun.javafx.tools.ant.FXJar" classpathref="maven.plugin.classpath"/> 
           <jfxjar destfile="${project.build.directory}/${project.build.finalName}"> 
            <fileset dir="${project.build.directory}/classes"/> 
            <application name="${project.name}" mainClass="info.kosmonaffft.jfxexample.App"/> 
            <resources> 
            </resources> 
           </jfxjar> 
          </target> 
         </configuration> 
         <goals> 
          <goal>run</goal> 
         </goals> 
        </execution> 
       </executions> 
       <dependencies> 
        <dependency> 
         <groupId>com.oracle.javafx</groupId> 
         <artifactId>ant-javafx</artifactId> 
         <version>2.0</version> 
         <scope>system</scope> 
         <systemPath>C:\Program Files\Oracle\JavaFX 2.1 SDK\tools\ant-javafx.jar</systemPath> 
        </dependency> 
       </dependencies> 
      </plugin> 
     </plugins> 
    </build> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>javafx</groupId> 
      <artifactId>javafx-rt</artifactId> 
      <version>2.1</version> 
      <scope>system</scope> 
      <systemPath>C:\Program Files\Oracle\JavaFX 2.1 SDK\rt\lib\jfxrt.jar</systemPath> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 

Quindi, è possibile eseguire l'applicazione da riga di comando "java-jar myapp.jar" ora, ma non ho testato come andrà eseguito con dipendenze.

+0

c'è un problema con le dipendenze - ho ottenuto java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory – rafalmag

Problemi correlati