Q1 Javac compile option

#1 상위 버전에서 컴파일한 바이트코드를 하위 버전으로 실행시키면?

#2 하위버전에서 컴파일한 바이트코드를 상위 버전으로 실행시키면?

Q1-1 생각해봅시다.

우리가 사용하는 스프링 혹은 다른 라이브러리들은 상위버전으로 작성되었는데 우리가 IDE에서 Java8로 실행시켜도 정상적으로 동작합니다. 그렇다면 왜 정상동작 할까요?

이유는 javac 옵션에 있습니다. 자바를 컴파일할때 옵션을 부여함으로써 우리는 상위버전의 java를 하위 버전으로 실행 가능합니다.

스프링은 공식적으로 최신 자바 버전을 지원하며, 최소 버전은 java8입니다. 그말은 컴파일 옵션을 통해 java8까지 지원 가능하게끔 개발했다는 뜻입니다.

그런데 정말 안타깝게도 일부 maven plugin은 이러한 부분을 생각하지 않고 개발되었습니다. 때문에 java8을 사용하다가 이러한 Exception을 볼 수 있습니다.

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: 
Hello has been compiled by a more recent version of the Java Runtime (class file version 59.0), 
this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)

이러한 Exception은 위에서 Test해보았듯이 하위 버전에서 상위 버전의 바이트코드를 실행할 때 발생합니다. 우리는 그렇기때문에 javac 옵션에 대해 학습해야합니다.

→ 1주차 추가과제로 진행 [ javac 옵션 조사 ]