[Java] 컴파일러의 target 옵션

Published: by Creative Commons Licence

자바 컴파일러인 javac는 target 옵션이 존재한다. 이 옵션은 특정 Java 버전(보통은 현재 사용중인 JDK보다 낮은)에서도 실행가능한 클래스 파일을 만드는 옵션이다.

javac -target 8 Test.java
# Test.java 파일을 컴파일하되 Java 8에서 실행 가능하도록 호환처리한다.

이클립스에서는 이 옵션이 Window > Preferences 혹은 각 프로젝트의 Properties 설정화면에 Java Compiler 메뉴로 제공된다.

'Compiler Compliance Level'이 1.8이면 사용중인 Java의 버전이 10이라도 8 버전으로 컴파일한다.

메이븐에선 pom.xml에서 컴파일러 플러그인 설정으로 target을 지정할 수 있다.

<build>
  <finalName>laboratory</finalName>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.5.1</version>
      <configuration>
        <source>${java-version}</source>
        <target>${java-version}</target>
        <encoding>${encoding}</encoding>
      </configuration>
    </plugin>
  </plugins>
</build>

사족으로, 이클립스는 컴파일 에러가 나는 자바파일도 일단 class 파일로 만든다. 이게 이클립스만 그러는건지는 아직 확실하지 않은데, 일단은 메서드 단위로 컴파일한다는게 확인되었다.

이럴때:

public class Test {
    public void m01() {
        System.out.println("hi");
    }

    public void m02() {
        System.out.println(abc); // compile error: abc cannot be resolved to a variable
    }
}

요딴식으로:

public class Test {
    public void m01() {
        System.out.println("hi");
    }

    public void m02() {
        throw new Error("Unresolved compilation problem: \n\tabc cannot be resolved to a variable\n");
    }
}