簡體   English   中英

如何加速JavaFX應用程序的maven構建?

[英]How can I speed up maven builds of JavaFX application?

通過在Netbeans 8中創建一個新項目可以重現我的問題:

新項目>> Maven >> JavaFX應用程序

然后添加org.springframework spring-context依賴項。

構建時間從幾秒鍾增加到超過半分鍾,其中大部分時間是由於運行javafxpackager。

我可以使用緩慢版本的構建但是如何加快我的開發構建?

這是我的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.mycompany</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>mavenproject1</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <mainClass>com.mycompany.mavenproject1.MainApp</mainClass>
</properties>

<organization>
    <!-- Used as the 'Vendor' for JNLP generation -->
    <name>Your Organisation</name>
</organization>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                    <configuration>
                        <excludeScope>system</excludeScope>
                        <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>

                    <phase>package</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>${java.home}/../bin/javafxpackager</executable>
                        <arguments>
                            <argument>-createjar</argument>
                            <argument>-nocss2bin</argument>
                            <argument>-appclass</argument>
                            <argument>${mainClass}</argument>
                            <argument>-srcdir</argument>
                            <argument>${project.build.directory}/classes</argument>
                            <argument>-outdir</argument>
                            <argument>${project.build.directory}</argument>
                            <argument>-outfile</argument>
                            <argument>${project.build.finalName}.jar</argument>
                        </arguments>
                    </configuration>
                </execution>
                <execution>
                    <id>default-cli</id>
                    <goals>
                        <goal>exec</goal>                            
                    </goals>
                    <configuration>
                        <executable>${java.home}/bin/java</executable>
                        <commandlineArgs>${runfx.args}</commandlineArgs>
                    </configuration>
                </execution>
            </executions>  
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <compilerArguments>
                    <bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar</bootclasspath>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.16</version>
            <configuration>
                <additionalClasspathElements>
                    <additionalClasspathElement>${java.home}/lib/jfxrt.jar</additionalClasspathElement>
                </additionalClasspathElements>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency>
</dependencies>

謝謝! 丹尼爾

您可以在默認情況下處於非活動狀態的配置文件中定義插件。 然后,為了進行生產構建,您必須手動指定該配置文件的激活(或以任何其他標准方式激活它)。

你pom會像(只顯示差異):

<?xml version="1.0" encoding="UTF-8"?>
<project ...>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                ...
                <executions>
                    <!-- take this out of here
                    <execution>
                        <id>unpack-dependencies</id>
                        ...
                    </execution>
                    -->
                    <execution>
                        ...
                    </execution>
                </executions>
            </plugin>
            ...
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>javafxpackager</id>
            <build>
                <plugins>
                    <!-- INSERT THE exec-maven-plugin HERE, ONLY
                         WITH THE unpack-dependencies EXECUTION -->
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

在生產中運行mvn ... -Pjavafxpackager

要完成Nikos的回答,這是maven-assembly-plugin的配置,它為正常構建創建存檔。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>${mainClass}</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration> 
    <executions>
        <execution>
            <id>my-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>assembly</goal>
            </goals>
        </execution>
    </executions>
</plugin>

以上解決方案不起作用。 這個問題與javafxpackager無關。 原因在於maven標准配置。 在每個項目運行中,Maven默認執行項目清理。 這會刪除targets / classes /文件夾。 這是放置依賴項的所有解壓縮jar文件的同一文件夾。 如果在每次新的運行中都刪除了那些,那么必須一遍又一遍地解壓縮它們。 無論如何,繼承人如何防止干凈發生:

    <plugin>
  <artifactId>maven-clean-plugin</artifactId>
  <version>2.4.1</version>
  <configuration>
    <skip>true</skip>
  </configuration>
</plugin>

將其添加到您的POM.xml。 確保你的版本正確你可以在有效的pom中檢查你的maven clean插件的版本(那就是父pom +項目POM的組合)。 在netbeans中,您可以在打開項目的pom.xml文件時在有效選項卡下查看只讀有效的pom.xml。

請給我一些+ 1我希望獲得50分,這樣我最終可以評論其他人的答案。 謝謝!

編輯:

還要將skip添加到default-cli以避免錯誤

                <execution>
                    <id>default-cli</id>
                    <goals>
                        <goal>exec</goal>                            
                    </goals>
                    <configuration>
                                <skip>true</skip>
                        <executable>${java.home}/bin/java</executable>
                        <commandlineArgs>${runfx.args}</commandlineArgs>
                    </configuration>
                </execution>

