2011-12-15 34 views
9

Tôi có một ứng dụng nhỏ với RemoteActors, và tôi muốn tạo một tệp jar từ nó. Khi tôi cố gắng thực thi nó, ngoại trừ trường hợp này:NoClassDefFoundError khi chạy tập tin Scala jar

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.lang.NoClassDefFoundError: scala/actors/Combinators 
    at pingpong.PingApp$.main(PingApp.scala:5) 
    at pingpong.PingApp.main(PingApp.scala) 
    at pingpong.ScalaEntryPoint.main(ScalaEntryPoint.java:5) 
    ... 5 more 
Caused by: java.lang.ClassNotFoundException: scala.actors.Combinators 
    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 java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    ... 8 more 

Tôi đã bao gồm thư viện scala-library.jar trong tệp jar của tôi và nó nằm trong đường dẫn lớp. Nếu không java sẽ dừng lại ở việc tìm kiếm lớp ScalaObject.

+0

Thông tin thời gian chạy khác sẽ là tốt. Bạn đang cố gắng để xây dựng một cái lọ với Maven? Hoặc chỉ chạy nó với Eclipse? – hellectronic

+1

Tối thiểu, hiển thị dòng lệnh mà bạn đã gọi và đề cập đến phiên bản Scala bạn đang sử dụng. – retronym

+0

lệnh: java -jar myjar.jar Tôi đang sử dụng scala 2.7.7 final – laci37

Trả lời

1

Sự cố là phiên bản không khớp giữa plugin Scala trên Eclipse và phiên bản Scala đã cài đặt. diễn viên/Combinators.scala xuất hiện trong 2,8, và các plugin Eclipse là 2,8 tuy nhiên tôi bao gồm 2.7.7 scala-library.jar

4

Java không xử lý "jar trong bình". Trình nạp lớp mặc định không thể tải các lớp theo cách đó.

Từ stacktrace của bạn, có vẻ như bạn đã sử dụng xuất của eclipse-> java-> jar chạy được. Nó có nghĩa vụ phải bao gồm một bộ nạp lớp đặc biệt mà xử lý jar trong tải jar nhưng có vẻ như không hoạt động.

Tôi đoán rằng đã xảy ra sự cố khi xây dựng bình hoặc bị nhầm lẫn bởi scala được đưa vào trong lọ và đường dẫn lớp của bạn. Bạn có thể thử lại bằng cách sử dụng "trích xuất các thư viện vào jar" thay vì "thư viện gói vào jar". Bạn có thể thử nó mà không có scala trên classpath.

Không mà có những lựa chọn khác nếu bạn muốn có một jar shippable duy nhất:

  • Bạn có thể giải nén tất cả các lọ bạn phụ thuộc vào và đóng gói lại với các lớp học biên soạn của bạn (nên được những gì "trích xuất" làm ở trên). Plugin shade của Maven có thể trợ giúp về điều này.

  • Bạn có thể sử dụng một giải pháp khác nhau mà sẽ cung cấp một thực hiện classloader có thể tải lọ lồng nhau, như OneJar

Hy vọng điều này rất hữu ích nếu bạn cần thêm trợ giúp bạn cần phải mô tả chính xác những gì các bước bạn lấy sản phẩm này, và có lẽ đầu ra của "jar tvf myjar.jar" cũng sẽ giúp ích.

+0

Tôi đã cố gắng trích xuất thư viện scala vào tệp jar nhưng kết quả là ngoại lệ tương tự. Có vẻ như không có lớp scala.actors.Combinators trong scala-library.jar – laci37

+0

Bạn có thể chạy "jar tvf myjar.jar" và đảm bảo rằng scala-lang được hiển thị như đang ở trong đó không? Nếu đúng như vậy, trích xuất (jar xvf) myjar.jar vào một thư mục tạm thời và sau đó kiểm tra tệp scala-lang.jar có cùng cách không? –

+0

jar tvf ping.jar | grep scala-lang không có kết quả. Tôi trích xuất bình và không tìm thấy bất kỳ tập tin có tên scala-lang. – laci37

Các vấn đề liên quan