【问题标题】:Why does CXF 2.7.5 (for jax-rs) / Spring 3.x / Hibernate 4.x results in java.lang.ClassNotFoundException: org.springframework.asm.ClassVisitor?为什么 CXF 2.7.5 (for jax-rs) / Spring 3.x / Hibernate 4.x 会导致 java.lang.ClassNotFoundException: org.springframework.asm.ClassVisitor?
【发布时间】:2013-07-06 15:38:29
【问题描述】:

我正在通过 CXF 2.7.5 构建一个 RESTful 服务,并且正在使用 cxf-servlet 方法。 javax-servlet 3.0 API、Spring 3.x 和 Hibernate 4.x 都是图片的一部分。

在将 Spring JPA、Spring ORM 和 Hibernate 合并到我的 maven POM 文件中之前, 我可以构建一个实际服务于明确定义的端点的战争文件(已建立 通过 JAX-RS)。

无论如何,现在war-file 不会部署到Tomcat 7.x 中;而是例外 如标题所示:

    java.lang.ClassNotFoundException: org.springframework.asm.ClassVisitor

我已经检查过的一些事情:

  • Tomcat 7.x 使用符合 javax-servlet 3.x 的 API 运行。
  • 带有 ClassVisitor (org.springframework.asm) 的包在 WEB-INF/lib 中的 jars 文件中唯一列出。事实上,它现在已作为 spring-core 的一部分下载。

我浏览了许多解释类似情况的文章。但大多数最终 建议显而易见:确保在类路径中引用了 ClassVisitor。

我列出了我的 POM 文件(以顶部的一些例外为模)以及 web.xml 战争文件的部署描述符和 applicationContext.xml。在底部, 我还根据上下文重新列出了例外情况。

maven 3.x POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.acme.etorf</groupId>
  <artifactId>etorf</artifactId>
  ...
  <version>1</version>
  <packaging>war</packaging>

  <properties>
    <cxf.version>2.7.5</cxf.version>
    <spring.version>3.2.2.RELEASE</spring.version>
    <spring.asm.version>3.1.4.RELEASE</spring.asm.version>
    <spring.jpa.version>2.0.8</spring.jpa.version>
    <hibernate.version>4.2.2.Final</hibernate.version>
    <hibernate.jpa.api.version>2.0-cr-1</hibernate.jpa.api.version>
    <mysql.connector.version>5.1.25</mysql.connector.version>
    <c3p0.version>0.9.1.2</c3p0.version>
    <slf4j.version>1.7.5</slf4j.version>
  </properties>

  <build>
    <pluginManagement>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugin</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <webXml>WebContent/WEB-INF/web.xml</webXml>
          </configuration>
        </plugin>
        </plugins>
      </pluginManagement>
  </build>

  <dependencies>
        <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
        </dependency>

    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-frontend-jaxrs</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-transports-http-hc</artifactId>
      <version>${cxf.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jpa</artifactId>
      <version>${spring.jpa.version}</version>
      <exclusions>
        <exclusion>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysql.connector.version}</version>
        </dependency>
        <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>${hibernate.version}</version>
        </dependency>

    <dependency>
      <groupId>c3p0</groupId>
      <artifactId>c3p0</artifactId>
      <version>${c3p0.version}</version>
    </dependency>

        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>${slf4j.version}</version>
        </dependency>
  </dependencies>
</project>

web.xml:

<web-app
  version="3.0"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name>etorf</display-name>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>

  <servlet>
    <servlet-name>cxf</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>

  <servlet-mapping>
    <servlet-name>cxf</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>
