Обновление Oracle JDK 5 (1.7.0_05) не работает на SUSE Linux Enterprise Server 11. Исключение EOFException при подключении к Javaspace Blackboard (JINI)

#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. Примеры:

Дополнительные примеры можно найти, выполнив поиск по «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 .Уровень проблема устраняется.

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