編輯2:

對於那些想要保留清理干擾的人,另一種方法可以防止maven插件刪除所有jar文件:

<plugin>
<artifactId>maven-clean-plugin</artifactId>
     <version>2.4.1</version>
<configuration>
    <excludeDefaultDirectories>true</excludeDefaultDirectories>
    <filesets>
        <!-- delete directories that will be generated when you 
             start the develpment server/client in eclipse  
        -->
        <fileset>
            <directory>target/classes</directory>
            <excludes>
                <exclude>**/*</exclude>
            </excludes>
        </fileset>
    </filesets>
</configuration>

再次,確保是正確的

TL; DR:

要避免解壓縮依賴項,您根本不需要修改默認的pom.xml。 只需更改Netbeans按Run(或Debug)時調用的內容。 在nbactions.xml中更改:

  • runfx.args :用-cp %classpath ${mainClass}替換-jar "${project.build.directory}/${project.build.finalName}.jar" 這樣, exec目標不會嘗試執行任何jar,而是從target/classes目錄運行你的項目。 所以根本不需要構建jar。
  • 目標 :用“流程類”(或“測試”或您想要的任何階段)替換“包”目標。 我們不需要jar,所以不需要運行包階段。 沒有包裝階段也意味着沒有拆包/重新包裝等。

如果您需要包含所有依賴項的jar文件,只需在Netbeans中選擇“clean and build”或運行mvn clean install

背景:

在標准Netbeans JavaFX maven項目中按下run時會發生什么:

  • clean package exec - 在nbactions.xml中定義,在pom.xml中配置:
    • clean:像往常一樣 - 刪除目標目錄
    • 包:
      • 首先像往常一樣 - 復制資源並將源代碼編譯到目標/類,並將所有內容打包到沒有依賴項的jar
      • maven-dependency-plugin將所有依賴jar文件解壓縮到目標/類
      • exec-maven-plugin:unpack-dependencies(id“unpack-dependencies”是missleading,應該是類似“jar-with-dependencies”)執行javapackager,它構建一個帶有依賴項的jar覆蓋第一個jar
    • EXEC:
      • 使用$ {runfx.args}作為參數(在nbactions.xml中定義)執行java,即運行jar

上述更改后會發生什么:

  • clean process-classes exec - 在nbactions.xml中定義,在pom.xml中配置:
    • clean:像往常一樣 - 刪除目標目錄
    • 工藝類:
      • 像往常一樣 - 復制資源並將源代碼編譯到目標/類
    • EXEC:
      • 使用$ {runfx.args}作為參數(在nbactions.xml中定義)執行java,即運行類target / classes / path /到/ your / MainClass

更好的是:

您可能希望從nbactions.xml中刪除“干凈”目標。 這樣,每次反復都不會復制所有資源文件(盡管資源插件仍會繼續說“復制X資源” - 請參閱https://stackoverflow.com/a/33700970/3519572下的注釋) 。

現在,您可能還希望僅通過添加useIncrementalCompilation=false來重新編譯已更改的類而不是整個項目(例如,像<goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:exec -Dmaven.compiler.useIncrementalCompilation=false</goal> )。 但請務必閱讀https://stackoverflow.com/a/49700942/3519572

因此,您可能還想在“干凈”目標中添加工具欄按鈕,以便能夠隨時輕松地手動運行它: https//stackoverflow.com/a/26546551/3519572

BTW:

最后,您可能還想更改NetBeans生成的pom.xml。 至少我的NB 8.2引用了已棄用的javafxpackager(重命名為javapackager)。 對於java 8來說,似乎沒有必要使用<bootclasspath>..../lib/jfxrt.jar</bootclasspath>這一部分。如果我從終端運行它,它實際上會破壞我的構建。 刪除它似乎修復它,如果從NB啟動似乎沒有任何麻煩。

您還可以使用並行maven構建功能來加速。

默認情況下,Maven不會充分利用您的硬件。 它按順序構建所有模塊,而不是並行構建。 但是,通常您的項目設置不需要它是順序的。 通常,您可以命令Maven分析您的項目,包括依賴關系圖,並在可能的情況下並行構建項目。 您可以指定用於構建項目的確切線程數,也可以使用參數的可移植版本,並根據計算機上可用的CPU指定線程數。

mvn -T 4 install -- will use 4 threads
mvn -T 1C install -- will use 1 thread per available CPU core

有關詳細信息,請參閱: https//zeroturnaround.com/rebellabs/your-maven-build-is-slow-speed-it-up/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM