2012-05-12 6 views
40

Sử dụng Maven đầu tiên của tôi và tôi bị kẹt với các phụ thuộc.NoClassDefFoundError về phụ thuộc Maven

Tôi đã tạo một dự án Maven với Eclipse và thêm các phụ thuộc, và nó hoạt động không có vấn đề gì.

Nhưng khi tôi cố gắng chạy nó thông qua dòng lệnh:

$ mvn package # successfully completes 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App # NoClassDefFoundError for dependencies 

Nó tải phụ thuộc, xây dựng thành công, nhưng khi tôi cố gắng chạy nó, tôi nhận được NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:16) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:22) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.App.main(App.java:10) 
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonParseException 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
     ... 3 more 

pom My .xml giống như sau:

<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>tr.edu.hacettepe.cs.b21127113</groupId> 
    <artifactId>bil138_4</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>bil138_4</name> 
    <url>http://maven.apache.org</url> 

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

    <dependencies>   
    <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId>   
    </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId>    
     </dependency> 
    </dependencies> 
    <dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    </dependencies> 
    </dependencyManagement> 
</project> 

Có ai giúp tôi không?

Trả lời

16

when I try to run it, I get NoClassDefFoundError

Chạy nó như thế nào? Có lẽ bạn đang cố gắng chạy nó với nhật thực mà không cần nhập đúng classpath maven của bạn. Xem plugin m2eclipse để tích hợp maven với nhật thực cho điều đó.

Để xác minh rằng cấu hình maven bạn là chính xác, bạn có thể chạy ứng dụng của bạn với exec plugin sử dụng:

mvn exec:java -D exec.mainClass=<your main class> 

Cập nhật: Thứ nhất, liên quan tới lỗi của bạn khi chạy exec:java, lớp chính của bạn là tr.edu.hacettepe.cs.b21127113.bil138_4.App. Khi nói về tên lớp, chúng (hầu như) luôn tách biệt dấu chấm. Tên lớp đơn giản chỉ là phần cuối cùng: App trong trường hợp của bạn. Tên đầy đủ điều kiện là gói đầy đủ cùng với tên lớp đơn giản và đó là những gì bạn cung cấp cho maven hoặc java khi bạn muốn chạy một cái gì đó. Những gì bạn đang cố gắng sử dụng là đường dẫn hệ thống tệp đến tệp nguồn. Đó là một con thú hoàn toàn khác. Tên lớp thường dịch trực tiếp vào tệp lớp được tìm thấy trong đường dẫn lớp, so với tệp nguồn trong hệ thống tệp. Trong trường hợp cụ thể của bạn, tệp lớp được đề cập có thể là target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class vì maven biên dịch thành target/classes và java theo truyền thống tạo thư mục cho từng cấp bao gói.

Vấn đề ban đầu của bạn đơn giản là bạn chưa đặt các lọ Jackson trên đường dẫn lớp học của bạn. Khi bạn chạy một chương trình java từ dòng lệnh, bạn phải thiết lập đường dẫn lớp để cho nó biết nơi nó có thể tải các lớp từ đó. Bạn đã thêm bình của riêng bạn, nhưng không phải là những cái cần thiết khác. Nhận xét của bạn khiến tôi nghĩ rằng bạn không hiểu cách xây dựng đường dẫn lớp theo cách thủ công. Tóm lại, đường dẫn lớp có thể có hai thứ: các thư mục chứa các tệp lớp và các tệp chứa các tệp lớp. Thư mục chứa các lọ sẽ không hoạt động. Để biết thêm chi tiết về cách tạo đường dẫn lớp học, hãy xem "Setting the class path" và tài liệu công cụ javajavac.

đường dẫn lớp của bạn sẽ cần phải có ít nhất, và không có nguồn cấp dữ liệu dòng:

target/bil138_4-0.0.1-SNAPSHOT.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.6/jackson-core-asl-1.9.6.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.6/jackson-mapper-asl-1.9.6.jar 

Lưu ý rằng các dấu phân cách trên Windows là một dấu chấm phẩy (;).

Tôi xin lỗi vì không nhận thấy nó sớm hơn. Vấn đề đã được đặt ở đó trong bài viết gốc của bạn, nhưng tôi đã bỏ lỡ nó.

+0

Lỗi này: http://pastebin.com/g2txkMY6. Tôi có thể chạy nó trên nhật thực với plugin m2eclipse, tôi đã phát triển ứng dụng trên đó. Tôi không thể chỉ ra cách để chạy nó thông qua dòng lệnh. Và làm thế nào để nhập classpath maven của tôi? Chỉnh sửa: Đã thử với việc thêm tham số -classpath /home/utdemir/.m2/repository/ vào lệnh java, vẫn không có may mắn. – utdemir

+1

Đã cập nhật câu trả lời của tôi. –

+0

