2014-04-22 3 views
4

이전 버전의 Java에서는 부트 클래스 로더에 클래스를 제공하기 위해 시스템 번들 호스트가있는 조각을 사용할 수있었습니다.Java 7u55 Eclipse 시스템 조각 클래스 로더

내 경우에는 Eclipse에서 Jacorb를 사용하는 것을 지원하는 것이 었습니다. 이 모든 것은 Java 7u55 이전에는 문제가 없었습니다.

Jacorb의 모든 항아리가 들어있는 osgi 조각을 만들었습니다. 매니페스트는 다음과 같습니다 : 나는 또한 VM 인수로 다음과 같은 지정

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: org.jacorb.systemFragment 
Bundle-SymbolicName: org.jacorb.systemFragment 
Bundle-Version: 3.3.0.20140422-1108 
Bundle-ClassPath: jars/slf4j-jdk14-1.6.4.jar, 
jars/slf4j-api-1.6.4.jar, 
jars/jacorb-3.3.jar 
Fragment-Host: system.bundle; extension:=framework 
Export-Package: org.jacorb.config;version="3.3.0", .... 

: 나는 자바 7u51 내 이클립스 응용 프로그램을 실행

-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB 
-Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton 
-Dorg.omg.PortableInterceptor.ORBInitializerClass.standard_init=org.jacorb.orb.standardInterceptors.IORInterceptorInitializer 

나는()를 성공적으로 ORB.init가 전화를 할 수 있어요.

Caused by: java.lang.ClassNotFoundException: org.jacorb.orb.ORBSingleton 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
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 java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:270) 
at org.omg.CORBA.ORB.create_impl_with_systemclassloader(ORB.java:306) 

나는 그것이 작동 VMARGS로 다음과 같은 추가하는 경우 : 나는 자바 7u55에서 동일한 응용 프로그램을 실행할 때

나는 다음과 같은 얻을.

-Djava.endorsed.dirs=${jacorb/lib} 

나는이 효과를 자바 7u55 자바 6u30과 자바 8u5

는 내가 전에이 작업을 수행 할 필요가 없습니다 않았다는 것을 확인했다. 어떤 아이디어?

--- 편집 4월 30일은 --- 파고 좀 더나요와 나는이 문제를 일으키는 ORB.java 저지 발견했다.

changeset: 817:a8d27c3fc4e4 
tag:   jdk7u55-b05 
user:  msheppar 
date:  Tue Jan 21 12:46:58 2014 +0000 
summary:  8025005: Enhance CORBA initializations 

이 커밋은 ORB 클래스 작성 방법을 변경했습니다. Thread 컨텍스트 클래스 로더를 사용하는 대신 SystemClassLoader를 사용하도록 하드 코딩되었습니다.

-    singleton = create_impl(className); 
+    singleton = create_impl_with_systemclassloader(className); 
     } 
    } 
    return singleton; 
} 

+ private static ORB create_impl_with_systemclassloader(String className) { 
+ 
+  try { 
+   ReflectUtil.checkPackageAccess(className); 
+   ClassLoader cl = ClassLoader.getSystemClassLoader(); 
+   Class<org.omg.CORBA.ORB> orbBaseClass = org.omg.CORBA.ORB.class; 
+   Class<?> singletonOrbClass = Class.forName(className, true, cl).asSubclass(orbBaseClass); 
+   return (ORB)singletonOrbClass.newInstance(); 
+  } catch (Throwable ex) { 
+   SystemException systemException = new INITIALIZE(
+    "can't instantiate default ORB implementation " + className); 
+   systemException.initCause(ex); 
+   throw systemException; 
+  } 
+ } 

나는이 문제에 대해 Orcale에게 티켓을 기록하려고 시도했습니다. 그 동안 JVM과 함께 제공되는 ORB.java를 무시할 수있는 방법이 있습니까?

+0

질문의 목적에 대해보다 구체적으로 설명하십시오. –

+0

더 명확하게 업데이트되었습니다. –

+0

이 stackoverflow 질문도 참조하십시오 https://stackoverflow.com/questions/23217131/java-7-update-55-jacorb-error-when-running-via-webstart/23238815 –

답변

0

CORBA 기반의 Webstart 응용 프로그램과 동일한 문제점이 있습니다 (그리고 나는 많은 것을 보았습니다).

이 변경의 문제점은 u55의 변경으로 인해 강제로 사용되는 SystemClassLoader가 ORB을로드하는 방법을 알지 못한다는 것입니다. 언급 된 등록 정보를 통해 지정된 ORBSingleton 클래스는 응용 프로그램 클래스 경로의 일부이기 때문에 내 경우에는 JNLPClassloader에 의해로드됩니다.

아마도 귀하의 경우에는 비슷한 수식어가 있습니다.

이미 사용 된 orb.omg.CORBA의 JDK 버전을 -Djava.endorsed.dirs=${jacorb/lib/}으로 바꾸는 한 가지 방법. 이것은 JDK의 org.omg.CORBA 패키지 버전을 JacORB에서 제공하는 패키지 버전으로 대체합니다. JacORB는 현재 스레드의 ContextClassLoader를 대신 사용합니다 (이전 u55 코드와 동일). 또 다른 옵션은 예를 들어. -Xbootclasspath/p:${jacorb/lib/jar-containing-omg-api.jar} 또는 JacORB의 org.omg.CORBA 버전이 들어있는 JAR을 <jre-home>/lib/endorsed으로 복사하십시오.

불편을 끼쳐 드려도 Webstart 응용 프로그램 문제에 도움이되지 않습니다.

+0

이유를 이해하는 사람이 있습니까? 이건 바뀌 었어? ORB Singleton에만 영향을 미치는 것 같습니다. 보안 버그 8025005를 찾았지만 어디에서든지 실제 버그를 찾을 수 없었습니다. –

+0

Java에 대한 버그 항목 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8042462 – lothar

0

시스템 전체/단일 ORB가 Jacorb ORB가 필요합니까? 그렇지 않다면 가장 간단한 해결책은 명령 줄에서 Dorg.omg.CORBA.ORBSingletonClass를 삭제하는 것입니다. 싱글 톤 ORB가 TypeCode 팩토리 일 뿐이므로 2-arg ORG.init에 대한 호출은 org.omg.CORBA.ORBClass를 선택하도록 설정했기 때문에 Jacorb ORB를 제공합니다.

+0

7u55 릴리스 노트에 다음 내용이 있습니다. http://www.oracle.com /technetwork/java/javase/7u55-relnotes-2177812.html – user3054250

0

(최근에이 정보가 없었기 때문에) user3054250 (고맙습니다.)에서 언급 한 릴리스 노트를 다른 가능한 해결 방법을 가리 킵니다. ORB 속성 만 지정하고 ORBSingleton을 생략하면 JacORB 3.4와 함께 CORBA/Webstart 응용 프로그램에서 작동합니다 (간단한 테스트).

OpenORB에서 OpenORB가 ORBSingleton의 "올바른"인스턴스를 검사하지 않으므로 작동하지 않으므로 응용 프로그램을 JacORB로 업그레이드해야하지만 해결 방법입니다.