通过WebStart运行Java 7 update 55 JacORB时出错



由于更新到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中。它现在和以前一样工作。

最新更新