Cảm ơn bạn. Đặt đường dẫn lớp khi bạn nói đã giải quyết được sự cố, đánh dấu câu hỏi là đã được giải quyết.Nhưng tôi có một vài câu hỏi khác: 1- Tại sao tôi không phải thêm Jackson vào classpath cho plugin exec? 2- Exec plugin cần dự án của tôi được biên dịch, vì vậy tôi cần phải chạy mvn biên dịch hoặc gói, phải không? 3- Mã này là nhiệm vụ của tôi, việc thêm thư viện vào đường dẫn lớp của họ có phải là trách nhiệm của họ hay tôi phải làm gì đó về nó? – utdemir

80

Theo mặc định, Maven không bó phụ thuộc vào tệp JAR mà nó xây dựng và bạn không cung cấp chúng trên đường dẫn lớp khi bạn đang cố thực thi tệp JAR của mình tại dòng lệnh. Đây là lý do tại sao máy ảo Java không thể tìm thấy các tệp lớp thư viện khi cố gắng thực thi mã của bạn.

Bạn có thể chỉ định thủ công thư viện trên đường dẫn lớp với thông số -cp, nhưng điều đó nhanh chóng trở nên mệt mỏi.

Giải pháp tốt hơn là "tô bóng" mã thư viện vào tệp JAR đầu ra của bạn. Có một plugin Maven được gọi là maven-shade-plugin để thực hiện việc này. Bạn cần phải đăng ký nó trong POM của bạn, và nó sẽ tự động xây dựng một "uber-JAR" có chứa các lớp học của bạn và các lớp học cho mã thư viện của bạn quá khi bạn chạy mvn package.

Để đơn giản bó tất cả các thư viện cần thiết, thêm dòng sau vào POM của bạn:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.6</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Một khi điều này được thực hiện, bạn có thể chạy các lệnh bạn sử dụng trên:

$ mvn package 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App 

Nếu bạn muốn làm thêm cấu hình của plugin bóng râm trong điều khoản của những gì JARs nên được bao gồm, chỉ định một Main-Class cho một file JAR thực thi, và như vậy, xem phần "Ví dụ" trên maven-shade-plugin site.

+3

Trong trường hợp bất cứ ai chạy vào câu trả lời này, đây là nơi bạn có thể nhận được một phiên bản thực tế của plugin, bởi vì 1.6 là khá cũ bây giờ: http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade -plugin – Scadge

2

Bạn phải tạo classpath trong tệp pom cho sự phụ thuộc của bạn. do đó bạn phải sao chép tất cả các phụ thuộc vào một nơi.

kiểm tra blog của tôi. http://madhawagunasekara.blogspot.com/2014/10/solving-javalangnoclassdeffounderror-in.html

<build> 
 
    <plugins> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-dependency-plugin</artifactId> 
 
    <version>2.1</version> 
 
    <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> 
 
    </plugin> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-jar-plugin</artifactId> 
 
    <version>2.4</version> 
 
    <configuration> 
 
    <archive> 
 
     <manifest> 
 
     <addClasspath>true</addClasspath> 
 
     <classpathPrefix>lib/</classpathPrefix> 
 
     <mainClass>$fullqualified path to your main Class</mainClass> 
 
     </manifest> 
 
    </archive> 
 
    </configuration> 
 
    </plugin> 
 
    
 
    </plugins> 
 
    
 
    
 
</build>

-2

Chọn để dự án -> Sạch sẽ giải quyết này

2

Điều này là do nha phiến jar không phải là một phần của cuộc chiến tranh đầu ra của bạn/jar. Eclipse hoặc xây dựng địa phương bao gồm chúng như là một phần của classpath, nhưng xây dựng từ xa hoặc xây dựng tự động/theo lịch trình không xem xét chúng một phần của classpath.

Bạn có thể bao gồm các lọ phụ thuộc bằng cách sử dụng plugin.

Thêm bên dưới đoạn mã vào plugins của pom của bạn phần

<plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>3.0.0</version> 
     <configuration> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
-1

Trong trường hợp của tôi, mã nhị phân maven được đặt trong một thư mục bảo mật trong máy tính xách tay của công ty tôi (Program Files \ maven), gây phiền hà maven để kéo/lưu phụ thuộc kho, do đó DEPS không được tìm thấy (NoClassDefFoundError)

Chỉ cần đặt maven trong c: \ maven

Instructions

+0

Câu trả lời này không liên quan gì đến câu hỏi của OP. – shiri

+0

Trong trường hợp của tôi, lỗi này giống nhau: NoClassDefFoundError Lý do đằng sau: phụ thuộc Java của dự án không được tìm thấy; maven không có khả năng tạo/quản lý kho lưu trữ đúng cách. Lỗi này biến mất sau khi tôi áp dụng giải pháp này, được chia sẻ ở trên ... @shiri Làm cách nào bạn có thể tuyên bố rằng câu trả lời của tôi không liên quan gì đến câu hỏi đó? – cepix