2017-09-16 51 views
0

我已經使用Spring STS和xml配置文件spring-context.xml創建了一個spring遺留項目。我想使用JUnit(運行方式> Maven的測試)來測試我的DAO類,但我得到以下錯誤:Spring Maven JUnit NoClassDefFoundError:org/springframework/context/ApplicationContextException

initializationError(net.mozaikdev.samples.dao.test.AddressDAOTest) Time elapsed: 0.006 sec <<< ERROR! 
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.test.context.support.DelegatingSmartContextLoader]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:177) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:123) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:146) 
at org.springframework.test.context.support.AbstractTestContextBootstrapper.resolveContextLoader(AbstractTestContextBootstrapper.java:467) 
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:357) 
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:303) 
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:109) 
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:135) 
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:151) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:142) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) 
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) 
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:250) 
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException 
at org.springframework.test.context.support.DelegatingSmartContextLoader.<init>(DelegatingSmartContextLoader.java:63) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:165) 
... 32 more 
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContextException 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
... 38 more 

我不明白爲什麼我得到這個異常,因爲我已經宣佈我的pom.xml依賴於彈簧背景:

<?xml version="1.0" encoding="UTF-8"?> 
<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>net.mozaikdev</groupId> 
<artifactId>eshop-sample-spring-legacy</artifactId> 
<name>eshop-sample-spring-legacy</name> 
<packaging>war</packaging> 
<version>1.0.0-BUILD-SNAPSHOT</version> 

<repositories> 
    <repository> 
     <id>repository.spring.release</id> 
     <name>Spring GA Repository</name> 
     <url>http://repo.spring.io/release</url> 
    </repository> 

    <repository> 
     <id>repository.spring.milestone</id> 
     <name>Spring Milestone Repository</name> 
     <url>http://repo.spring.io/milestone</url> 
    </repository> 
</repositories> 

<properties> 
    <java-version>1.8</java-version> 
    <org.springframework-version>5.0.0.RC3</org.springframework-version> 
    <org.hibernate-version>5.2.10.Final</org.hibernate-version> 
    <org.aspectj-version>1.8.10</org.aspectj-version> 
    <org.slf4j-version>1.7.25</org.slf4j-version> 
</properties> 

