Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@ihoneymon
Created April 22, 2015 03:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ihoneymon/b5c7330d7f7a99e0e3b2 to your computer and use it in GitHub Desktop.
Save ihoneymon/b5c7330d7f7a99e0e3b2 to your computer and use it in GitHub Desktop.

Oracle JDK에서 잘 동작하던 녀석이 IBM SDK에서 동작하지 않을 때

일반적인 자바개발환경에서는 Oracle JDK를 사용한다. 그래서 무심코 com.sun 계열의 클래스들을 사용하게 된다. 어느 운영체제에서나 실행된다고 이야기하던 솔루션이 문제를 일으키는 상황이 발생했다.

○ 문제발생

Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.util.Map org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration.healthIndicators; nested exception is java.lang.NoClassDefFoundError: com.sun.management.OperatingSystemMXBean; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.util.Map org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration.healthIndicators; nested exception is java.lang.NoClassDefFoundError: com.sun.management.OperatingSystemMXBean

위와 같이 com.sun.management.OperatingSystemMXBean 클래스를 찾을 수 없다는 오류가 발생한다. 그런데 이게 당연한 것이 IBM AIX 에 설치되는 IBM SDK에 com.sun.management.OperatingSystemMXBean가 있을리가 전무하다.

○ 원인

이 문제가 발생한 코드는

import com.sun.management.OperatingSystemMXBean;
...
OperatingSystemMXBean osbean = (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();

였다. 굳이 캐스팅하지 않아도 되는 OperatingSystemMXBean 인터페이스를 com.sun.management.OperatingSystemMXBean으로 캐스팅하는 코드에서 문제가 생길 수 밖에 없었던 것이다.

○ 해결

http://stackoverflow.com/questions/14161944/why-does-this-code-compile-but-with-runtime-classnotfoundexception

java.lang.management.OperatingSystemMXBean의 구현체가 IBM SDK, Oracle JDK에 별도로 존재한다.

  • com.sun.management.OperatingSystemMXBean
  • com.ibm.management.OperatingSystemMXBean

OperatingSystemMXBean osbean = ManagementFactory.getOperatingSystemMXBean(); 형태로 정의하면 ManagementFactory에 의해서 운영체제 환경에 맞는 OperatingSystemMXBean를 반환한다.

http://docs.oracle.com/javase/7/docs/api/java/lang/management/OperatingSystemMXBean.html

이 문서에

It can be obtained by calling the PlatformManagedObject.getObjectName() method.

This interface defines several convenient methods for accessing system properties about the operating system on which the Java virtual machine is running.

항목을 보고 이해했다.

○ 정리

  • Java 개발시 멀티플랫폼을 고려한다면, JVM(Oracle or IBM)에 의존적인 클래스를 사용하지 말고 인터페이스를 찾아보자.
  • 문제가 있을 떄는 레퍼런스 문서를 찾아보자.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment