2014-04-22 26 views
4

在以前的Java版本中,我能够使用一个有大量系统包的片段来为启动类加载器提供类。Java 7u55 Eclipse系统片段类加载器

在我的特殊情况下,这是为了支持在Eclipse中使用Jacorb。在Java 7u55之前,这一切都运行良好。

我创建了一个包含Jacorb所有罐子的osgi片段。清单如下:

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", .... 

我还指定以下VM ARGS:

-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 

当我跑的Java 7u51我的Eclipse应用程序,我能()成功调用在ORB.init。

当我运行在Java中7u55相同的应用程序,我得到以下几点:

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它的工作原理。

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

我确认这影响的Java 7u55的Java 6u30和Java 8u5

我并不需要之前做到这一点。任何想法为什么?

---编辑--- 04/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加载。

我想你的情况有一个类似的constalation。

通过指定-Djava.endorsed.dirs=${jacorb/lib/}来替换已使用的ork.omg.CORBA的JDK版本的一种方法。这代替了JDK的org.omg.CORBA包版本,它使用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的调用仍会给出一个Jacorb ORB,因为您已将org.omg.CORBA.ORBClass设置为选中它。

+0

现在有关于此的7u55发行说明中有一个注释: http://www.oracle.com /technetwork/java/javase/7u55-relnotes-2177812.html – user3054250

0

user3054250(谢谢你)提到的(最近更新,因为这些信息之前没有)发布的注释指向另一个可能的解决方法。 仅在CORBA/Webstart应用程序中与JacORB 3.4一起指定ORB属性,但省略了ORBSingleton作品(简短测试)。

它不适用于OpenORB(因为OpenORB检查ORBSingleton的“正确”实例),所以我必须将我的应用程序升级到JacORB,但它是一个解决方案。