<dependencies> 

    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${org.springframework-version}</version> 
     <exclusions> 
      <!-- Exclude Commons Logging in favor of SLF4j --> 
      <exclusion> 
       <groupId>commons-logging</groupId> 
       <artifactId>commons-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${org.springframework-version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${org.springframework-version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${org.springframework-version}</version> 
    </dependency> 

    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>${org.hibernate-version}</version> 
    </dependency> 

    <!-- MariaDB Connector J --> 
    <dependency> 
     <groupId>org.mariadb.jdbc</groupId> 
     <artifactId>mariadb-java-client</artifactId> 
     <version>2.1.1</version> 
    </dependency> 

    <!-- HikariCP connection pool --> 
    <dependency> 
     <groupId>com.zaxxer</groupId> 
     <artifactId>HikariCP</artifactId> 
     <version>2.7.0</version> 
    </dependency> 
</dependencies> 
</project> 

這裏是我的JUnit測試:

@ContextConfiguration(locations = "classpath:application-context.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 
public class AddressDAOTest { 

@Autowired 
private AddressDAO addressDAO; 

private static final String STREET_1 = "street_1"; 
private static final String STREET_2 = "street_2"; 
private static final Integer ZIP_CODE = new Integer(1234); 
private static final String CITY = "city"; 
private static final String REGION = "region"; 
private static final String COUNTRY = "country"; 
private static final Boolean IS_DELIVERY_ADDRESS = new Boolean(false); 

@Test 
@Transactional 
@Rollback(value = true) 
public void testPersistAndFindById() { 

    Address address = new Address(); 
    address.setStreet_1(STREET_1); 
    address.setStreet_2(STREET_2); 
    address.setZipCode(ZIP_CODE); 
    address.setCity(CITY); 
    address.setRegion(REGION); 
    address.setCountry(COUNTRY); 
    address.setIsDeliveryAddress(IS_DELIVERY_ADDRESS); 

    addressDAO.persist(address); 

    Long id = address.getId(); 

    address = addressDAO.findById(id); 

    Assert.assertEquals(STREET_1, address.getStreet_1()); 
    Assert.assertEquals(STREET_2, address.getStreet_2()); 
    Assert.assertEquals(ZIP_CODE, address.getZipCode()); 
    Assert.assertEquals(CITY, address.getCity()); 
    Assert.assertEquals(REGION, address.getRegion()); 
    Assert.assertEquals(COUNTRY, address.getCountry()); 
    Assert.assertEquals(IS_DELIVERY_ADDRESS, address.getIsDeliveryAddress()); 

} 

@Test 
@Transactional 
@Rollback(value = true) 
public void testFindAll() { 

    Address address1 = new Address(); 
    address1.setStreet_1(STREET_1); 
    address1.setStreet_2(STREET_2); 
    address1.setZipCode(ZIP_CODE); 
    address1.setCity(CITY); 
    address1.setRegion(REGION); 
    address1.setCountry(COUNTRY); 
    address1.setIsDeliveryAddress(IS_DELIVERY_ADDRESS); 

    Address address2 = new Address(); 
    address2.setStreet_1(STREET_1_UPDATE); 
    address2.setStreet_2(STREET_2_UPDATE); 
    address2.setZipCode(ZIP_CODE_UPDATE); 
    address2.setCity(CITY_UPDATE); 
    address2.setRegion(REGION_UPDATE); 
    address2.setCountry(COUNTRY_UPDATE); 
    address2.setIsDeliveryAddress(IS_DELIVERY_ADDRESS_UPDATE); 

    addressDAO.persist(address1); 
    addressDAO.persist(address2); 

    List<Address> addressesList = addressDAO.findAll(); 

    Assert.assertNotNull(addressesList); 
    Assert.assertTrue(addressesList.size() >= 2); 
    Assert.assertTrue(addressesList.contains(address1)); 
    Assert.assertTrue(addressesList.contains(address2)); 
} 
} 

最後的application-context.xml FIL E:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

<!-- Enable annotation configuration --> 
<context:annotation-config /> 

<!-- Scan packages for Spring annotations --> 
<context:component-scan base-package="net.mozaikdev.samples.dao" /> 
<context:component-scan base-package="net.mozaikdev.samples.dao.test" /> 

<!-- Database connection configuration --> 
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
    <property name="jdbcUrl" value="${spring.datasource.jdbcUrl}"/> 
    <property name="driverClassName" value="${spring.datasource.driverClassName}"/> 
    <property name="username" value="${spring.datasource.username}"/> 
    <property name="password" value="${spring.datasource.password}"/> 
    <property name="poolName" value="${spring.datasource.hikari.poolName}"/> 
    <property name="connectionTimeout" value="${spring.datasource.hikari.connectionTimeout}"/> 
    <property name="maximumPoolSize" value="${spring.datasource.hikari.maximumPoolSize}"/> 
    <property name="idleTimeout" value="${spring.datasource.hikari.idleTimeout}"/> 
    <property name="connectionTestQuery" value="${spring.datasource.hikari.connectionTestQuery}"/> 
    <property name="maxLifetime" value="${spring.datasource.hikari.maxLifetime}"/> 
</bean> 

<!-- HikariCP datasource bean --> 
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> 
    <constructor-arg index="0" ref="hikariConfig"/> 
</bean> 

<!-- Enables annotation-driven transaction management. --> 
<tx:annotation-driven/> 

<!-- 
    Creates the transaction manager bean that integrates the used JPA provider with the 
    Spring transaction mechanism. 
--> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<!-- Specifies the default settings that are compatible with Hibernate. --> 
<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 

<!-- Creates the Hibernate entity manager factory bean --> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/> 
    <property name="packagesToScan" value="net.mozaikdev.samples.domain"/> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">${spring.jpa.properties.hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${spring.jpa.properties.hibernate.show_sql}</prop> 
      <prop key="hibernate.format_sql">${spring.jpa.properties.hibernate.format_sql}</prop> 
      <prop key="hibernate.generate_statistics">${spring.jpa.properties.hibernate.generate_statistics}</prop> 
     </props> 
    </property> 
</bean> 

<!-- Enable support for annotation-driven Spring MVC controllers --> 
<!-- <mvc:annotation-driven/> --> 

我已清理使用運行我的項目爲> Maven的清潔項目>清潔...,我更新了項目的Maven>更新項目但沒有任何工程。我現在卡住了,如果有人可以幫我解決這個異常,那會很好嗎?

在此先感謝。

回答

1

注意根本原因錯誤。 這是很清楚的:在你的classpath

Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContextException

認沽春庫。

+0

謝謝你的回答,我剛剛編輯了我的文章,並添加了pom.xml,並且聲明瞭spring-context依賴項,所以我不明白是什麼問題... –

0

好吧,我解決了這個問題。當我跑運行方式>行家安裝它給了我下面的錯誤:

maven error reading C:\Users\569128763\.m2\repository\org\springframework\spring-context\5.0.0.RC3\spring-context-5.0.0.RC3.jar invalid LOC header (bad signature) 

所以春天上下文的jar文件已損壞,我只是從我的M2存儲庫中刪除了springframework的目錄並沒有的Maven>更新項目,然後再次啓動maven install並且它工作。