2013-04-05 8 views
5

Tôi đã tạo một máy chủ xà phòng với java cho công ty của mình và gần đây tôi đã chuyển sang sử dụng Bone-CP và Maven để nhập tất cả các chương trình của bên thứ ba bắt buộc. Sau khi tôi đã hoàn thành việc thực hiện xương-CP ngày tôi sử dụng lệnh máy chủJava.lang.NoClassDefFoundError sau khi sử dụng maven lần đầu tiên?

jar -cvfm SoapServer.jar manifest.txt SoapServer 

Và khi tôi chuyển nó vào máy chủ của tôi và cố gắng chạy nó tôi đã nhận lỗi này:

Exception in thread "main" java.lang.NoClassDefFoundError: SoapServer/SoapServer (wrong name: com/test/SoapServer/SoapServer) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 

Các chỉ nghĩ tôi có thể nghĩ gây ra vấn đề là maven không đóng gói các JAR cần thiết với chương trình? Nếu đó là trường hợp tôi chỉ cần tải chúng và thêm chúng vào đường dẫn lớp?

Trả lời

13

Nếu bạn cần tất cả các phụ thuộc của bạn để được đóng gói trong lọ thực thi sau đó cấu hình pom của bạn như

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <configuration> 
      <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <classpathPrefix>lib/</classpathPrefix> 
       <mainClass>com.something.YourMainClass</mainClass> 
      </manifest> 
      </archive> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

trên khối sẽ thêm tất cả các thư viện trong lib/vào classpath trong mục classpath manifest

và sao chép tất cả các phụ thuộc vào thư mục lib

<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> 
+0

Có thể thêm một mục nhập classpathPrefix khác trong maven-jar-plugin không? Giống như: lib/ config/ Tôi muốn có thư mục bên ngoài được gọi là config để lưu trữ tệp thuộc tính cho tôi thực hiện thay đổi trong tệp này mà không cần thay đổi tệp thuộc tính sẽ nằm trong tệp jar được đóng gói trong thư mục cấu hình. –

+0

Tôi đã có yêu cầu đó và tôi đã kết thúc việc sửa đổi plugin cục bộ trước khi đôi khi, tôi nên có yêu cầu kéo, Bạn cần thêm gì vào các mục đường dẫn lớp ngoài phụ thuộc? –

+0

Ví dụ: bên trong bình tôi có: - config/bioagents.properties Không khả thi cho người dùng mở tệp jar để thay đổi tệp thuộc tính. Như tôi thấy rằng chúng tôi có thể đặt một số phụ thuộc vào một tập tin bên ngoài, không được đóng gói trong một cái lọ, tôi muốn làm tương tự cho config/bioagents.properties. Đưa vào một thư mục bên ngoài (không được đóng gói trong tệp jar). Vì vậy, một người dùng đơn giản có thể thay đổi các thuộc tính của chương trình của tôi một cách dễ dàng. –