2013-04-08 34 views
5

Có một dự án dựa maven, có thể được xây dựng bởi maven install, nhưng ném ngoại lệ khi chạy jar ra:ClassNotFoundException trong dự án Maven

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser 
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.CommandLineParser 
    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 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

Tôi muốn biết lý do tại sao java không thể tìm thấy thư viện phụ thuộc maven ?

<?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>org.artofsolving.jodconverter</groupId> 
    <artifactId>jodconverter-core</artifactId> 
    <version>3.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>JODConverter - Core Library</name> 
    <description> 
    JODConverter converts office documents using OpenOffice.org 
    </description> 
    <url>http://jodconverter.googlecode.com</url> 
    <licenses> 
    <license> 
     <name>GNU Lesser General Public License, Version 3 or later</name> 
     <url>http://www.gnu.org/licenses/lgpl.html</url> 
    </license> 
    </licenses> 
    <scm> 
    <url>http://jodconverter.googlecode.com/svn/trunk/jodconverter-core</url> 
    <connection>scm:svn:https://jodconverter.googlecode.com/svn/trunk/jodconverter-core/</connection> 
    </scm> 
    <inceptionYear>2003</inceptionYear> 
    <developers> 
    <developer> 
     <id>mirko.nasato</id> 
     <name>Mirko Nasato</name> 
     <email>[email protected]</email> 
    </developer> 
    </developers> 
    <contributors> 
    <contributor> 
     <name>Shervin Asgari</name> 
     <email>[email protected]</email> 
    </contributor> 
    </contributors> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <repositories> 
    <repository> 
     <!-- required for org.hyperic:sigar --> 
     <id>jboss-public-repository-group</id> 
     <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url> 
    </repository> 
    </repositories> 

    <dependencies> 

    <!-- Required dependencies --> 

    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.openoffice</groupId> 
     <artifactId>juh</artifactId> 
     <version>3.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.openoffice</groupId> 
     <artifactId>ridl</artifactId> 
     <version>3.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.openoffice</groupId> 
     <artifactId>unoil</artifactId> 
     <version>3.2.1</version> 
    </dependency> 

    <dependency> 
     <!-- for the command line tool --> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
     <version>1.2</version> 
    </dependency> 

    <!-- Optional dependencies --> 


    <dependency> 
     <!-- for more robust process management --> 
     <groupId>org.hyperic</groupId> 
     <artifactId>sigar</artifactId> 
     <version>1.6.5.132</version> 
     <optional>true</optional> 
    </dependency> 
    <dependency> 
     <!-- for JSON configuration --> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20090211</version> 
     <optional>true</optional> 
    </dependency> 

    <!-- Test dependencies --> 

    <dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>6.0.1</version> 
     <scope>test</scope> 
    </dependency> 

    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.3.2</version> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
      <encoding>UTF-8</encoding> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.7.2</version> 
     <configuration> 
      <!-- don't run tests in parallel --> 
      <perCoreThreadCount>false</perCoreThreadCount> 
      <threadCount>1</threadCount> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3.1</version> 
     <configuration> 
      <archive> 
      <manifest> 
       <mainClass>org.artofsolving.jodconverter.cli.Convert</mainClass> 
       <addClasspath>true</addClasspath> 
      </manifest> 
      </archive> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/dist.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <reporting> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-javadoc-plugin</artifactId> 
     <version>2.7</version> 
     </plugin> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>cobertura-maven-plugin</artifactId> 
     <version>2.4</version> 
     </plugin> 
    </plugins> 
    </reporting> 

</project> 
+0

Làm thế nào để bạn chạy nó? Và cấu trúc thư mục/tập tin từ nơi bạn chạy nó? – NilsH

+0

@NilsH 'java -jar mục tiêu/jodconverter-core-3.0-SNAPSHOT.jar' – why

+0

Và dự án là https://github.com/mirkonasato/jodconverter – why

Trả lời

5

Khi chạy Jar với java -jar, bạn không còn chạy với tính năng giải quyết phụ thuộc của maven nữa. Bạn phải chắc chắn rằng tất cả các lọ bạn phụ thuộc vào có sẵn tại loacation tương đối specificied trong MANIFEST.mf tập tin trong Jar của bạn. Thông thường, bạn sẽ sử dụng các plugin lắp ráp để tạo ra một kho lưu trữ phân phối tạo ra cấu trúc này. Hoặc bạn có thể sử dụng một plugin uberjar/onejar để bao gồm mọi thứ bên trong Jar của bạn.

+0

Cảm ơn, cobertura- maven-plugin có thể giúp tôi – why

+0

Xin chào, bạn có thể vui lòng kiểm tra cho tôi một câu hỏi tương tự khác không? http://stackoverflow.com/questions/15862628/org-hyperic-sigar-sigarexception-no-libsigar-universal64-macosx-dylib-in -java-l – why

4

Bạn có 2 lựa chọn để sửa lỗi này:

Lựa chọn 1 - sử dụng cả hai plugin dưới đây để sao chép phụ thuộc vào một thư mục "lib" (xem outputDirectory) và làm cho JAR Runnable của bạn biết nơi họ đang (xem classpathPrefix)

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-jar-plugin</artifactId> 
<configuration> 
    <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
      <classpathPrefix>lib/</classpathPrefix> 
      <mainClass>example.MyMainClass</mainClass> 
     </manifest> 
    </archive> 
</configuration> 
</plugin> 

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-dependency-plugin</artifactId> 
<executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      <overWriteReleases>false</overWriteReleases> 
      <overWriteSnapshots>false</overWriteSnapshots> 
      <overWriteIfNewer>true</overWriteIfNewer> 
     </configuration> 
    </execution> 
</executions> 


Lựa chọn 2 - Sử dụng maven-assembly-plugin để tạo ra một JAR đơn với tất cả các phụ thuộc được bao gồm. (Tất cả phụ thuộc được trích lập và nén lại với nhau trong cùng một JAR)

<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

<id>with-dependencies</id> 
<formats> 
    <format>jar</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 
<dependencySets> 
    <dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <useProjectArtifact>true</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>compile</scope> 
    </dependencySet> 
</dependencySets> 

0

Tôi đã nhìn thấy vấn đề, quá. Cobertura tạo ra các bản sao cụ thể của tất cả các tệp lớp được biên dịch (trong mục tiêu/lớp) bằng thao tác bytecode. Tệp jar của tôi chứa các tệp lớp được thiết kế (từ target/generated-classes/cobertura), nhưng cobertura.jar bị thiếu. Vì vậy, ClassNotFoundException là phản ứng đúng.

Tuy nhiên, vì POM của tôi không chứa bất kỳ gợi ý nào, đó là các lớp dự định để đóng gói, Maven có lựa chọn miễn phí ... và nó sử dụng tập hợp các tập tin được thiết lập.

Giải pháp của tôi rất đơn giản: gói mvn clean và mvn. Cuộc gọi đầu tiên sẽ xóa tất cả các lớp được thiết lập. Sau đó, cuộc gọi thứ hai chỉ tìm thấy các lớp không được đưa ra mà không có bất kỳ tham chiếu bên ngoài nào tới Cobertura.