Как исправить java.lang.IncompatibleClassChangeError: Реализация класса с помощью cxf - PullRequest
0 голосов
/ 28 апреля 2019

У нас проблема с выполнением вызова клиента SOAP на tomcat 8 в среде RedHat linux с openjdk версии "1.8.0_201", в то время как этот же вызов прекрасно работает с аналогичной конфигурацией на компьютере с Windows (tomcat 8, Oracle java 8) и AIX (Oracle java 8, tomcat 7).

Вот трассировка стека:

java.lang.IncompatibleClassChangeError: Implementing class
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2401)
        at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:859)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1185)
        at org.apache.cxf.ws.addressing.impl.AddressingFeatureApplier.initializeProvider(AddressingFeatureApplier.java:36)
        at org.apache.cxf.ws.addressing.WSAddressingFeature.initializeProvider(WSAddressingFeature.java:46)
        at org.apache.cxf.feature.AbstractFeature.initialize(AbstractFeature.java:49)
        at org.apache.cxf.frontend.ClientFactoryBean.applyFeatures(ClientFactoryBean.java:112)
        at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:100)
        at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:157)
        at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142)
        at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:476)
        at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:343)
        at javax.xml.ws.Service.getPort(Service.java:160)

Использование CXF версия 2.7.18

фрагмент pom.xml

      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>${cxf.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.16</version>
      </dependency>

1 Ответ

0 голосов
/ 28 апреля 2019

IncompatibleClassChangeError происходит, потому что некоторый код был скомпилирован для одной версии API, но во время выполнения загружается несовместимая версия API.

(В этом случае несовместимость «Реализация класса» означает, что класс был объявлен как implements Something, но во время выполнения Something оказывается скорее классом, чем интерфейсом. Это изменение API недопустимо .)

Проблема в том, что включенная вами трассировка стека не сообщает нам, в каком классе происходит несовместимость и с чем она несовместима. Единственная реальная подсказка в том, что CXF загружает «провайдера»

Так в чем же решение?

Серебряной пули нет. Вам нужно будет покопаться, чтобы выяснить, в чем собственно проблема:

  1. Проверьте журналы, откуда вы получили трассировку стека, для других сообщений журнала, которые могут сказать вам, что загружалось.
  2. Проверьте версии различных файлов JAR CXF на платформе времени выполнения.
  3. Убедитесь, что у вас нет разных версий JAR-файлов в самом веб-приложении и в каталогах общей библиотеки Tomcat.
  4. Измените настройки ведения журналов Tomcat, чтобы установить уровень ведения журнала для пакета org.apache.catalina.loader на DEBUG. Это зарегистрирует файл JAR, из которого загружен каждый класс.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...