2012-05-10 134 views
7

我有這樣與結構的項目:JavaFX應用程序

主要項目
-libary-1
-library-2
-i-需要,JavaFX的應用,這裏

所以,我需要在我的Maven項目中使用JavaFX 2應用程序,並且它應該使用庫-1和庫-2以及它的依賴關係。我無法找到JavaFX 2項目的任何Maven原型,並且找不到任何有關如何通過Maven 3構建JavaFX應用程序的足夠信息。我不需要任何部署到Web,它將只有桌面應用程序。

因此,任何人可以幫助解決這個問題?

UPD:當我嘗試運行應用程序,這是由pgras方式建造

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

異常發生。

+0

參見[我如何添加一個JavaFX 2.0級到現有的Maven項目?(http://stackoverflow.com/questions/8916461/how-can-i-add-a-javafx-2-0-class -to-an-existing-maven-project/8918191) – jewelsea

+0

你正在使用Windows還是其他操作系統?我問,因爲我也有一些困難來設置這一點,到目前爲止,我在Windows上有一個工作解決方案,在MacOS上仍然存在一些問題。我可以給出一個更長的解釋,我是如何在Windows上做的... – pgras

+0

順便說一句如何嘗試運行該應用程序? – pgras

回答

4

所以我想你已經使用Java 7,我闖到大知道你需要什麼,編譯你只需要依賴於JavaFX的,所以在你的POM對JavaFX的應用:

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

而在你的Maven的settings.xml添加(和適應路徑系統):

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

它應該是足夠的彙編並jar文件...如果不告訴我,我會發布更多的信息.​​. 。

+0

所以,我試圖做到這一點...... – Anton

0

我加另一個答案,因爲它是一個很長的一個,它顯示了我如何也生成簽名的jar和JNLP webstart文件。

所以首先我創建了一個證書,能夠登錄罐子(你會被要求輸入一些信息,我用「的SuperPass」爲密碼,看看它是POM用):

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

然後我用這個pom.xml中(其中有一個父POM,但它不包含與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> 

終於我運行mvn安裝,結果會在焦油中獲得/部署...

好運:)

+0

謝謝,但是當我嘗試通過運行jnlp它運行,當我嘗試運行它通過maven運行插件或通過「java -jar myapp.jar」ClassNotFoundException仍然存在。我不需要jnlp,我需要通過第二種方式運行應用程序的可能性,JavaFX有可能嗎? – Anton

+0

尚未測試,但這可能有所幫助:https://forums.oracle.com/forums/thread.jspa?threadID=2373227&tstart=240 – pgras

+0

當我嘗試此操作時,我在「JavaFX click for free update」中看到一個圖標。如果我點擊「點擊啓動」,我只需要獲得更新版本的JavaFX。我試着將版本2.0更改爲2.2以上。但是我不認爲問題是我瀏覽器中的JavaFX/Java版本過時了,因爲我幾乎可以使用jfx maven插件https://github.com/zonski/javafx-maven-插件,但它嘗試訪問網絡資源時失敗,即使它應該已經對應用程序進行了簽名。 –

2

謝謝了很多,這個環節是有幫助的。所以,現在我的聚甲醛是這樣的:

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

因此,可以從運行命令行應用程序了,但我還沒有測試「的罐子myapp.jar的Java」它怎麼會與依賴運行。

+0

依賴關係有問題 - 我得到java.lang.NoClassDefFoundError:org/slf4j/LoggerFactory – rafalmag