鍍金池/ 問(wèn)答/Java  PHP/ Spring 整合 Struts2 時(shí)發(fā)生異常: java.lang.NoCla

Spring 整合 Struts2 時(shí)發(fā)生異常: java.lang.NoClassDefFoundError

突然之間使用 maven 引入的 struts2-spring-plugin jar 包就出錯(cuò)了(#無(wú)奈),而且 IDEA 還給吾輩的 applicationContext.xml 報(bào)錯(cuò)了...

詳細(xì)的錯(cuò)誤信息是:

java.lang.NoClassDefFoundError: org/springframework/core/ResolvableTypeProvider

    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.chapter12.sshdemo.dao.UserLoginDaoTest.testListByAll(UserLoginDaoTest.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: java.lang.ClassNotFoundException: org.springframework.core.ResolvableTypeProvider
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 37 more

下面是吾輩的 pom.xml 配置:

<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.sshdemo</groupId>
  <artifactId>sshdemo</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>sshdemo Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <!--jsp 相關(guān)依賴-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <!--struts2 的依賴-->
    <dependency>
      <groupId>org.apache.struts</groupId>
      <artifactId>struts2-core</artifactId>
      <version>2.5.14.1</version>
    </dependency>
    <!--
      struts-spring 整合(就是這個(gè) jar 包的錯(cuò)誤,刪除掉這個(gè)的話加載 applicationContext.xml 文件就不會(huì)報(bào)錯(cuò)了),
      然而 struts2 和 spring 整合需要這個(gè)...
      -->
    <dependency>
      <groupId>org.apache.struts</groupId>
      <artifactId>struts2-spring-plugin</artifactId>
      <version>2.5.14.1</version>
    </dependency>

    <!--TestNG 與 Spring 測(cè)試整合-->
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.11</version>
      <scope>test</scope>
    </dependency>
    <!--AssertJ 斷言測(cè)試-->
    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <version>3.8.0</version>
      <scope>test</scope>
    </dependency>

    <!--log4j 日志記錄-->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <!--mysql 數(shù)據(jù)庫(kù)連接-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>

    <!--整合 Spring ORM 框架-->
    <!--使用 dbcp 數(shù)據(jù)源-->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>5.2.10.Final</version>
    </dependency>

    <!--Spring 上下文對(duì)象-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>
    <!--spring 整合測(cè)試框架-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>
    <!--spring 整合 orm 框架-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>
    <!--Spring 面向切面編程相關(guān)-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.10</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.10</version>
    </dependency>

    <!--lombok 簡(jiǎn)化 getter()/setter()/toString()-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.18</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>
    <finalName>sshdemo</finalName>

    <plugins>
      <!--設(shè)置 java 源代碼的版本是 1.8(默認(rèn)是 jdk 1.5,會(huì)影響編譯器編譯尤其是 lambda)-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>

      <!--設(shè)置 maven 的默認(rèn)編碼格式(測(cè)試時(shí)可能會(huì)亂碼)-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
        <configuration>
          <forkMode>once</forkMode>
          <argLine>-Dfile.encoding=UTF-8</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

這個(gè)則是吾輩的 applicationContext.xml 配置文件,吾輩確認(rèn)是沒有錯(cuò)誤的,然而 IDEA 會(huì)報(bào)錯(cuò),是的,就是那個(gè)頭文件的錯(cuò)...

錯(cuò)誤信息是:

The namespace attribute, 'http://www.springframework.org/schema/tool', of an <import> element information item must be identical to the targetNamespace attribute, 'http://www.springframework.org/schema/context', of the imported document.

clipboard.png

測(cè)試類很簡(jiǎn)單,只是想加載一下 Spring 容器而已:

package com.chapter12.sshdemo.dao;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

public class UserLoginDaoTest {
  @Test
  public void testListByAll() throws Exception {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    System.out.println(applicationContext);
  }
}

所以,請(qǐng)問(wèn)有沒有遇到過(guò)這個(gè)錯(cuò)誤呢?吾輩已經(jīng)因?yàn)檫@個(gè)問(wèn)題卡了一個(gè)下午了,真心求幫助呀 QAQ

回答
編輯回答
何蘇葉

檢查一下Maven Dependencies是否有spring-core.jar?或者存在多個(gè)版本?

2018年7月21日 11:40