</web-app>

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements. See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership. The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License. You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied. See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jaxrs="http://cxf.apache.org/jaxrs"
  xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
                      http://www.springframework.org/schema/beans/spring-beans.xsd
                      http://cxf.apache.org/jaxrs
                      http://cxf.apache.org/schemas/jaxrs.xsd
                      http://cxf.apache.org/transports/http/configuration
                      http://cxf.apache.org/schemas/configuration/http-conf.xsd
                                            http://www.springframework.org/schema/tx
                                            http://www.springframework.org/schema/tx/spring-tx.xsd">

  <import resource="classpath:META-INF/cxf/cxf.xml" />
  <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="location">
        <value>classpath:hibernate.properties</value>
      </property>
    </bean>

  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${hibernate.connection.driver_class}" />
    <property name="jdbcUrl" value="${hibernate.connection.url}" />
    <property name="user" value="${hibernate.connection.username}" />
    <property name="password" value="${hibernate.connection.password}" />
    <property name="acquireIncrement" value="5" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="150" />
    <property name="maxIdleTime" value="1800" />
  </bean>

  <bean id="hibernateJpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
  <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="MYSQL" />
    <!-- <property name="showSql" value="true" /> -->
    <!--<property name="generateDdl" value="true" /> -->
  </bean>

  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />

    <property name="persistenceXmlLocation" value="classpath:persistence.xml" />
    <property name="persistenceUnitName" value="Forte-Persistence-Unit" />
    <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />

    <property name="jpaPropertyMap">
      <map>
        <entry key="hibernate.transaction.flush_before_completion" value="true" />
        <entry key="hibernate.transaction.auto_close_session" value="true" />
        <entry key="hibernate.current_session_context_class" value="jta" />
        <entry key="hibernate.connection.release_mode" value="auto" />
        <!-- <entry key="hibernate.show_sql" value="true" />-->
      </map>
    </property>

    <property name="jpaDialect" ref="hibernateJpaDialect" />
  </bean>

  <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
  </bean>
  <tx:annotation-driven transaction-manager="transactionManager" />

  <bean id="helloservice" class="com.kornferry.service.HelloServiceImpl"/>
  <jaxrs:server id="helloworld" address="/">
    <jaxrs:serviceBeans>
      <ref bean="helloservice"/>
    </jaxrs:serviceBeans>                  
  </jaxrs:server>

</beans>

catalina.out 的异常:

INFO: Refreshing Root WebApplicationContext: startup date [Mon Jul 08 22:47:52 PDT 2013]; root of context hierarchy
Jul 8, 2013 10:47:52 PM org.springframework.web.context.ContextLoader initWebApplicationContext
SEVERE: Context initialization failed
java.lang.NoClassDefFoundError: org/springframework/asm/ClassVisitor
        at org.springframework.context.support.AbstractRefreshableApplicationContext.customizeBeanFactory(AbstractRefreshableApplicationContext.java:218)
        at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
        at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)
        at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:282)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:204)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:976)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1653)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.ClassNotFoundException: org.springframework.asm.ClassVisitor
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
        ... 21 more
Jul 8, 2013 10:47:52 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart
Jul 8, 2013 10:47:52 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/cxf-library] startup failed due to previous errors

【问题讨论】:

  • ClassVisitor 在 spring-asm-3.x.jar 中。你确定你明白了吗?听起来您的依赖项/库中有冲突。检查版本。我想你不使用 maven 吗?
  • org.springframework.asm(包括 ClassVisitor)现在也在 spring-core-3.2.2.RELEASE.jar 中。 maven 依赖列表显示加载 spring-core 作为加载 spring-tx 的副作用: [INFO] +- org.springframework:spring-tx:jar:3.2.2.RELEASE:compile [INFO] | +- aopalliance:aopalliance:jar:1.0:compile [INFO] | +- org.springframework:spring-beans:jar:3.2.2.RELEASE:compile [INFO] | \- org.springframework:spring-core:jar:3.2.2.RELEASE:compile
  • mvn -o dependency:list 的结果是什么
  • 我解决了这个问题:spring-asm was 在我的 war 文件的类路径中。但是,在 Tomcat/webapps 下还有一个未定义 spring-asm 的 war 文件!所以,我的war文件毕竟没有触发异常。这个问题与:stackoverflow.com/questions/9268101/… 几乎相同

标签: spring maven jakarta-ee cxf cxfrs


【解决方案1】:

查看我的最后一条评论。丢失的 ClassVisitor 异常是由 cxf-library.war 触发的,它是我自己的一个单独的战争文件。删除 cxf-libray.war(及其解压文件夹)后,重新启动 Tomcat,异常消失。

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2015-03-29
    • 2021-03-16
    • 2011-12-14
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多