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

Java 7u55 Eclipse系统片段类加载器,java,eclipse,classloader,jacorb,eclipse-fragment,Java,Eclipse,Classloader,Jacorb,Eclipse Fragment,在以前的Java版本中,我能够使用一个具有大量系统包的片段,以便向引导类加载程序提供类 在我的特殊情况下,这是为了支持在Eclipse中使用Jacorb。在Java7U55之前,这一切都运行良好 我创建了一个osgi片段,其中包含了Jacorb的所有jar。清单如下所示: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: org.jacorb.systemFragment Bundle-SymbolicName: org.j

在以前的Java版本中,我能够使用一个具有大量系统包的片段,以便向引导类加载程序提供类

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

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

-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.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}
我确认这会影响Java7U55、Java6U30和Java8U5

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

---编辑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

-                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;
+        }
+    }
-singleton=create\u impl(类名);
+singleton=使用系统类加载器(类名称)创建系统类;
}
}
返回单身;
}
+私有静态ORB create_impl_with_systemclassloader(字符串类名称){
+
+试一试{
+Reflectil.checkPackageAccess(类名称);
+ClassLoader cl=ClassLoader.getSystemClassLoader();
+类orbBaseClass=org.omg.CORBA.ORB.Class;
+Class singletonOrbClass=Class.forName(className,true,cl).asSubclass(orbBaseClass);
+返回(ORB)singletonOrbClass.newInstance();
+}捕获(可丢弃的ex){
+SystemException SystemException=新建初始化(
+“无法实例化默认ORB实现”+类名);
+系统异常。初始原因(ex);
+抛出系统异常;
+        }
+    }
我试着把这个问题记录下来。同时,有没有办法通过某种片段覆盖JVM附带的ORB.java?

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

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

我想你的情况也有类似的担忧

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

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


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

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

用户3054250(感谢您)提到的(最近更新,因为之前没有此信息)发行说明指向另一种可能的解决方法。 在我的CORBA/Webstart应用程序和JacORB 3.4中,仅指定ORB属性而忽略ORB Singleton是有效的(短期测试)


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

请尽量更具体地说明问题的目的,您还没有阐明您的观点。希望更新后更清楚。另请参见此stackoverflow问题有一个Java bugs.Java.com/bugdatabase/view_bug.do?bug_id=8042462的bug条目。还有人知道为什么会更改此项吗?它似乎只影响球体单体。我查找了安全漏洞8025005,但在任何地方都找不到实际的漏洞。Java有一个漏洞条目。现在7u55发行说明中有一个关于此漏洞的说明: