복붙노트

[SPRING] JavaFX 응용 프로그램의 maven 빌드 속도를 높이려면 어떻게해야합니까?

SPRING

JavaFX 응용 프로그램의 maven 빌드 속도를 높이려면 어떻게해야합니까?

Netbeans 8에서 새 프로젝트를 만들어 내 문제를 재현 할 수 있습니다.

새 프로젝트 >> Maven >> JavaFX 응용 프로그램

그런 다음 org.springframework 스프링 컨텍스트 종속성을 추가합니다.

빌드 시간은 몇 초에서 30 분 이상으로 늘어납니다. 대부분의 경우 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>

감사! 다니엘

해결법

  1. ==============================

    1.기본적으로 비활성 인 프로파일에서 플러그인을 정의 할 수 있습니다. 그런 다음 프로덕션 빌드를 만들려면 해당 프로필의 활성화를 수동으로 지정하거나 다른 표준 방식으로 활성화해야합니다.

    기본적으로 비활성 인 프로파일에서 플러그인을 정의 할 수 있습니다. 그런 다음 프로덕션 빌드를 만들려면 해당 프로필의 활성화를 수동으로 지정하거나 다른 표준 방식으로 활성화해야합니다.

    당신은 pom (단지 diffs가 보여주게되는)과 같을 것이다 :

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

  2. ==============================

    2.Nikos의 답을 완성하기 위해, 이것은 일반적인 빌드를위한 아카이브를 생성하는 maven-assembly-plugin의 설정입니다.

    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>
    
  3. ==============================

    3.위의 솔루션은 작동하지 않습니다. 이 문제는 javafxpackager와는 아무런 관련이 없습니다. 원인은 표준 구성에 있습니다. 모든 프로젝트 실행시 Maven은 기본적으로 프로젝트를 정리합니다. 그러면 대상 / 클래스 / 폴더가 삭제됩니다. 그곳은 당신의 의존성 (dependencies)의 모든 압축 해제 된 jar 파일들이 위치하는 동일한 폴더입니다. 이들이 새로 실행될 때마다 삭제되면 계속해서 다시 압축을 풀어야합니다. 어쨌든, 당신이 깨끗한 것을 어떻게 방지 할 수 있는지 heres :

    위의 솔루션은 작동하지 않습니다. 이 문제는 javafxpackager와는 아무런 관련이 없습니다. 원인은 표준 구성에 있습니다. 모든 프로젝트 실행시 Maven은 기본적으로 프로젝트를 정리합니다. 그러면 대상 / 클래스 / 폴더가 삭제됩니다. 그곳은 당신의 의존성 (dependencies)의 모든 압축 해제 된 jar 파일들이 위치하는 동일한 폴더입니다. 이들이 새로 실행될 때마다 삭제되면 계속해서 다시 압축을 풀어야합니다. 어쨌든, 당신이 깨끗한 것을 어떻게 방지 할 수 있는지 heres :

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

    이것을 POM.xml에 추가하십시오. 올바른 버전을 가져 왔는지 확인하십시오. 유효한 POM (부모 POM + 프로젝트 POM이 결합 된)에서 Maven 클린 플러그인의 버전을 확인할 수 있습니다. netbeans에서는 프로젝트의 pom.xml 파일을 열 때 유효한 탭 아래에 읽기 전용으로 효과적인 pom.xml을 볼 수 있습니다.

    제게 + 1을주세요. 50 점을 얻고 싶습니다. 그래서 다른 사람들의 대답에 대해 논평 할 수 있습니다. 고맙습니다!

    편집하다:

    또한 오류를 방지하려면 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 파일을 삭제하지 못하게하는 또 다른 방법을 heres에 추가합니다.

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

    다시 말하지만 올바른지 확인하십시오.

  4. ==============================

    4.TL; DR :

    TL; DR :

    의존성을 푸는 것을 피하기 위해, 기본 pom.xml을 전혀 수정할 필요가 없습니다. Run (또는 Debug) 키를 누를 때 Netbeans이 호출하는 것을 변경하십시오. nbactions.xml 변경 사항 :

    모든 의존성을 가진 jar 파일이 필요한 경우 Netbeans에서 "clean and build"를 선택하거나 mvn clean install을 실행하십시오.

    배경:

    표준 Netbeans JavaFX maven 프로젝트에서 실행을 누르면 어떻게됩니까?

    위 변경 사항은 다음과 같습니다.

    더 나은 :

    nbactions.xml에서 "깨끗한"목표를 제거 할 수 있습니다. 이렇게하면 모든 리소스 파일은 매번 반복해서 복사되지 않습니다 (리소스 플러그인에서 "X 리소스 복사 중"이라고 계속 말하더라도 - https://stackoverflow.com/a/33700970/3519572 아래의 설명 참조) .

    이제는 전체 프로젝트가 아닌 변경된 클래스를 useIncrementalCompilation = false (예 : org.codehaus.mojo : exec-maven-plugin : 1.2.1 : exec -Dmaven.compiler.useIncrementalCompilation = false ). https://stackoverflow.com/a/49700942/3519572를 반드시 읽어보십시오!

    따라서 언제든지 수동으로 쉽게 실행할 수 있도록 "깨끗한"목표에 도구 모음 단추를 추가 할 수도 있습니다 (https://stackoverflow.com/a/26546551/3519572).

    BTW :

    마지막으로 NetBeans에서 생성 된 pom.xml을 변경하는 것이 좋습니다. 최소한 내 NB 8.2는 deprecated javafxpackager (javapackager로 이름 변경)를 참조합니다. 또한 .... / lib / jfxrt.jar 부분은 java 8에서는 필요하지 않습니다. 터미널에서 실행하면 실제로 빌드가 중단됩니다. 제거하면 NB에서 시작하면 문제가 발생하지 않는 것으로 보입니다.

  5. ==============================

    5.병렬 Maven 빌드 기능을 사용하여 속도를 향상시킬 수도 있습니다.

    병렬 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/

  6. from https://stackoverflow.com/questions/25135775/how-can-i-speed-up-maven-builds-of-javafx-application by cc-by-sa and MIT license