Vintage appMaker의 Tech Blog

[gradle] java 버전에러 - if 문 처리 (e: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException) 본문

Source code or Tip/Android(Java, Kotlin)

[gradle] java 버전에러 - if 문 처리 (e: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException)

VintageappMaker 2021. 6. 17. 07:45

몇년전 문제없이 돌아가던 프로젝트 소스가 최신 Android Studio에서 에러가 발생했다. 

e: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

자바버전 에러이다. 자바의 버전이 업그레이드 되면서 이전의 종속성 몇 개가 삭제되었는데, gradle에서 수동으로 추가해주어야 한다. 문제는 어떤 개발환경에서는 java 1.8 환경으로 되어 있기에 java 1.8이상을 사용하는 PC 처럼 종속성을 지정하기에 껄끄러운 경우가 발생한다는 것이다. 그럴경우, 

 

java version을 참고하여 선택적 implementation할 수 있다. 

 

Gralde은 Groovy 문법을 사용하기에 다음과 같은 코드로 선택적 종속성 처리가 가능하다. 

    // jdk 1.8이상이면 아래 모듈들이 삭제되었기에
    // 다시 가져와야 한다.
    if(JavaVersion.current() != JavaVersion.VERSION_1_8){
        kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
        kapt "javax.xml.bind:jaxb-api:2.3.1"
        kapt "com.sun.xml.bind:jaxb-impl:2.3.2"
        annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
        annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
    }

위와 같이하면 자바버전에 따라 문제없이 처리가능하다. 

 


그러나 진짜 문제는 Gradle에서 저런 식의 조건문이 보였다는 것이다. 경험상 개발환경의 변수가 존재한다는 것 자체가 어떤 식으로든지 나중에는 문제가 발생할 여지가 높기 때문이다. 

Comments