4

在以前的 Java 版本中,我能够使用具有大量系统捆绑包的片段来为引导类加载器提供类。

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

我创建了一个包含 Jacorb 的所有 jar 的 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 类的创建方式。它现在被硬编码为使用 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<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?

4

3 回答 3

0

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

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

于 2014-05-15T13:23:46.400 回答
0

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

于 2014-05-08T07:38:50.107 回答
0

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

此更改的问题在于,由于 u55 中的更改而被迫使用的 SystemClassLoader 不知道如何加载通过上述属性指定的 ORB 和 ORBSingleton 类,因为它们是应用程序类路径的一部分 - 在我的情况下由 JNLPClassloader 加载。

我想你的情况也有类似的情况。

替换您已经使用的 orb.omg.CORBA 的 JDK 版本的一种方法是指定 -Djava.endorsed.dirs=${jacorb/lib/}. 这将 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 应用程序问题没有帮助。

于 2014-05-05T20:48:46.790 回答