java 7u55_Java 7u55 Eclipse系统片段类加载器

在以前的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 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复制到< jre-home> / lib / endorsed.

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

标签:java,eclipse,classloader,jacorb,eclipse-fragment

来源: https://codeday.me/bug/20191006/1863064.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值