2014-04-22 38 views
0

顯式依賴的NoClassDefFoundError的inspite我有以下的POM文件基於Maven的Apache的駱駝項目罐執行給出的pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<parent> 
    <groupId>com.rmg.maven</groupId> 
    <artifactId>rmg-company-pom</artifactId> 
    <version>1.2.0-SNAPSHOT</version> 
</parent> 
<groupId>com.rmg</groupId> 
<artifactId>price-finder-camel</artifactId> 
<version>1.0.0-SNAPSHOT</version> 

<properties> 
    <start.class>com.rmg.pricefinder.Application</start.class> 
    <spring-boot.version>0.5.0.M7</spring-boot.version> 
    <jackson.version>2.3.1</jackson.version> 
    <httpclient.version>4.3.2</httpclient.version> 
    <pmd.version>3.0.1</pmd.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <compileSource>1.7</compileSource> 
    <surefire.version>2.12.3</surefire.version> 
    <hystrix.version>1.2.2</hystrix.version> 
    <jaxb2.plugin.version>1.6</jaxb2.plugin.version> 
    <camel.version>2.13.0</camel.version> 
    <cxf.version>3.0.0-milestone2</cxf.version> 
    <hibernate.validator.version>5.1.0.Final</hibernate.validator.version> 
    <tomcat.jasper.el.version>6.0.39</tomcat.jasper.el.version>   
</properties> 

