Загрузчик классов фрагментов системы Java 7u55 Eclipse

В предыдущих версиях Java я мог использовать фрагмент с множеством системных пакетов, чтобы предоставлять классы загрузчику классов загрузки.

В моем конкретном случае это было для поддержки использования Jacorb в Eclipse. Все это прекрасно работало до Java 7u55.

Я создал фрагмент osgi, содержащий все jar-файлы для 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

Когда я запустил приложение Eclipse на Java 7u51, я смог успешно вызвать 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.

Мне не нужно было делать это раньше. Есть идеи, почему?

--- РЕДАКТИРОВАТЬ 30.04 ---

Покопался еще немного и нашел фиксацию в 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. Вместо использования загрузчика классов контекста Thread теперь жестко закодировано использование 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;
+        }
+    }

Я попытался зарегистрировать билет в Orcale по поводу этой проблемы. Между тем, есть ли способ переопределить ORB.java, который поставляется с JVM, через какой-то фрагмент?


person Erik Englund    schedule 22.04.2014    source источник
comment
Постарайтесь уточнить цель вашего вопроса, вы не донесли свою точку зрения.   -  person Victor R. Oliveira    schedule 22.04.2014
comment
Обновлено, надеюсь, будет более понятно.   -  person Erik Englund    schedule 23.04.2014
comment
См. также этот вопрос о переполнении стека Ошибка 55 jacorb при запуске через webstart">stackoverflow.com/questions/23217131/   -  person Nick Cross    schedule 12.05.2014
comment
Есть запись об ошибке для Java bugs.java.com/bugdatabase/view_bug.do?bug_id=8042462.   -  person lothar    schedule 20.05.2014
comment
См. также stackoverflow.com/questions/23217131/   -  person Nick Cross    schedule 06.06.2014


Ответы (3)


У меня та же проблема (и я видел ее и у многих других), но с приложением Webstart на основе CORBA.

Проблема этого изменения заключается в том, что SystemClassLoader, который вынужден использоваться из-за изменения в u55, не знает, как загружать классы ORB и ORBSingleton, указанные через упомянутые свойства, поскольку они являются частью пути к классам приложения - в моем случае загружается JNLPClassloader.

Я думаю, что в вашем случае есть аналогичная консталация.

Один из способов заменить JDK-версию orb.omg.CORBA, которую вы уже использовали, указав -Djava.endorsed.dirs=${jacorb/lib/}. Это заменяет версию пакета JDK org.omg.CORBA на версию, предоставленную JacORB, которая вместо этого использует ContextClassLoader текущего потока (так же, как это делал код до u55).

Другой вариант - использовать, например. -Xbootclasspath/p:${jacorb/lib/jar-containing-omg-api.jar} или скопируйте JAR-файлы, содержащие версию JacORB org.omg.CORBA, в <jre-home>/lib/endorsed.

К сожалению, это не помогло моей проблеме с приложением Webstart.

person irrenderreiter    schedule 05.05.2014
comment
Кто-нибудь понимает, почему это было изменено? Кажется, это влияет только на ORB Singleton. Я искал ошибку безопасности 8025005, но нигде не смог найти настоящую ошибку. - person Erik Englund; 06.05.2014
comment
Есть запись об ошибке для Java bugs.java.com/bugdatabase/view_bug.do? bug_id=8042462 - person lothar; 20.05.2014

Нужен ли вам общесистемный/одиночный ORB, чтобы стать Jacorb ORB? Если нет, то самым простым решением может быть просто удаление -Dorg.omg.CORBA.ORBSingletonClass из командной строки. Помните, что singleton ORB — это просто фабрика TypeCode, ваш вызов 2-arg ORG.init все равно даст Jacorb ORB, потому что у вас есть org.omg.CORBA.ORBClass, установленный для его выбора.

person user3054250    schedule 08.05.2014
comment
Теперь в примечаниях к выпуску 7u55 для этого есть примечание: oracle .com/technetwork/java/javase/7u55-relnotes-2177812.html - person user3054250; 15.05.2014

Примечания к выпуску (недавно обновленные, поскольку этой информации не было раньше) упомянутые пользователем 3054250 (спасибо за это), указывают на другой возможный обходной путь. Указание только свойства ORB, но пропуск ORBSingleton работает (краткий тест) в моем приложении CORBA/Webstart вместе с JacORB 3.4.

Это не работает с OpenORB (поскольку OpenORB проверяет «правильный» экземпляр ORBSingleton), поэтому мне нужно обновить свое приложение до JacORB, но это решение.

person irrenderreiter    schedule 15.05.2014