본문 바로가기
우당탕탕 개발생활/_Jenkins

[Jenkins] Build 오류 원인 분석 및 해결 방법

by J-2n 2023. 6. 16.

안녕하세요

Jenkins와 Gitlab의 Hook 까지 잘 걸리는걸 확인했지만 Jenkins내에서 빌드 오류가 발생되는 상황이 있었습니다.

발생했던 오류들을 알아보고 해결까지 방법을 공유드리겠습니다.


# Jenkins 빌드 오류 확인  방법

빌드가 진행되었다면 아래와 같이 로그가 남게 되는데요. 날짜 클릭 > Console Output 클릭 시 빌드하며 발생되는 로그들을 확인할 수 있습니다.


# Unsupported major.minor version 52.0

$ java -cp /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-agent-1.14.jar:/var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven_3/apache-maven-3.0/boot/plexus-classworlds-2.2.3.jar org.jvnet.hudson.maven3.agent.Maven3Main /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven_3/apache-maven-3.0 /var/cache/jenkins/war/WEB-INF/lib/remoting-4.13.2.jar /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-1.14.jar /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.14.jar 39189 Exception in thread "main" java.lang.UnsupportedClassVersionError: org/jvnet/hudson/maven3/agent/Maven3Main : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

"Unsupported major.minor version 52.0" 오류는 주로 Java 버전 호환성 문제로 발생한다. 이 오류는 현재 Java 버전이 실행하려는 클래스의 버전과 호환되지 않을 때 발생하는 것이다..

일반적으로 다음과 같은 상황에서 발생하고, 해결하기 위해서는 Java 버전을 확인하고 호환되는 버전을 사용해야 한다. 
1. 실행하려는 클래스가 더 높은 Java 버전으로 컴파일되었는데, 현재 시스템에 설치된 Java 버전이 낮은 경우.
2. 실행하려는 클래스가 낮은 Java 버전으로 컴파일되었는데, 현재 시스템에 설치된 Java 버전이 높은 경우.

해결하는 다양한 방법


1. Java 버전 확인: 실행하려는 클래스가 컴파일된 Java 버전과 현재 시스템에 설치된 Java 버전을 확인한다. Java 버전은 java -version 명령어로 확인할 수 있다. 컴파일된 클래스의 버전이 어떤 버전인지 확인하여 호환되는 Java 버전을 설치해야 한다.

2. Java 버전 업그레이드: 현재 시스템에 설치된 Java 버전이 낮은 경우, 더 높은 Java 버전으로 업그레이드해야 한다. Java 버전 업그레이드는 Java 개발 환경(Java Development Kit, JDK)을 설치하고 PATH 환경 변수를 설정하여 수행할 수 있다.

3. 컴파일 옵션 변경: 실행하려는 클래스를 컴파일할 때 호환되는 Java 버전을 명시적으로 지정하는 것도 가능하다. Maven 프로젝트의 경우 pom.xml 파일에 maven-compiler-plugin 플러그인을 사용하여 컴파일 옵션을 설정할 수 있다.

4. 빌드 도구 버전 확인: 사용하는 빌드 도구(Maven, Gradle 등)의 버전도 호환되는 Java 버전을 지원하는지 확인해야 한다. 빌드 도구의 설정 파일을 확인하여 지정된 Java 버전을 확인하고 필요한 경우 업그레이드 또는 설정 변경을 수행한다.

내가 해결한 방법

Jenkins 접속 > 해당 item 클릭 > 구성 진입

JDK 설정 칸에서 해당하는 java 버전으로 설정한다.


