2014-02-17 46 views
3

我試圖安裝tomcat服務器,並將所有常見的spring jar放到tomcat lib目錄中,因爲我使用了一些使用spring的web應用程序。然而,我的一個網絡應用程序也使用Quartz jar的spring批處理。當所有罐子都在app1/WEB-INF/lib目錄中時,此Web應用程序工作正常。然而,當我試圖將所有普通彈簧罐移動到tomcat/lib目錄以及app1/WEB_INF/lib中的spring batch和quartaz jar時,我得到了noclassdefFound錯誤。這裏是堆棧跟蹤即使jar文件存在於WEB-INF/lib目錄中,ClassNotFoundException仍然存在錯誤

Caused by: java.lang.NoClassDefFoundError: org/quartz/ObjectAlreadyExistsException 
    at java.lang.Class.getDeclaredConstructors0(Native Method) 
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
    at java.lang.Class.getDeclaredConstructors(Class.java:1836) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:230) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:972) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:945) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:777) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:707) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:523) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:357) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:335) 
    at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:187) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:895) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:853) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
    ... 60 more 
Caused by: java.lang.ClassNotFoundException: org.quartz.ObjectAlreadyExistsException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

但是,當我將同一個jar複製到tomcat/lib目錄時,它完美地工作。至於我的理解。類文件搜索的順序首先是jdk-> boot strap-> system-> common-> web-app lib。因此它應該搜索文件。在web app/web-inf/lib目錄中。我是否需要將任何配置添加到tomcat6或maven war插件來指定jar?

**EDIT** 

這裏的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.kp</groupId> 
    <artifactId>kp-app1</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>kp app1 Maven Webapp</name> 
    <url>http://maven.apache.org</url> 

    <parent> 
     <groupId>com.kp.parent</groupId> 
     <artifactId>kp-common</artifactId> 
     <version>1.0.0.0</version> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <cxf.version>2.7.5</cxf.version> 
     <spring.version>3.2.3.RELEASE</spring.version> 
     <aspectj.version>1.7.3</aspectj.version> 
     <jstl.version>1.2</jstl.version> 
     <servlet.version>3.0-alpha-1</servlet.version> 
     <spring.batch.version>2.2.1.RELEASE</spring.batch.version> 
     <quartz.version>1.8.5</quartz.version> 
     <skipTests>true</skipTests> 
    </properties> 

    <dependencies> 


     <!-- Spring framework --> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>3.0.2.RELEASE</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-expression</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aspects</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

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

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <version>${spring.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>aopalliance</groupId> 
      <artifactId>aopalliance</artifactId> 
      <version>1.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <!-- ================== --> 
     <!-- AOP --> 
     <!-- ================== --> 

     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>${aspectj.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjweaver</artifactId> 
      <version>${aspectj.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <!-- ================== --> 
     <!-- SPRING BATCH --> 
     <!-- ================== --> 
     <dependency> 
      <groupId>org.springframework.batch</groupId> 
      <artifactId>spring-batch-core</artifactId> 
      <version>${spring.batch.version}</version> 
     </dependency> 

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


     <!-- Required for cache/ lazy loading --> 
     <dependency> 
      <groupId>cglib</groupId> 
      <artifactId>cglib-nodep</artifactId> 
      <version>2.2.2</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.4</version> 
     </dependency> 

     <!-- Quartz framework --> 
     <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz</artifactId> 
      <version>${quartz.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
      <scope>provided</scope> 
     </dependency> 

    </dependencies> 




    <build> 

     <finalName>kp-app1</finalName> 
     <outputDirectory>${project.basedir}/target/classes</outputDirectory> 
     <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> 

     <pluginManagement> 
      <plugins> 

       <plugin> 
        <groupId>org.eclipse.m2e</groupId> 
        <artifactId>lifecycle-mapping</artifactId> 
        <version>1.0.0</version> 
        <configuration> 
         <lifecycleMappingMetadata> 
          <pluginExecutions> 
           <pluginExecution> 
            <pluginExecutionFilter> 
             <groupId>org.apache.maven.plugins</groupId> 
             <artifactId>maven-dependency-plugin</artifactId> 
             <versionRange>[2.8,)</versionRange> 
             <goals> 
              <goal>copy-dependencies</goal> 
             </goals> 
            </pluginExecutionFilter> 
            <action> 
             <execute /> 
            </action> 
           </pluginExecution> 
          </pluginExecutions> 
         </lifecycleMappingMetadata> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

     <plugins> 

      <!-- Tomcat 6 plugin --> 
      <plugin> 
       <groupId>org.apache.tomcat.maven</groupId> 
       <artifactId>tomcat6-maven-plugin</artifactId> 
       <configuration> 
        <url>${serverUrl}:${port}/manager</url> 
        <path>/${contextpath}</path> 
        <username>${username}</username> 
        <password>${password}</password> 
       </configuration> 
      </plugin> 

      <!-- Maven compiler --> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 


      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <webResources> 
         <resource> 
          <directory>src/main/webapp/WEB-INF/</directory> 
          <targetPath>WEB-INF</targetPath> 
          <includes> 
           <include>web.xml</include> 
          </includes> 
          <filtering>true</filtering> 
         </resource> 
        </webResources> 
       </configuration> 
      </plugin> 

      <!-- Copy all the provided jars--> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.8</version> 
       <configuration> 
        <outputDirectory>${project.build.directory}/provided-jars</outputDirectory> 
        <transitive>true</transitive> 
        <includeScope>provided</includeScope> 
       </configuration> 
       <executions> 
        <execution> 
         <id>cop-dependencies</id> 
         <phase>prepare-package</phase> 
         <goals> 
          <goal>copy-dependencies</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

      <!-- Create a zip of all the provided jars --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <descriptors> 
         <descriptor>src/main/resources/assembly/zip.xml</descriptor> 
        </descriptors> 
        <finalName>nms-tomcat-jars</finalName> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> <!-- this is used for inheritance merges --> 
         <phase>package</phase> <!-- append to the packaging phase. --> 
         <goals> 
          <goal>single</goal> <!-- goals == mojos --> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 
+0

發佈你的maven配置 – Jaiwo99

+0

並檢查tomcat/lib和webapp lib中的重複jar – Leo

+0

classnotfound有時意味着「無法加載此類」 – Leo

回答

3

由於應用程序上下文加載類。當我移動Spring-context.jar,Spring-web.jar和spring-context-support.jar時。它開始工作。正如@Naveen Ramawat所建議的那樣。上下文加載器不會從web-inf/classes目錄(子節點)加載類。因此,當我將這些jar移動到web-inf/lib時,子類可以從tomcat lib目錄加載父類。

3

兒童類加載器可以找到加載父類加載器,但父類加載器無法找到孩子的類加載器加載的類的類。這裏Spring類需要石英類創建bean,但失敗了,因爲石英類是由子類加載器加載的。

+0

那麼如何使它明確搜索? –

+0

我沒有嘗試過,但VirtualWebAppLoader可以提供幫助。請檢查鏈接,有人有類似的問題http://stackoverflow.com/questions/13704915/load-external-library-in-java-web-application –

+0

我寧願爲每個Web應用程序單獨部署Spring。沒有理由保存幾兆字節的空間,因爲現在看到的含義比您想象的要大。 – Gimby

0

檢查所有庫存在的部署區域並查看特定的jar是否存在。

相關問題