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

时间:2014-04-22 16:28:13

标签: java eclipse classloader jacorb eclipse-fragment

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

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

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

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?

3 个答案:

答案 0 :(得分:0)

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

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

我猜你的情况会有类似的问题。

通过指定-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复制到<jre-home>/lib/endorsed

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

它不适用于OpenORB(因为OpenORB会检查&#34;右键&#34; ORBSingleton的实例)所以我必须将我的应用程序升级到JacORB,但这是一个解决方案。