<dependencies> 
    <dependency> 
     <groupId>com.rmg.maven</groupId> 
     <artifactId>rmg-camel-dependencies-pom</artifactId> 
     <version>0.1.0-SNAPSHOT</version> 
     <type>pom</type> 
    </dependency> 
    <dependency> 
     <groupId>com.rmg.maven</groupId> 
     <artifactId>rmg-cxf-dependencies-pom</artifactId> 
     <version>0.1.0-SNAPSHOT</version> 
     <type>pom</type> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <version>${spring-boot.version}</version> 
     <!-- <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-jetty</artifactId> 
      </exclusion> 
     </exclusions> --> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-websocket</artifactId> 
     <version>${spring-boot.version}</version> 
    </dependency> 

    <!-- Additional Spring Dependencies - Spring Data Redis --> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-redis</artifactId> 
     <version>1.2.1.RELEASE</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-core</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-context</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>redis.clients</groupId> 
     <artifactId>jedis</artifactId> 
     <version>2.4.2</version> 
    </dependency> 

    <!-- Camel Components --> 
    <!-- Camel Jackson --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-jackson</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <!-- Camel HTTP4 --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-http4</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>${httpclient.version}</version> 
    </dependency> 
    <!-- Camel Velocity --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-velocity</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <!-- Camel JAXB --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-jaxb</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <!-- Camel Saxon for XSLT 2.0 --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-saxon</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <!-- Camel Quartz2 --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-quartz2</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <!-- Camel CXF --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-cxf</artifactId> 
     <version>${camel.version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-context</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-beans</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-core</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <!-- Apache CXF --> 
    <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-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-rs-client</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-rs-extension-providers</artifactId> 
     <version>${cxf.version}</version> 
    </dependency>      
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-bindings-soap</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-features-clustering</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-rs-security-oauth</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-rs-security-cors</artifactId> 
     <version>${cxf.version}</version> 
    </dependency>           
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-ws-security</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 

    <!-- Hibernate Bean Validator --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>${hibernate.validator.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>jasper-el</artifactId> 
     <version>${tomcat.jasper.el.version}</version> 
    </dependency>  

    <!-- Jackson JSON --> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 

    <!-- Hystrix --> 
    <dependency> 
     <groupId>com.netflix.hystrix</groupId> 
     <artifactId>hystrix-core</artifactId> 
     <version>${hystrix.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.netflix.hystrix</groupId> 
     <artifactId>hystrix-metrics-event-stream</artifactId> 
     <version>${hystrix.version}</version> 
    </dependency> 

    <!-- TESTING --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-test-spring</artifactId> 
     <version>${camel.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-spring-javaconfig</artifactId> 
     <version>${camel.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-all</artifactId> 
     <version>1.3</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jolokia</groupId> 
     <artifactId>jolokia-spring</artifactId> 
     <classifier>plugin</classifier> 
     <version>1.2.0</version> 
    </dependency> 
    <dependency> 
     <artifactId>geronimo-servlet_3.0_spec</artifactId> 
     <groupId>org.apache.geronimo.specs</groupId> 
     <version>1.0</version> 
     <scope>runtime</scope> 
    </dependency> 
</dependencies> 


<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-checkstyle-plugin</artifactId> 
      <configuration> 
       <configLocation>src/main/resources/not_packaged_in_archive/rmg-checkstyle.xml</configLocation> 
       <propertyExpansion> 
        suppressions.file=src/main/resources/not_packaged_in_archive/rmg-checkstyle-suppressions.xml 
       </propertyExpansion> 
       <propertyExpansion> 
        suppressions.file=src/main/resources/not_packaged_in_archive/rmg-checkstyle-suppressions.xml 
       </propertyExpansion> 
      </configuration> 
     </plugin> 
     <!-- wsdl2java plugin--> 
     <plugin> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-codegen-plugin</artifactId> 
      <version>${cxf.version}</version> 
      <executions> 
       <execution> 
        <id>generate-login-client-classes</id> 
        <phase>generate-sources</phase> 
        <configuration> 
         <sourceRoot>${basedir}/target/generated-sources/wsdl2java</sourceRoot> 
         <wsdlOptions> 
          <wsdlOption> 
           <wsdl>${basedir}/src/main/resources/META-INF/wsdl/testmbo_login.wsdl</wsdl> 
           <extraargs> 
            <extraarg>-validate</extraarg> 
            <extraarg>-client</extraarg> 
            <extraarg>-verbose</extraarg> 
            <extraarg>-p</extraarg> 
            <extraarg>com.bigmachines.security.service</extraarg> 
            <extraarg>-exsh</extraarg> 
            <extraarg>true</extraarg> 
           </extraargs> 
          </wsdlOption> 
         </wsdlOptions> 
        </configuration> 
        <goals> 
         <goal>wsdl2java</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <!-- JAXB plugin --> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxb2-maven-plugin</artifactId> 
      <version>${jaxb2.plugin.version}</version> 
      <executions> 
       <execution> 
        <id>generate-source</id> 
        <goals> 
         <goal>xjc</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <packageName>com.rmg.pricefinder.model</packageName> 
       <schemaDirectory>src/main/resources/META-INF/xsd</schemaDirectory> 
       <schemaFiles>mailServices.xsd, pips.xsd, weight-bands.xsd, destinations.xsd</schemaFiles> 
       <bindingDirectory>src/main/resources/META-INF/jaxb</bindingDirectory> 
       <bindingFiles>serializable.xjb</bindingFiles> 
      </configuration> 
     </plugin> 

     <!-- Explicitly run PMD in the build --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-pmd-plugin</artifactId> 
      <version>${pmd.version}</version> 
      <configuration> 
       <linkXRef>true</linkXRef> 
       <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding> 
       <minimumTokens>100</minimumTokens> 
       <targetJdk>${compileSource}</targetJdk> 
       <excludes> 
        <exclude>**com/bigmachines/security/service/*.java</exclude> 
        <exclude>**com/bigmachines/security/service/runtime/*.java</exclude> 
       </excludes> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>check</goal> 
         <goal>cpd-check</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <!-- Surefire configuration to run specified group of tests --> 
     <plugin> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>${surefire.version}</version> 
      <configuration> 
       <groups>${tests.group}</groups> 
      </configuration> 
     </plugin>    
    </plugins> 
</build> 

<profiles> 
    <!-- 'dev' profile - runs only unit & acceptance tests. This is the default profile. 
    Gets activated by default or when the value of the system property 'ENVIRONMENT' is 'dev' --> 
    <profile> 
     <id>dev</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
      <property> 
       <name>ENVIRONMENT</name> 
       <value>dev</value> 
      </property> 
     </activation>    
     <properties> 
      <tests.group> 
       com.rmg.pricefinder.camel.PriceFinderAcceptanceTest, 
       com.rmg.pricefinder.camel.PriceFinderUnitTest 
      </tests.group> 
     </properties> 
    </profile>   
    <!-- 'sit' profile - runs integration tests only. 
    Gets activated when the value of the system property 'ENVIRONMENT' is 'sit' --> 
    <profile> 
     <id>sit</id> 
     <activation> 
      <property> 
       <name>ENVIRONMENT</name> 
       <value>sit</value> 
      </property> 
     </activation>    
     <properties> 
      <tests.group>com.rmg.pricefinder.camel.PriceFinderIntegrationTest</tests.group> 
     </properties> 
    </profile> 
</profiles>  

當我發出mvn clean install命令,它成功地建立。但是,當我嘗試運行使用java -jar <generated_jar_filename>它給了我下面的錯誤命令行中生成jar文件:

C:\Users\aattarwa>java -jar D:\Users\aattarwa\.m2\repository\com\rmg\price-finder-camel\1.0.0-SNAPSHOT\price-finder-camel-1.0.0-SNAPSHOT.jar 
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Servlet 

    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
    at java.lang.Class.getMethod0(Unknown Source) 
    at java.lang.Class.getMethod(Unknown Source) 
    at sun.launcher.LauncherHelper.getMainMethod(Unknown Source) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
    Caused by: java.lang.ClassNotFoundException: javax.servlet.Servlet 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    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) 
    ... 6 more 

我已經明確地增加了geronimo-servlet_3.0_spec依賴到我的POM文件爲:

<dependency> 
     <artifactId>geronimo-servlet_3.0_spec</artifactId> 
     <groupId>org.apache.geronimo.specs</groupId> 
     <version>1.0</version> 
     <scope>runtime</scope> 
</dependency> 

儘管如此,當我嘗試執行jar時,仍然給我NoClassDefFoundError

有沒有人有任何線索?

+0

我完全刪除了範圍,但問題仍然存在。我通過命令行發佈maven命令,這意味着我的IDE不會搞亂它。我相信它的一些其他依賴項不包括classpath中的servlet類。 – abbasdgr8

回答

0

我找到了解決方案!

我在我的應用程序中使用了spring-boot,目的是使用命令java -jar <generated_file_name>來執行它。這意味着我的罐子必須spring-bootable

我錯過了我的pom.xml以下插件 - >spring-boot-maven-plugin我添加爲:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>1.0.1.RELEASE</version> 
    <executions> 
      <execution> 
       <goals> 
        <goal>repackage</goal> 
       </goals> 
       <configuration> 
        <mainClass>${start.class}</mainClass> 
       </configuration> 
      </execution> 
     </executions> 
     <configuration> 
      <mainClass>${start.class}</mainClass> 
     </configuration> 
    </plugin> 

添加此之後,它的工作就像一個魅力!

0

這是由於將範圍設置爲runtime所致,這意味着org.apache.geronimo.specs工件需要在運行JAR時出現在CLASSPATH中。當你想將你的應用程序部署到某個容器時(在這種情況下,我假設你想要一個Servlet),你通常希望使用providedruntime作用域,並且你期望你的服務器爲你提供這種依賴關係 - 這不是你現在的情況,因爲你正在自己運行它。