2013-01-04 2 views
1

나는 독점적 인 sun. *. OperatingSystemMXBean을 사용하는 코드를 가지고 있으므로 조심하고있다. 그러나 이 코드는 왜 컴파일되지만 런타임은 ClassNotFoundException입니까?

try { 
    _osBean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 
} 
catch (ClassCastException e) { 
    _osBean = null; 
} 

,이 코드는 IBM JVM에서 실행하는 대신 ClassCastException, 나는 런타임 ClassNotFoundException를 얻을. 왜이 코드는 그 클래스가 사용 가능하지 않고 JVM이 이런 식으로 어떻게 영향을 주는지 잘 컴파일 할 수 있습니까?

+0

오라클 컴파일러로 컴파일하고 IBM JVM에서 실행할 경우 발생할 수 있습니다. – assylias

+1

** ** 모든 com.sun. * 클래스는 사용하지 마십시오. – fge

+1

@fge - 강력한 단어. 차라리 조심스럽게 전개 환경을 이해하고 가능할 때마다 정상적으로 후퇴해야한다고 말하고 싶습니다. –

답변

3

com.sun. * 패키지는 sun JVM (핫스팟) 용으로 작성된 개인 클래스이며 공개 코드가 아닙니다 (코드에 액세스 할 수 있음을 증명하더라도). IBM JVM은 전혀 다른 구현이며 java/jvm 사양의 일부가 아니므로 IBM JVM과 완전히 다릅니다. 개봉 된 문제를 시도하고 해결하기 위해 일/오라클 JDK
로 컴파일 이후 추측
메신저 잘 컴파일 (공공 API 인) 대신

java.lang.management.OperatingSystemMXBean 

에 캐스팅 시도하고 당신을 위해 작동하는지 확인

+0

java.lang 변형은 잘 동작한다. 내가 얻는 것은 Java가 컴파일 된 jar의 모든 클래스를 포함하지 않고 JVM에 동적으로로드되도록 남겨 두었다는 것입니다. 나는 실제로 이런 생각을 한 적이 없다. 이것은 C와 같은 언어가 표준 라이브러리를위한 기계 코드를 생성 할 것이기 때문에 이상하게 보입니다. – mvd

+0

이 맞습니다. 음, 컴파일 된 jar에있는 모든 컴파일 된 클래스가 포함되어 있습니다. 다시 컴파일 할 라이브러리의 클래스는 아닙니다 (클래스 경로는 @compile 시간이고 대부분 jvm lib 디렉토리 내의 rt.jar라는 항아리에 있습니다. JDK 클래스의 경우). 또한, 참조되지 않는 한 클래스의 바이트 코드를 _로드하지 않습니다. 따라서 컴파일 된 클래스를 사용하지 않는 컴파일 된 클래스를 포함하면로드되지 않습니다. – radai

1

당신은과

com.sun.management.OperatingSystemMXBean 

을 컴파일하는 일 javac의를 사용하고 있지만 IBM 자바는 실행 할 수 있습니다. IBM 환경은 Sun과 관련이 없습니다. com.sun. * 클래스는 독점적이므로주의해서 사용해야합니다.

제쳐두고 타사 jar에 대해 컴파일 만하면이 오류가 발생할 수 있지만 함께 병합하지는 마십시오. 예 : 아파치 항아리 또는 이와 유사한 것. 특히 독점적 인 항아리와 관련한 오류가 아니라 배포 문제 전반에 관한 내용입니다.

0

아마도 을 포함하는 Sun JDK에 대해을 컴파일하면 이됩니다. 이것은 표준 JDK의 일부가 아니기 때문에 사용하지 않아야합니다. 다른 Java 시스템에있을 수있는 것은 아니며 이 아니며 사용중인 IBM JVM에이 있어야합니다.

실행 시간에 존재하지 않는 다른 라이브러리에 대해 컴파일하는 것과 동일합니다.

은 참조 :

0

당신은 일이 컴파일러와 JDK를 (클래스를 가지고있는)를 제공하여,하지만하지 않는 IBM JVM에서 실행하고 있습니다. 일반적으로, com.sun. *으로 시작하는 경우는 Sun 고유의 것으로, 실행하는 JVM를 보증 할 수없는 경우는 신뢰할 수 없습니다.

0

응용 프로그램 서버 작업이이 오류의 원인 일 수 있습니다. 예를 들어 wildfly10 AP에서 com.sun.management와 같은 시스템 클래스는 자동으로로드 될 수 없으므로 AP를로드하기 위해 정의해야합니다. 정의는 \ 모듈 \ 시스템 \ 레이어를 통해 수행 할 수 있습니다 \ 기본 \ 태양 \ 클래스를로드 할 수 언급 파일 wildfly10에 정의 위의 추가 및 COM의 방법을 사용할 수 있습니다하여 JDK \ 주 \을 Module.xml

<dependencies> 
    <module name="sun.scripting" export="true"/> 
    <system export="true"> 
     <paths> 
     <path name="com/sun/management"/> 
     </path> 
     <exports> 
      <include-set> 
       <path name="META-INF/services"/> 
      </include-set> 
     </exports> 
    </system> 
</dependencies> 

. 런타임에 sun.management.OperatingSystemMXBean.

관련 문제