Microsoft 社는 2022년 6월 15일 Internet Explorer 11의 지원을 종료했습니다.

Eclipse JDT Compilier (ecj) 로 컴파일하기

제목

Eclipse JDT Compilier (ecj) 로 컴파일하기

1. Eclipse JDT Compilier (ecj) 다운로드

1.1. 이클립스 홈페이지에서 다운로드 받는 방법

1.1.1. 이클립스 홈페이지의 다운로드 페이지 접속

이클립스 홈페이지에 접속한 뒤에 Projects > Project Finder 에서 "Eclipse JDT" 로 검색한 후에, "Eclipse JDT (Java development tools)" 의 "Downloads" 링크로 이동한 후에, 다시 "Download Eclipse JDT (Java development tools)" 링크로 이동하면, The Eclipse Project Downloads 에 접속할 수 있다.

1.1.2. Java 11 을 위한 ecj-4.20.jar 다운로드

The Eclipse Project Downloads 에서 archive site 로 접속해서 Eclipse 4.20.0 Release Build: 4.20 페이지에 접속할 수 있다.

아래쪽으로 스크롤을 내리다가 JDT Core Batch Compiler 에서 ecj-4.20.jar 을 다운로드 한다.

Java 11 의 경우 최신버전(2024. 11. 14. 현재 4.33) 을 다운로드 하면 다음과 같은 에러가 발생한다.

java.lang.UnsupportedClassVersionError: org/eclipse/jdt/core/compiler/batch/BatchCompiler has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 (unable to load class [org.eclipse.jdt.core.compiler.batch.BatchCompiler])

1.1.3. Java 17 이상인 경우

The Eclipse Project Downloads 에서 최신버전을 클릭하면, 2024. 11. 14. 현재 최신버전인 Eclipse 4.33.0 Release Build: 4.33 페이지에 접속할 수 있다.

아래쪽으로 스크롤을 내리다가 JDT Core Batch Compiler 에서 ecj-4.33.jar 을 다운로드 한다.

1.2. Apache Tomcat 이 설치되어 있는 경우

설치되어 있는 Apache Tomcat 이 비교적 최신 버전이라면, lib/ecj-*.jar 파일을 이용할 수 있다.

다만, 오래된 ecj-*.jar 이라면, org.eclipse.jdt.core.JDTCompilerAdapter 가 없기 때문에 다음과 같이 확인한다.

javap -classpath ecj-4.20.jar org.eclipse.jdt.core.JDTCompilerAdapter

참고로 org.eclipse.jdt.core_3.16.0.jar ecj-4.6.3.jar ecj-4.4.2.jar 같은 버전들은 org.eclipse.jdt.core.JDTCompilerAdapter 가 없다.

2. Apache Ant lib 디렉토리로 ecj-*.jar 파일 복사

${ANT_HOME}/lib 디렉토리로 복사한다.

심볼릭 링크(symbolic link) 로 걸어도 된다.

3. build.xml 파일 수정

<target> 이 시작하기 전에 다음과 같은 내용을 추가한다.

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
<presetdef name="javac">
<javac includeantruntime="false">
<compilerarg compiler="org.eclipse.jdt.core.JDTCompilerAdapter" line="-1.7 -warn:-serial,-raw" />
</javac>
</presetdef>

<presetdef name="javac"> 부분에 추가하면 <javac> Task 마다 추가할 필요가 없다.

4. 관련 주제

4.1. 필요 없는 경고 (WARNING) 메시지 생략하기

Eclipse JDT Compilier (ecj) 의 장점은 더 많은 경고 (WARNING) 메시지를 얻을 수 있다는 것인데, 너무 많은 경고메시지를 피하기 위해서 -warn 파라미터를 조정할 수 있다.

많이 사용되는 것은 -warn:-serial,-raw 혹은 -warn:-unchecked,-serial,-raw 정도이다.

  • -serial : serialVersionUID 가 누락되었다는 경고를 생략한다.
  • -raw : "Class is a raw type. References to generic type Class should be parameterized" 와 같은 경고를 생략한다.
  • -unchecked : "Type safety: Unchecked cast from Object to String" 와 같은 경고를 생략한다.

-warn 파라미터에 추가할 수 있는 다른 항목은 다음과 같은 명령어로 확인할 수 있다.

java -jar ecj-4.20.jar -help:warn

4.2. 소스코드의 일부는 javac 로 컴파일하고, 나머지는 Eclipse JDT Compilier (ecj) 로 컴파일 하기

아래와 같이 하면, kr/graha/legacy/ 아래의 파일들은 javac 로 컴파일하고, 나머지는 Eclipse JDT Compilier (ecj) 로 컴파일한다.

<javac destdir="${build.dir}"
excludes="kr/graha/legacy/**/*.java"
>
<src path="${src.dir}"/>
<classpath refid="master-classpath"/>
</javac>
<javac destdir="${build.dir}"
includes="kr/graha/legacy/**/*.java"
compiler="modern"
>
<src path="${src.dir}"/>
<classpath refid="master-classpath"/>
</javac>

javac 로 컴파일하는 옵션은 compiler="modern" 이다.

4.3. Eclipse JDT Compilier (ecj) 로 명령행에서 컴파일

java -jar ecj-4.20.jar HelloWorld.java

Java 와 ecj-*.jar 는 각각 어울리는 버전들이 있다.

  • Java 17 : ecj-4.33.jar
  • Java 11 : (Apache Tomcat 9.x 에 번들된) ecj-4.20.jar 정도
  • Java 8 : (Apache Tomcat 8.x 에 번들된) ecj-4.6.3.jar 나 (Apache Tomcat 7.x 에 번들된) ecj-4.4.2.jar 정도

Java 11 이라면, 최신버전인 ecj-4.33.jar 에서는 java.lang.UnsupportedClassVersionError 에러가 발생하고, ecj-4.6.3.jarecj-4.4.2.jar 에서는 rt.jar 파일을 찾을 수 없어서 발생하는 The type java.lang.Object cannot be resolved. 에러가 발생하므로 주의를 요한다.

공식 매뉴얼의 예제는 다음과 같이 rt.jar 를 요구하고 있는데, rt.jar 파일은 java 1.9 부터 없어졌다.

java -jar ecj-4.20.jar HelloWorld.java -classpath rt.jar

5. 참고 자료

제목

첨부파일