IT/development

[Java] java class version 확인(feat. unsupported major version..)

알 수 없는 사용자 2022. 11. 23. 06:55
반응형

목차

    image source:https://unsplash.com/s/photos/java

     

    java class version 확인

    개발을 하다보면 컴파일된 자바 클래스 버전을 확인해야 되는 경우가 있다.

    실서버의 클래스 버전을 미리 확인 한 다음 그에 맞춰서 로컬 소스를 컴파일 하는게 좋다.

    공공기관 배포 시 에러를 처음 만났을 때 30분을 날려먹은 기억이 난다.(노트북을 가져가지 않아서 다시 컴파일을 한 파일을 받아야 되서)😭

    만일 미리 확인 하지 않고 그냥 배포할 경우 unsupported major version 에러를 만나게 될 수도 있다.

    만나는 걸 권장하지는 않지만 어떤 에러인지 직접 만나보는 것도 나쁠 것 같지는 않다.(시간이 여유로우면)

    에러는 개발자를 성장 시켜주는 듯 싶다.

     

    예를 위해 일부러 에러를 발생시켜 봤다.

    예제는 IncludedInfo.class에서 버전 에러가 난 것인데 Unsupported major.minor version 52.0라고 한다.

    "java major version"으로 구글링 해보면 자세히 나오는데 java major.minor versino이 52이면 

    image source:https://fabianlee.org/2018/01/19/java-determining-the-java-version-used-to-compile-a-class-class-file-has-the-wrong-version

    java 8버전으로 컴파일 된 클래스란 소리다.

     

    진짜인지 확인 해보겠다.(전제조건 내 컴퓨터에 jdk 환경변수가 잡혀 있어야 된다.)

    cmd 실행 후 해당 에러가 발생하는 클래스가 있는 경로로 이동 후 아래처럼 명령어를 입력한다.

    javap -verbose class명(.class는 생략해도 무방) | find "version"

    내 경우는 이클립스의 workspace를 G드라이브로 빼놔서 G드라이브의 workspace의 프로젝트 경로로 이동했다.

    위에서 예상대로 major version이 52라고 나온다, 즉 해당 class는 java 1.8 버전으로 컴파일 된거다.

    이 경우는 1.8에 맞춰서 로컬 소스를 컴파일 해줘야 실제 배포 시 에러가 발생하지 않는다.

     

    이클립스 java compile 버전 변경😊

    이클립스에서 컴파일 버전 설정은 아래처럼 하면 된다.

    해당 프로젝트 우클릭 > Java Compiler > Compiler compliance level에서 원하는 버전으로 설정 후 Apply

    만일 저기서 컴파일 버전을 1.6으로 변경하면 아래처럼 1.6 버전으로 컴파일 된 클래스가 생성된다.


    Tomcat Runtime Environment 버전 변경😘

    위의 경우는 소스코드 컴파일 버전만 변경을 한거고 이클립스에서 에러가 발생 안나도록 하려면 tomcat 런타임환경설정도 변경 해줘야 한다.

    컴파일 버전만 변경한 다음 로컬에서 tomcat 실행 시 아래처럼 여전히 에러가 발생한다.

    원인은 tomcat의 런타임 환경이 1.7로 되어 있어서 1.8로 컴파일 한 class를 tomcat이 읽을 수 없기 때문이다.


    해당 프로젝트의 tomcat 런타임 환경을 바꾸겠다.

    Servers > 해당 프로젝트 서버 클릭 > Runtime Environment 클릭 > JRE 버전 변경 후 Finish

    그 후 다시 tomcat을 재실행해 보면 에러가 발생하지 않는다.


    정리하면 이렇다.

    미리 실서버의 java 클래스 버전을 javap 명령어로 확인 후 그에 맞춰서 컴파일 후 배포

    로컬에서 테스트 시 톰캣 런타임 환경도 맞출 것

    반응형