Java 7u55 Eclipse系统片段类加载器

在以前的Java版本中,我能够使用具有系统包主机的片段,以便为引导类加载器提供类。

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

我创建了一个osgi片段,其中包含Jacorb的所有jar子。 清单看起来像这样:

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类的创建方式。 现在硬编码使用SystemClassLoader,而不是使用Thread上下文类加载器。

 - 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 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?

我有同样的问题(我看到很多其他人也有这个问题)但是使用基于CORBA的Webstart应用程序。

这种变化的问题是由于u55的变化而被迫使用的SystemClassLoader不知道如何加载通过上述属性指定的ORB和ORBSingleton类,因为它们是应用程序类路径的一部分 – 在我的例子中由JNLPClassloader加载。

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

通过指定-Djava.endorsed.dirs=${jacorb/lib/}替换已经使用的orb.omg.CORBA的JDK版本的一种方法。 这将JDK的org.omg.CORBA包版本替换为JacORB提供的版本,它使用当前Thread的ContextClassLoader(与u55前代码相同)。

另一种选择是使用例如-Xbootclasspath/p:${jacorb/lib/jar-containing-omg-api.jar}或将包含JacORB版本的org.omg.CORBA的JAR复制到/lib/endorsed

不幸的是,这对我的Webstart应用程序问题没有帮助。

您是否需要系统范围/单一ORB作为Jacorb ORB? 如果没有,那么这里最简单的解决方案可能是从命令行中删除-Dorg.omg.CORBA.ORBSingletonClass。 请记住,单例ORB只是TypeCode工厂,对2-arg ORG.init的调用仍将提供Jacorb ORB,因为您已将org.omg.CORBA.ORBClass设置为选择它。

user3054250提到的(最近更新的,因为此信息不在之前)发布说明(感谢您)指向另一种可能的解决方法。 仅指定ORB属性但省略ORBSingleton在我的CORBA / Webstart应用程序中与JacORB 3.4一起工作(简短测试)。

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