有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

在以前的Java版本中,我能够使用一个包含大量系统包的片段,以便为引导类加载器提供类

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

我创建了一个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参数:

-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

当我用Java7U51运行Eclipse应用程序时,我能够调用ORB。初始化()成功

当我在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}

我确认这会影响Java7U55、Java6U30和Java8U5

我以前不需要这么做。知道为什么吗

---编辑04/30---

做了更多的挖掘,我发现了一个承诺球。导致问题的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进行硬编码

-                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;
+        }
+    }

我试着把这个问题记录下来。同时,有没有一种方法可以覆盖球体。通过某种片段与JVM一起提供的java


共 (1) 个答案

  1. # 1 楼答案

    您是否需要将系统范围/单例ORB用作Jacorb ORB?如果不是这样的话,最简单的解决方案可能就是直接放下Dorg。天啊。科尔巴。命令行中的ORBSingletonClass。请记住,单例ORB只是类型代码工厂,是您对2-arg组织的调用。init仍然会给出一个Jacorb ORB,因为你有org。天啊。科尔巴。ORBClass设置为选中它