본문 바로가기
WEB,WAS/Spring

maven 빌드 속도 개선

by Rainbound-IT 2024. 1. 9.
반응형

 

목차

     

     

     

    1. 예시

    1. mvn clean install[정보] 총 시간: 01:05 h
    2. mvn clean install -DskipTests[정보] 총 시간: 18:35분
    3. mvn clean install -Dmaven.test.skip -DskipTests 총 시간: 10:58분
    4. mvn -T 1C clean install -Dmaven.test.skip -DskipTests[정보] 총 시간: 04:00분
    5. -Dmaven.javadoc.skip=true를 추가하여 Archmed가 주석 처리한 대로 생성될 javadoc을 건너뛸 수도 있습니다. mvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true
    6. * imports 를 사용하지 마세요 . IntelliJ에서는 > Analyze > Run Inspection by name > * imports 를 선택하여 모든 * imports를 찾아서 수정하세요.
    7. 프로젝트에서 사용하지 않는 모든 가져오기 제거 > Intellij > 분석 > 이름으로 검사 실행 > 사용하지 않는 가져오기
    8. Intellij에서 사용되지 않는 코드 (클래스, 변수, 필드, 매개변수 등)를 모두 제거합니다 . 분석 > 이름별 검사 실행 > 사용되지 않는 선언.
    9. 최신 JAVA 버전 으로 업그레이드
    10. mvn clean 작업이 빌드하기 전에 TARGET 폴더를 정리하는 데 2분이 걸리는 것으로 나타났습니다 . 저는 Quickclean 이라는 새 작업을 만들었고 , clean 대신 이런 식으로 사용하고 있습니다 mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests. 이 새로운 작업 Quickclean은 빌드 폴더의 이름을 TARGET에서 TARGET-yyyy-MM-dd-HH-mm( 매우 빠른 것이 무엇인지 )로 바꾸는 것뿐입니다 . 이제 새 를 만들 때마다 mvn quickclean install...빌드 시간이 포함된 폴더가 생깁니다. 불편한 점은 하드 디스크 공간을 많이 차지할 수 있으므로 때때로 이러한 모든 디렉터리를 정리해야 한다는 것입니다. 그래서 저는 이 폴더를 모두 휴지통에 넣기 위해 Trashclean 이라는 또 다른 작업을 만들었습니다. 나는 이 작업을 매주 정시에 실행하고 있습니다. 또는 내 작업에 따라 월 mvn trashclean.

     

     

    2. 일반 권장 사항

     

    최적화를 시도하기 전에 올바른 Maven 단계를 사용하면 많은 시간을 절약할 수 있다는 점을 기억해 봅시다 . 코드만 컴파일하면 되는데 왜 전체 설치를 실행 하고 로컬 저장소를 오염시키나요?

    반면 다중 모듈 프로젝트에서는 변경된 모듈과 해당 모듈에 종속된 모듈만 다시 빌드하는 것이 가능합니다. 예를 들어, module1  module2 만 변경하는 경우 다음을 실행할 수 있습니다.

    $ mvn clean install -pl module1,module2 -am복사

     

     

     

    3. 다중 스레드 사용

     

    기본적으로 Maven 빌드는 단일 스레드에서 순차적으로 실행됩니다. 그러나 요즘 모든 컴퓨터에는 다중 코어가 있습니다. 이를 활용하여 -T 옵션을 사용하고 모듈을 병렬로 빌드해 보겠습니다 .

    $ mvn clean install -T 1C복사
    • -T 1C는 Maven이 사용 가능한 코어당 하나의 스레드를 사용함을 의미합니다.
    • -T 4는 Maven이 4개의 스레드를 사용하도록 강제합니다.
    • -T auto는 Maven이 사용할 스레드 수를 결정하도록 합니다.

    마지막으로 Maven Reactor는 서로 의존하는 모든 모듈이 순차적으로 실행되도록 보장합니다.

     

     

     

    4. 테스트 최적화

    테스트는 소프트웨어 개발의 중요한 부분입니다. 그럼에도 불구하고 덜 실행하는 데는 많은 시간이 걸립니다.

     

     

     

    4.1. 병렬로 테스트 실행

    기본적으로 Surefire 플러그인은 단위 테스트를 순차적으로 실행합니다. 그러나 병렬로 실행되도록 구성할 수 있습니다 . 예를 들어 모든 테스트 모음을 병렬로 실행하고 사용 가능한 코어당 하나의 스레드를 사용하려면 다음을 실행합니다 .

    mvn clean install -Dparallel=all -DperCoreThreadCount=true복사

    그러나 프로젝트에 단위 테스트가 많지 않으면 병렬화의 오버헤드 비용으로 인해 속도 향상이 무효화될 수 있습니다.

     

     

     

    4.2. 테스트 실행 건너뛰기

    때로는 로컬 환경에서 테스트를 실행할 필요가 없습니다. Maven -DskipTests 옵션은 테스트 폴더를 컴파일하는 동안 테스트 실행을 건너뜁니다 .

    $ mvn clean install -DskipTests복사

    고도로 테스트된 프로젝트에서 필요하지 않을 때 테스트를 건너뛰면 시간을 절약할 수 있습니다!

     

     

     

    4.3. 테스트 컴파일 건너뛰기

    또한 -Dmaven.test.skip=true 옵션을 사용하여 테스트 실행을 건너뛰고 컴파일하지도 않을 수 있습니다 .

    $ mvn clean install -Dmaven.test.skip=true복사

    이 방법을 사용하면 전체 빌드 시간이 더욱 단축됩니다.

     

     

     

    5. JVM 매개변수 최적화

    기본적으로 HotSpot JVM은 계층화된 컴파일을 사용합니다 . 즉, 클라이언트와 서버 컴파일러를 모두 사용하여 Java 바이트코드를 최적화합니다. 이 기능은 서버에서 수명이 긴 프로세스를 최적화합니다. 그러나 빌드는 단기 프로세스의 연속입니다. 따라서 다음 JVM 매개변수를 사용해 보겠습니다.

    • -XX:-TieredCompilation : JVM은 계층화된 컴파일을 사용하지 않습니다.
    • -XX:TieredStopAtLevel=1 : JVM은 클라이언트 컴파일러만 사용합니다.

    다음 내용으로 .mvn/jvm.config 파일을 생성하여 Maven에서 이러한 옵션을 사용하도록 할 수 있습니다 .

    -XX:-TieredCompilation -XX:TieredStopAtLevel=1복사

    실제로 Maven은 변경되지 않은 코드를 다시 컴파일하는 것을 피하기 위해 캐싱 및 증분 빌드 기술을 사용합니다. 따라서 Maven이 컴파일해야 하는 새로운 코드가 많을수록 이 기술은 더 효율적입니다.

     

     

     

    6. 오프라인 전환

    Maven은 예를 들어 종속성 해결 및 플러그인 다운로드를 위해 빌드 중에 서버로 여러 번 왕복합니다. 특히, 매번 새로운 스냅샷 업데이트를 확인합니다 . 오프라인 모드 로 전환하면 이를 방지할 수 있습니다 .

    $ mvn clean install -o복사

    분명히 일부 종속성을 업데이트해야 할 때는 오프라인 모드를 사용할 수 없습니다.

     

     

     

    7. 병목 현상 식별

    이전 기술이 빌드 시간을 허용 가능한 수준으로 되돌리는 데 도움이 되지 않으면 프로파일러 덕분에 빌드 문제를 해결할 수 있습니다 . 먼저 새로운 Maven 프로젝트를 생성해보자. 그런 다음 Maven Profiler 프로젝트 GitHub의 지침에 따라 설치하겠습니다. 마지막으로 pom.xml 에 종속성을 추가해야 합니다 .

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-profiler-plugin</artifactId>
                <version>1.7</version>
            </plugin>
        </plugins>
    </build>복사

    이제 다음 명령을 실행하여 빌드 타이밍에 대한 더 많은 통찰력을 얻을 수 있습니다.

    $ mvn clean install -Dprofile복사

    빌드가 완료되면 .profiler 폴더 내에서 HTML 텍스트로 보고서를 찾을 수 있습니다. 그것을 살펴보자:

     

    보시다시피 프로파일러는 모든 플러그인 실행을 나열하고 소요 시간을 기록합니다. 두 번째 섹션에는 다운로드된 아티팩트가 나열됩니다. 이 정보는 대상 환경에서 거의 또는 전혀 가치를 제공하지 않으면서 실행하는 데 오랜 시간이 걸리는 플러그인을 식별하는 데 도움이 될 수 있습니다.

     

     

     

     

    8. Maven 프로필 사용

    병목 현상을 식별하면 Maven 프로필을 사용하여 필요에 따라 병목 현상을 건너뛰고 시간을 절약 할 수 있습니다 . 예를 들어 통합 테스트를 실행하는 데는 일반적으로 매우 오랜 시간이 걸립니다. 게다가 로컬 환경에서 매번 실행하는 것은 유용하지 않습니다.

    pom.xml  비상 안전 플러그인 구성을 추가해 보겠습니다 .

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.1.2</version>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>복사

    이제 건너뛰기 위한 프로필을 추가할 수 있습니다.

    <profiles>
        <profile>
            <id>skipITs</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <configuration>
                            <skip>true</skip>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>복사

    SkipITs 프로필이 활성화된 구성을 재정의한 덕분에 이제 통합 테스트를 건너뜁니다.

    $ mvn clean install -PskipITs복사

    9. Maven 데몬 사용하기

    Maven 데몬은 Maven 빌드 속도를 향상시키는 것을 목표로 합니다 . 데몬은 빌드가 완료된 후에도 활성 상태로 유지되는 수명이 긴 백그라운드 프로세스입니다. 필수 구성 요소를 메모리에 유지하여 빌드 오버헤드를 줄이고, 반복적인 시작 및 초기화 프로세스를 방지하여 더 빠른 프로젝트 빌드를 가능하게 합니다. 설치하려면 프로젝트의 GitHub 페이지에 있는 지침을 따르세요. 이제 이를 사용하여 빌드를 시작하겠습니다.

    $ mvnd clean install복사

    데몬을 시작해야 하는 경우 빌드 시간이 약간 더 길어집니다. 마지막으로 이전 기술을 Maven 데몬과 결합할 수 있습니다. 예를 들어 데몬을 통해 빌드하고 테스트를 건너뛸 수 있습니다.

    $ mvnd clean install -Dmaven.test.skip=true복사

    그럼에도 불구하고 Maven 데몬은 수명이 긴 프로세스이기 때문에 이전에 했던 것처럼 JVM 매개변수를 설정하면 아마도 유익보다는 해를 끼칠 가능성이 더 크다는 점을 지적해 보겠습니다.

     

     

     

    https://www.baeldung.com/maven-fast-build

     

    https://stackoverflow.com/questions/32368976/ways-to-make-maven-build-faster

     

    Ways to make maven build faster?

    I have a multi module java project. Maven takes almost around 40 secs to build it. I have tried maven with multi threaded builds too by specifying -T and -C args for no of threads and cores to be u...

    stackoverflow.com

     

    반응형

    댓글