일반적인 자바개발환경에서는 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
으로 캐스팅하는 코드에서 문제가 생길 수 밖에 없었던 것이다.
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)에 의존적인 클래스를 사용하지 말고 인터페이스를 찾아보자.
- 문제가 있을 떄는 레퍼런스 문서를 찾아보자.