Мы обновляем CXF с версии 2.2.6 до версии 2.7.16. Когда мы начинаем v7.0.0.33 IBM WebSphere Application Server в Linux машине, сообщается об ошибке для jaxws_asm/RetrieveRssFeedResponse:CXF 2.7.16: Имя поля ClassFormatError: JVMCFRE114 недопустимо; jaxws_asm
Caused by: java.lang.ClassFormatError: JVMCFRE114 field name is invalid; class=com/abc/mobile/service/rss/jaxws_asm/RetrieveRssFeedResponse, offset=0
at java.lang.ClassLoader.defineClassImpl(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:287)
at java.lang.ClassLoader.defineClass(ClassLoader.java:224)
at org.apache.cxf.common.util.ASMHelper$TypeHelperClassLoader.defineClass(ASMHelper.java:367)
at org.apache.cxf.common.util.ASMHelper.loadClass(ASMHelper.java:316)
at org.apache.cxf.jaxws.WrapperClassGenerator.createWrapperClass(WrapperClassGenerator.java:229)
Вот наше нынешнее понимание:
- Эта ошибка не происходит в локальной машине Windows WAS7.0.0.11
- Класс jaxws_asm.RetrieveRssFeedResponse не существует во время компиляции. Вместо этого он генерируется CXF во время выполнения.
- Нашего кода приложение имеет пакет Java: COM/а/мобильный/сервис/Новости
класс WrapperClassGenerator в org.apache.cxf/CxF-bundle.jar/2.7.16 присоединяет Java пакет «jaxws_asm» в строке 160 :
Строка упак = новый StringBuilder() присоединять (getPackageName (метод)) добавьте ("jaxws_asm.") .append (анонимный "_an": "").. .ToString();
Наш код приложения com.abc.mobile.service.rss.GlobalProductRssService.java имеет:
@WebMethod (operationName = "retrieveRssFeed")
Класс WrapperClassGenerator в org.apache.cxf/. CXF-bundle.jar/2.7.16 добавляет имя класса «Response» в строке 164:
= новый имя класса StringBuilder() добавление (имя класса) .append ("отклика") .ToString();
Мы попытались добавить asm/asm.jar/3.3.1 в WEB-INF/lib или WAS7.0/java/jre/lib/ext. Это не помогло.
- Мы включили журнал отслеживания загрузки классов, следуя документу IBM MustGather: http://www-01.ibm.com/support/docview.wss?uid=swg21196187.
журнала трассировки показывает, что "JAXWS .RetrieveRssFeedResponse" загружается:
[1/5/16 11:39:04:447 EST] 00000014 CompoundClass > loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse [email protected][PL][war:US-EAR/US.war] Entry
[1/5/16 11:39:04:447 EST] 00000014 CompoundClass > loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse [email protected][app:US-EAR] Entry
[1/5/16 11:39:04:448 EST] 00000014 CompoundClass < loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse failed Exit
[1/5/16 11:39:04:448 EST] 00000014 CompoundClass < loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse failed Exit
я не узнал, почему выше класс загрузки нагрузки журнала трассировки "JAXWS .RetrieveRssFeedResponse". Очень приветствуется, если кто-нибудь может поделиться любой подсказкой о том, как решить этот ClassFormatError.
Возможно, это ошибка JVM, но я подозреваю, что CXF генерирует недопустимое имя поля (например, содержащее '-' из-за некоторого элемента XML). К сожалению, ошибка JVM не включает имя поля, поэтому вы можете попытаться открыть PMR с IBM для этого, но, вероятно, проще изменить класс CXF класса ASMHelper $ TypeHelperClassLoader', чтобы сбросить определяемые байты класса, а затем проверить они сами видят, какие имена полей определяются/указаны. –
Спасибо @Brett Kail. ASMHelper.java строка 367 имеет только имя класса: 'ret = super.defineClass (name.replace ('/', '.'), Bytes, 0, bytes.length);' Я думаю, возможно, я могу изменить WrapperClassGenerator .java для непосредственного использования asm.jar. –
Мое предложение состояло в том, чтобы изменить эту строку кода, чтобы записать эти байты в файл, чтобы вы могли их проверить (например, с помощью javap), чтобы узнать, пытается ли созданный байт класса определить поле с недопустимым именем (например, -'). –