[英]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中更改:
-cp %classpath ${mainClass}
替換-jar "${project.build.directory}/${project.build.finalName}.jar"
。 這樣, exec
目標不會嘗試執行任何jar,而是從target/classes
目錄運行你的項目。 所以根本不需要構建jar。 如果您需要包含所有依賴項的jar文件,只需在Netbeans中選擇“clean and build”或運行mvn clean install
。
背景:
在標准Netbeans JavaFX maven項目中按下run時會發生什么:
上述更改后會發生什么:
更好的是:
您可能希望從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.