#java #linux #oracle
#java #linux #Oracle
Вопрос:
Мы пытаемся запустить процесс (брокер) с SUSE Linux Enterprise Server 11 (java-1_7_0-ibm), который подключается к доске Javaspace (JINI), развернутой на другой машине Linux. (CentOS с открытой версией JDK «1.7.0_05-icedtea»)
Stack Trace :
INFO: Starting broker
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.J9VMInternals.initialize(J9VMInternals.java:259)
at net.jini.jeri.BasicInvocationHandler.invokeRemoteMethod(BasicInvocationHandler.java:653)
at net.jini.jeri.BasicInvocationHandler.invoke(BasicInvocationHandler.java:528)
at com.sun.jini.reggie.$Proxy0.lookup(Unknown Source)
at com.sun.jini.reggie.RegistrarProxy.lookup(RegistrarProxy.java:128)
at edu.vt.ndssl.blackboard.JiniSpaceService.findSpace(JiniSpaceService.java:372)
at edu.vt.ndssl.blackboard.JiniSpaceService.<init>(JiniSpaceService.java:74)
at edu.vt.ndssl.blackboard.JavaSpaceBlackboard.<init>(JavaSpaceBlackboard.java:31)
at edu.vt.ndssl.blackboard.BlackboardFactory.make(BlackboardFactory.java:28)
at edu.vt.ndssl.broker.Broker.<init>(Broker.java:53)
at edu.vt.ndssl.broker.Broker.main(Broker.java:231)
Caused by: java.lang.RuntimeException: Unexpected exception
at com.sun.jini.logging.Levels.createLevel(Levels.java:142)
at com.sun.jini.logging.Levels.<clinit>(Levels.java:52)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:237)
... 10 more
Caused by: java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2667)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1387)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2059)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1984)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1867)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1419)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:420)
at com.sun.jini.logging.Levels.createLevel(Levels.java:138)
... 13 more
Тот же код отлично работает с Java 1.6 версии до 26.
Я ищу правильную версию Java для установки на SUSE Linux Enterprise Server, которая будет совместима с этой ОС, а также эквивалентна Oracle JDK Update 5 или Open JDK версии 1.7.0_05 (icedtea).
Комментарии:
1. Какие-либо известные ошибки, связанные с этим, исправлены в любом из этих продуктов?
Ответ №1:
По-видимому, основная причина проблемы заключается в том, что Oracle внесла несовместимые изменения в формат сериализации com.sun.jini.logging.Levels
класса. Сообщается, что изменение произошло в Oracle JDK 1.6.0_38 и JDK 1.7.0_13, и, предположительно, оно также попало в последние версии OpenJDK.
Эта проблема проявилась во множестве проектов, использующих JINI. Примеры:
- https://issues.apache.org/jira/browse/RIVER-415 https://issues.apache.org/jira/browse/RIVER-416.
- https://cloudifysource.zendesk.com/entries/23079726-bootstrap-localcloud-not-working-Could-not-initialize-class-com-sun-jini-logging-Levels
Дополнительные примеры можно найти, выполнив поиск по «com.sun.jini.logging.Уровни EOFException «.
Я не могу сказать, какое решение есть / было бы для вас, но у меня есть пара идей:
Предотвращение: я думаю, вы можете избежать проблемы, если не будете смешивать версии JVM до и после изменения в вашей сети приложений.
Если вам необходимо обновить JVM вашего приложения, я предлагаю вам обновить их все, а затем выполнить полное завершение работы / перезапуск ваших приложений и служб JINI.
Исправьте свои приложения: Похоже, что проект Apache River устранил проблему, изменив код JINI. Как указано в билете о проблеме:
Com.sun.jini.logging.Класс Levels создает исключение RuntimeException с последней версией Java (как 1.6, так и 1.7). Проблема связана с созданием пользовательского java.util.logging.Уровень. Текущая реализация использует ClassReplacingObjectOutputStream и подход LevelData . Удалив этот подход и создав подкласс java.util.logging .Уровень проблема устраняется.
В билете о проблеме много обсуждений о наилучшем способе сделать это, предлагаемых исправлениях и ссылках на проверку, где они фактически внедрили исправление.