2012-05-10 105 views
7

Tengo un proyecto con la estructura como esta:aplicación JavaFX en el proyecto Maven

principal proyecto
-libary-1
-library-2
-i-necesidad-javafx-app-aquí

Entonces, necesito una aplicación JavaFX 2 en mi proyecto maven, y debería usar library-1 y library-2 con sus dependencias. No puedo encontrar ningún arquetipo de Maven para los proyectos de JavaFX 2 y puedo encontrar cualquier información adecuada sobre cómo puedo construir la aplicación JavaFX de Maven 3. No necesito ninguna implementación en la web, solo la aplicación de escritorio.

Entonces, ¿alguien puede ayudar con este problema?

UPD:

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

excepción se produjo cuando trato de ejecutar la aplicación, la cual se edifica por pgras manera.

+0

Ver [¿Cómo puedo agregar una clase JavaFX 2.0 a un proyecto Maven existente?] (Http://stackoverflow.com/questions/8916461/how-can-i-add-a-javafx-2-0-class -to-an-existing-maven-project/8918191) – jewelsea

+0

¿Estás trabajando en Windows o en otro sistema operativo? Lo pregunto porque también tuve algunas dificultades para configurar esto y hasta ahora tengo una solución de trabajo en Windows y todavía algunos problemas en MacOS. Puedo dar una explicación más larga de cómo lo hice en Windows ... – pgras

+0

BTW ¿cómo intenta ejecutar la aplicación? – pgras

Respuesta

4

así que supongo que ya utiliza Java 7, I d'ont sabe exactamente lo que necesita, para compilar sólo necesitará la dependencia a javafx, por lo que en su POM para la aplicación JavaFX:

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

y en su settings.xml experto añadir (y la adaptación de camino a su 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> 

debería ser suficiente para recopilar y poner archivo jar ... Si no me dicen y voy a publicar más información ..

+0

Así que traté de hacer esto ... – Anton

0

Agrego otra respuesta porque es larga, y muestra cómo hago para generar también un archivo firmado y un archivo webstart JNLP.

Así que primero se crea un certificado para poder firmar el frasco (se le pedirá que introduzca algo de información, he utilizado "SuperPass" para las contraseñas, mire por donde se utiliza en POM):

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

y entonces utilizar este pom.xml (que tiene un pom padres, pero que no contiene nada relacionado con 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 instalar, y el resultado será estar en alquitrán Obtener/desplegar ...

buena suerte :)

+0

Gracias, pero cuando trato de ejecutar jnlp se ejecuta, cuando trato de ejecutarlo a través de maven run plugin oa través de "java -jar myapp.jar" todavía existe ClassNotFoundException . No necesito jnlp, necesito la posibilidad de ejecutar la aplicación por segunda vía, ¿es posible con JavaFX? – Anton

+0

Aún no se ha probado, pero esto puede ayudar: https://forums.oracle.com/forums/thread.jspa?threadID=2373227&tstart=240 – pgras

+0

Cuando intento esto, aparece un ícono en "JavaFX clic para actualizar gratis". Si hago clic en "hacer clic para iniciar", solo necesito una versión más nueva de JavaFX. Intenté cambiar la versión 2.0 a la 2.2 anterior. Sin embargo, no creo que el problema sea que la versión de JavaFX/Java en mi navegador está desactualizada porque casi he podido construirla usando el plugin jfx maven https://github.com/zonski/javafx-maven- Complemento pero falla cuando intento acceder a los recursos de red aunque debería haber firmado la aplicación. –

2

Gracias mucho, este enlace es útil. Así pues, ahora mi pom se ve así:

<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> 

lo tanto, es posible ejecutar la aplicación desde la línea de comando "java-jar myapp.jar" ahora, pero no he probado la forma en que se ejecuta con dependencias.

+0

hay un problema con las dependencias - Obtuve java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory – rafalmag

Cuestiones relacionadas