Java 7u55 Eclipse系统片段类加载器 [英] Java 7u55 Eclipse System Fragment Classloader

查看:170
本文介绍了Java 7u55 Eclipse系统片段类加载器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



在我以前的Java版本中,我能够使用一个具有大量系统包的片段来为引导类加载器提供类。特别的情况是支持在Eclipse中使用Jacorb。这一切都在Java 7u55之前工作正常。



我创建了一个包含Jacorb所有jar的osgi片段。清单如下所示:

  Manifest-Version:1.0 
Bundle-ManifestVersion:2
Bundle-名称: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中运行相同的应用程序时,我得到以下内容:

 code>引起的:java.lang.ClassNotFoundException:org.jacorb.orb.ORBSingleton 
在java.net.URLClassLoader $ 1.run(URLClassLoader.java:366)
在java.net。 URLClassLoader $ 1.run(URLClassLoader.java:355)
在java.security.AccessController.doPrivileged(本机方法)
在java.net.URLClassLoader.findClass(URLClassLoader.java:354)
a t java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)
在java.lang.ClassLoader.loadClass(ClassLoader .java:358)
在java.lang.Class.forName0(本机方法)
在java.lang.Class.forName(Class.java:270)
在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 
标签:jdk7u55- b05
用户:msheppar
日期:Tue Jan 21 12:46:58 2014 +0000
摘要:8025005:增强CORBA初始化

此提交更改了ORB类的创建方式。而不是使用Thread上下文类加载器,现在使用SystemClassLoader进行硬编码。

   -  singleton = create_impl(className); 
+ singleton = create_impl_with_systemclassloader(className);
}
}
return singleton;
}

+私有静态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(
+不能实例化默认ORB实现+ className);
+ systemException.initCause(ex);
+ throw systemException;
+}
+}

我试图登录机票关于这个问题。同时,有没有办法通过某种片段覆盖JVM附带的ORB.java?

解决方案

(最近更新,因为这里的信息以前没有)发布user3054250提到的注释(谢谢你)指出另一个可能的解决方法。
仅指定ORB属性,但省略ORBSingleton在我的CORBA / Webstart应用程序中与JacorB 3.4一起工作(简短测试)。



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


In previous versions of Java I was able to use a fragment that had a host of system-bundle in order to provide classes to the boot classloader.

In my particular case this was to support using Jacorb in Eclipse. This all worked fine prior to Java 7u55.

I created an osgi fragment that contained all the jars for Jacorb. The manifest looks like this:

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", ....

I also specify the following as 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

When I ran my Eclipse application in Java 7u51 I am able to call ORB.init() successfully.

When I run the same application in Java 7u55 I get the following:

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)

If I add the following as vmargs it works.

 -Djava.endorsed.dirs=${jacorb/lib}

I confirmed that this effects Java 7u55 Java 6u30 and Java 8u5

I didn't need to do this before. Any ideas why?

--- EDIT 04/30 ---

Did some more digging and I found a commit to ORB.java that is causing the issue.

changeset:   817:a8d27c3fc4e4
tag:         jdk7u55-b05
user:        msheppar
date:        Tue Jan 21 12:46:58 2014 +0000
summary:     8025005: Enhance CORBA initializations

This commit changed the way the ORB class was created. Instead of using the Thread context class loader it is now hard coded to use the 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;
+        }
+    }

I've tried to log a ticket to Orcale about this problem. In the mean time, is there a way to override the ORB.java that comes with the JVM via some sort of fragment?

解决方案

The (recently updated, as this information wasn' there before) release notes mentioned by user3054250 (thank you for this) point to another possible workaround. Specifying only the ORB property but omiting ORBSingleton works (short test) in my CORBA/Webstart application together with JacORB 3.4.

It doesn't work with OpenORB (as OpenORB checks for the "right" instance of ORBSingleton) so I have to upgrade my application to JacORB but it is a solution.

这篇关于Java 7u55 Eclipse系统片段类加载器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