由于更新到Java 7更新55,我无法运行我的WebStart Java应用程序。
当通过WebStart启动时,该应用程序在Java 7更新51下运行良好。
当在WebStart之外启动时,它也可以与更新55配合使用。
对进一步的调查要点有什么建议吗?
org.omg.CORBA.INITIALIZE: can't instantiate default ORB implementation org.jacorb.orb.ORBSingleton vmcid: 0x0 minor code: 0 completed: No
at org.omg.CORBA.ORB.create_impl_with_systemclassloader(Unknown Source)
at org.omg.CORBA.ORB.init(Unknown Source)
at org.jacorb.orb.CDRInputStream.<init>(CDRInputStream.java:186)
at org.jacorb.orb.etf.ProfileBase.initFromProfileData(ProfileBase.java:252)
at org.jacorb.orb.etf.ProfileBase.demarshal(ProfileBase.java:172)
at org.jacorb.orb.etf.FactoriesBase.demarshal_profile(FactoriesBase.java:124)
at org.jacorb.orb.ParsedIOR.decode(ParsedIOR.java:235)
at org.jacorb.orb.ParsedIOR.parse_stringified_ior(ParsedIOR.java:460)
at org.jacorb.orb.ParsedIOR.parse(ParsedIOR.java:375)
at org.jacorb.orb.ParsedIOR.<init>(ParsedIOR.java:192)
at org.jacorb.orb.ORB.string_to_object(ORB.java:1824)
Caused by: java.lang.ClassNotFoundException: org.jacorb.orb.ORBSingleton
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
... 56 more
编辑2014年6月12日
看起来这个问题已经在这里得到了解决:
https://bugs.openjdk.java.net/browse/JDK-8042789
这将有望在7月15日的中包含在下一个CPU中
导致此问题的更改似乎已恢复,因此它现在再次使用当前线程类加载器。
http://hg.openjdk.java.net/jdk8u/jdk8u-dev/corba/rev/009fc3f785a9
我为此向Java打开了一个bug(审查ID:JI-9011898)。问题是,在org.omg.CORBA.ORB.init()方法中,系统类加载器被强制使用,而在过去,则使用当前线程的类加载器。
UPDATE:一个有效的解决方法是将JacORB jar复制到/jre/lib/approved文件夹中,这样这些类就可以在webstart类加载器之外加载。有关详细信息,请参阅Java WebStart和认可的目录以及Java 7u55 Eclipse System Fragment Classloader。
做了更多的挖掘,我发现了导致问题的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 Singleton类的创建方式。现在不再使用线程上下文类加载器,而是硬编码为使用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;
+ }
+ }
将JacORB类放在认可的dirs或ext类路径上是一种有效的解决方法。然而,这肯定会改变以前的行为。
有人为此提交了bug吗?
---更新---
存在与此问题相关的错误:https://bugs.openjdk.java.net/browse/JDK-8042789
它有Java 8u22版本。
https://jdk8.java.net/download.html
现在有一个关于7u55中此更改的发布说明,请参阅:
http://www.oracle.com/technetwork/java/javase/7u55-relnotes-2177812.html
你能多谈谈OpenORB的问题吗?是ClassCastException还是其他错误?堆栈跟踪会很有用。
相关的JacORB问题是http://www.jacorb.org/bugzilla/show_bug.cgi?id=984(用于x-ref目的)。
如果有人有一个样本测试用例,他们不会介意上传到该票证,这将非常有帮助
user3054250提到的发布说明(最近更新了,因为以前没有这些信息)(感谢您)指出了另一种可能的解决方法。
仅指定org.omg.CORBA.ORBClass
属性,但省略org.omg.CORBA.ORBSingletonClass
与JacORB 3.4一起在我的CORBA/Webstart应用程序中工作。
它不适用于OpenORB(因为OpenORB检查ORBSingleton的"正确"实例),所以我必须将我的应用程序升级到JacORB。
编辑:对于OpenORB(我想对于许多其他ORB也是如此),存在着与提问者提到的相同的问题——ClassCastException,因为ORB类在Webstart应用程序中的SystemClassLoader中不可见,但ORBSingleton现在使用SystemClassLoaders加载。
与JacORB的区别在于,当ORB被实例化时,OpenORB会检查ORBSingleton的类型是否正确——这意味着(取决于版本),例如,它的类型是否为org.OpenORB.CORBA.ORBSingleton。对我来说,切换到JacORB是没有问题的,但我想提到的是,省略ORBSingleton设置的方法对任何ORB都没有帮助,但对于提问者来说,这可能是一个比将ORB内容放入/背书
迁移到openjdk对我来说很有效。我必须找到一个合适的解决方案,但这是我的工作,直到我可以重做我的代码。
此问题的修复包含在java7更新65中。它现在和以前一样工作。