2016-07-20 2 views
6

~ 2400 개의 클래스가있는 Java 프로젝트가 있습니다. 그들은 대부분 XML 스키마에서 XJC를 사용하여 몇 가지 확장자를 사용하여 생성됩니다.Java 컴파일 속도

편집 작업에 20 분 정도의 시간이 소요되며,이를 개선하기 위해 수행 할 수있는 작업이 있는지 궁금합니다.

유사한 프로젝트의 생성 클래스 수는 절반이지만, 수작업으로 작성된 클래스는 약 3000 개입니다. 이것은보다 위장 할 수있는 2-5 분 동안 컴파일됩니다.

컴파일 할 때 Java 8 (Windows의 경우 1.8.0_92)을 사용하고 있지만 소스 및 대상 버전 6을 사용하고 있습니다 (따라서 Java 8에서는 느린 유형의 시스템이 아닙니다). 컴파일은 maven-compiler-plugin 3.5.1을 사용하여 Maven 3.3.3을 사용하여 수행됩니다. 나는 Maven에서 컴파일러를 포킹하고 maxmem 2048m을 사용한다.

생성 된 클래스는 일반적으로 작지만 모든 생성 된 클래스를 다루는 거대한 방문객이 하나 있습니다 (따라서 하나는 모두, 하나는 모든 종속성에 해당). 나는 이것에 관해서 정말로 아무것도 할 수 없다.

"mvn clean install"에서 "mvn install"(또는 "mvn compile")로 전환하는 것이 도움이되지만, 항상 옵션이 아닙니다 (기본적으로 Eclipse는 컴파일 된 파일을 사용하므로 테스트가 제대로 실행됩니다.) , 내가 커밋하기 전에 같은 명령에서 테스트를 실행하는 동안 청소해야합니다).

편집 단위 파일 (예 : Eclipse/SourceTree)을 보는 백그라운드 프로세스가 없지만 스위치를 끌 수없는 바이러스 스캐너가 있습니다. 대부분의 시간은 javac에 의해 소비 된 것 같습니다.

javac에는 상호 종속적 인 클래스 수의 수퍼 선형이있는 무언가가 있습니까? 아니면이 컴파일 시간을 피할 수있는 방법이 있습니까?

: Maven 멀티 스레드 실행에 대한 제안이 있습니다. 불행히도 저는 이미 이것을 시도해 보았습니다. 그리고 많은 상호 의존적 인 클래스를 가진 단일 모듈 프로젝트이므로 여기서는별로 도움이되지 않습니다.

E2 : 프로젝트를 JAXB 코드 만있는 모듈과 메인 코드를 사용하여 모듈로 분할했습니다. JAXB 코드는 범인이 아니 었습니다. Tesla Maven Profiler을 실행했고 컴파일이 문제인지 확인했습니다. 관련 부분 :

org.apache.maven.plugins:maven-compiler-plugin:3.5.1 (default-compile) 18m 48s 
org.apache.maven.plugins:maven-compiler-plugin:3.5.1 (default-testCompile) 14s 770ms 
org.apache.maven.plugins:maven-surefire-plugin:2.12.4 (default-test) 1m 51s 
org.apache.maven.plugins:maven-war-plugin:2.0.1 (default-war) 14s 635ms 

나는 지난 세 시간 동안 완벽하게 괜찮습니다.

이것은 단지 1000 개의 Java 클래스이며 모두 JAXB를 사용하여 생성 된 일반적인 방문자를 상속합니다. 내 컴파일 구성 :

   <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.5.1</version> 
        <configuration>   
          <fork>true</compiler> 
          <source>${compileSource}</source> 
          <target>${compileSource}</target> 
          <meminitial>512m</meminitial> 
          <maxmem>2048m</mexmem> 
          <encoding>UTF-8<eencoding> 
        </configuration> 
       </plugin> 

(compileSource이 1.6)

+0

Re : "컴파일 된 파일로 이클립스 나사 제거": Eclipse와의 충돌을 피하기 위해 Eclipse에서 "자동으로 빌드"를 선택적으로 활성화/비활성화하여 많은 것을 향상시킬 수 있습니다. 한 번에 하나의 도구 만 프로젝트에서 작동하도록하십시오. Maven이 실행 된 후에 Eclipse에서 리소스를 새로 고치는 것을 잊지 마십시오. –

답변

4

밝혀졌습니다. 문제는 실제로 javac에 있습니다. Javac은 너무 많이 오버로드 된 메소드를 가진 클래스를 잘 처리 할 수 ​​없다 (http://mail.openjdk.java.net/pipermail/compiler-dev/2013-May/006339.html).

방문객 (...) 메소드가 각 클래스 (1100+)에 생성되어 각 미분을 컴파일하는 데 몇 초가 걸렸습니다. 내가 수백 가지 방법을 사용 했으므로이 모든 것이 합쳐졌습니다.

방문자가 jaxb-visitor (https://github.com/massfords/jaxb-visitor)를 사용하여 생성되었으며 내 자신의 코드 포크 (https://github.com/klafbang/jaxb-visitor)를 사용하여 생성 된 메서드에 typename을 포함하여 문제를 해결했습니다.

컴파일 시간이 40 분에서 2 분으로 감소했습니다.

2

당신은 멀티 스레드 옵션은 당신이 하나의 모듈이 있기 때문에, 귀하의 경우 개선 할 수 있습니다 테스트 실행이 될 수 있는지 확실하지, 3 년 이후 도입 사용할 수 있습니다 조금 빠를 수 있지만 link 병렬 빌드를

+0

제안 해 주셔서 감사합니다. 언급하기를 잊어 버렸습니다. 이미 멀티 스레드 빌드를 시도했습니다. 제 질문을 편집 할 것입니다. 불행히도 의심 스럽지만 실제로 문제가 2400 상호 의존 클래스를 컴파일하는 데 실제로 도움이되지는 않습니다. – klafbang

1

하는 방법입니다 (T)를 설명한다이 옵션 여기

mvn clean install -T5C 

으로하지만 확인하실 수 있습니다 o 문제를 해결하고, maven 프로젝트를 분할하여 생성 된 클래스에 대해서만 생성 할 수 있으며, xsd가 변경 될 때마다 매번 다시 빌드 할 필요가 없습니다.그리고 다른 프로젝트에 의존하게하십시오.

+0

간혹 가장 간단한 해결책을 간과 할 수 있습니다 ... 제안에 감사드립니다! 그것을 시도하고 그것이 문제를 해결하는지 여부에 대해 돌아올 것입니다. – klafbang

+0

많은 리팩토링 이후에 불행히도 문제가 해결되지 않았습니다. 내 JAXB 코드는 이제 "단지"3 ~ 4 분만에 컴파일되는 반면 응용 프로그램 코드는 대부분 (20-25 분) 소요됩니다. – klafbang

+0

-e 옵션을 사용하여 콘솔에서 maven을 실행하면 세부 사항을 기록 할 수 있으며, 대부분의 시간을 소비하는 곳을 볼 수 있습니다. 이 힌트를 사용하면 필요한 부분 만 컴파일하도록 프로젝트를 분할 할 수 있습니다. –