# java.lang.NoSuchMethodError: org.apache.maven.project.MavenProject.getProjectBuildingRequest()

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. [INFO] Replacing main artifact with repackaged archive java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239) at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:184) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at hudson.maven.Maven3Builder.call(Maven3Builder.java:139) at hudson.maven.Maven3Builder.call(Maven3Builder.java:70) at hudson.remoting.UserRequest.perform(UserRequest.java:211) at hudson.remoting.UserRequest.perform(UserRequest.java:54) at hudson.remoting.Request$2.run(Request.java:376) at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:78) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NoSuchMethodError: org.apache.maven.project.MavenProject.getProjectBuildingRequest()Lorg/apache/maven/project/ProjectBuildingRequest; at hudson.maven.reporters.MavenFingerprinter.getLocalRepository(MavenFingerprinter.java:136) at hudson.maven.reporters.MavenFingerprinter.recordParents(MavenFingerprinter.java:116) at hudson.maven.reporters.MavenFingerprinter.postBuild(MavenFingerprinter.java:108) at hudson.maven.Maven3Builder$MavenExecutionListener.recordProjectEnded(Maven3Builder.java:547) at hudson.maven.Maven3Builder$MavenExecutionListener.projectSucceeded(Maven3Builder.java:525) at org.apache.maven.lifecycle.internal.DefaultExecutionEventCatapult.fire(DefaultExecutionEventCatapult.java:68) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:91) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:314) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:151) at org.jvnet.hudson.maven3.launcher.Maven3Launcher.main(Maven3Launcher.java:80) ... 21 more ERROR: Failed to parse POMs java.io.IOException: java.lang.reflect.InvocationTargetException at hudson.maven.Maven3Builder.call(Maven3Builder.java:177) at hudson.maven.Maven3Builder.call(Maven3Builder.java:70) at hudson.remoting.UserRequest.perform(UserRequest.java:211) at hudson.remoting.UserRequest.perform(UserRequest.java:54) at hudson.remoting.Request$2.run(Request.java:376) at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:78) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Suppressed: hudson.remoting.Channel$CallSiteStackTrace: Remote call to Channel to Maven [/usr/local/jdk1.8.0_191//bin/java, -cp, /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-agent-1.14.jar:/var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven_3/apache-maven-3.0/boot/plexus-classworlds-2.2.3.jar, org.jvnet.hudson.maven3.agent.Maven3Main, /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven_3/apache-maven-3.0, /var/cache/jenkins/war/WEB-INF/lib/remoting-4.13.2.jar, /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-1.14.jar, /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.14.jar, 48160] at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1784) at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356) at hudson.remoting.Channel.call(Channel.java:1000) at hudson.maven.ProcessCache$MavenProcess.call(ProcessCache.java:161) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:877) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:524) at hudson.model.Run.execute(Run.java:1897) at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543) at hudson.model.ResourceController.execute(ResourceController.java:101) at hudson.model.Executor.run(Executor.java:442) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at hudson.maven.Maven3Builder.call(Maven3Builder.java:139) ... 9 more Caused by: java.lang.Exception: java.lang.reflect.InvocationTargetException at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:187) ... 14 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239) at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:184) ... 14 more Caused by: java.lang.NoSuchMethodError: org.apache.maven.project.MavenProject.getProjectBuildingRequest()Lorg/apache/maven/project/ProjectBuildingRequest; at hudson.maven.reporters.MavenFingerprinter.getLocalRepository(MavenFingerprinter.java:136) at hudson.maven.reporters.MavenFingerprinter.recordParents(MavenFingerprinter.java:116) at hudson.maven.reporters.MavenFingerprinter.postBuild(MavenFingerprinter.java:108) at hudson.maven.Maven3Builder$MavenExecutionListener.recordProjectEnded(Maven3Builder.java:547) at hudson.maven.Maven3Builder$MavenExecutionListener.projectSucceeded(Maven3Builder.java:525) at org.apache.maven.lifecycle.internal.DefaultExecutionEventCatapult.fire(DefaultExecutionEventCatapult.java:68) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:91) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:314) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:151) at org.jvnet.hudson.maven3.launcher.Maven3Launcher.main(Maven3Launcher.java:80) ... 21 more channel stopped

해당 오류가 발생했을 때는 원인 파악이 가장 힘들었다.  SLF4J오류인줄 알고 버전 확인과 많은 삽질을 했지만, 결론적으로는 메이븐 버전 오류였다. 

Java.lang.NoSuchMethodError는 메소드를 찾을 수 없는 경우에 발생하는 예외이다. 오류 메시지에 표시된 메서드 getProjectBuildingRequest()를 찾을 수 없다는 의미이다.

이 오류는 주로 라이브러리 또는 의존성 관련 문제에서 발생할 수 있다. 메소드가 필요한 라이브러리 버전과 호환되지 않는 경우에 발생할 수 있다.

다양한 해결 방법

1. 의존성 버전 확인: Maven 빌드 파일 (pom.xml)을 확인하여 사용 중인 라이브러리 의존성과 버전을 검토한다. 해당 메소드를 포함하는 라이브러리의 버전이 올바르게 지정되어 있는지 확인한다.

2. 의존성 갱신: 필요한 메소드가 포함된 라이브러리의 최신 버전을 사용한다. Maven 빌드 파일에서 해당 의존성의 버전을 업데이트하고 빌드를 다시 시도. 필요한 메소드가 포함된 적절한 버전의 라이브러리가 제공되는지 확인한다.

3. Maven 캐시 삭제: Maven은 종종 의존성을 캐시에 저장하여 재사용한다. 때때로 캐시된 의존성이 오래된 버전이라서 오류가 발생할 수 있다. Maven 캐시를 삭제하고 다시 빌드해본다. .m2 디렉토리에서 repository 폴더를 삭제하거나 mvn dependency:purge-local-repository 명령어를 실행하여 로컬 저장소를 비운다.

4. Maven 설정 확인: Maven 설정 파일 (settings.xml)을 확인하여 정상적인 Maven 구성을 사용하고 있는지 확인한다. 필요한 저장소 및 미러 설정이 올바르게 구성되어 있는지 확인하고 필요한 라이브러리를 검색할 수 있는지 확인한다.

내가 해결한 방법

Jenkins 접속 > 해당 item 클릭 > Build > Maven Version

기존 설정한 버전이 아닌 좀 더 높은 메이븐 버전으로 시도 한 뒤 해결됐습니다.


공부하기 위한 기록으로 틀린 정보가 있을 시 알려주시면 감사하겠습니다 :)