Tôi đã tạo một ứng dụng tự động tải xuống dữ liệu thời tiết và thêm dữ liệu này cho một vị trí cụ thể vào cơ sở dữ liệu. Ứng dụng hoạt động như mong đợi trong IntelliJ
Bây giờ tôi muốn chạy ứng dụng này dưới dạng ứng dụng độc lập. Vì vậy, tôi đã tạo một cái bình bằng Maven. Bình này là một bình "tối thiểu" không có tất cả các phụ thuộc. Các phụ thuộc được xuất ra một thư mụclib
. Cấu hình plugin maven là:
org.apache.maven.plugins
maven-jar-plugin
đúng
lib/
nl.wur.fbr.data.weather.WeatherData
${project.build.directory}/WeatherData
org.apache.maven.plugins
maven-dependency-plugin
cài đặt bản sao phụ thuộc ${project.build.directory}/WeatherData/lib đúng đúng đúng |
Đường dẫn lớp được thêm vào danh sách (tôi đã kiểm tra) và tất cả các phụ thuộc đều được xuất ra thư mục lib.
Khi tôi chạy ứng dụng này trên Mac (phiên bản Java 1.8.0), mọi thứ đều hoạt động tốt. Nhưng khi tôi chạy nó trên máy chủ Linux (sau khi nén và giải nén cũng như chạy Java 1.8.0), tôi gặp lỗi sau:
$ java -jar WeatherData-1.0-SNAPSHOT.jar
Lỗi: Đã xảy ra lỗi JNI, vui lòng kiểm tra cài đặt của bạn và thử lại
Ngoại lệ trong luồng "chính" java.lang.NoClassDefFoundError: nl/wur/fbr/om/factory/InstanceFactory
tại java.lang.Class.getDeclaredMethods0 (Phương thức gốc)
tại java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
tại java.lang.Class.privateGetMethodRecursive(Class.java:3048)
tại java.lang.Class.getMethod0(Class.java:3018)
tại java.lang.Class.getMethod(Class.java:1784)
tại sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
tại sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Nguyên nhân do: java.lang.ClassNotFoundException: nl.wur.fbr.om.factory.InstanceFactory
tại java.net.URLClassLoader.findClass(URLClassLoader.java:381)
tại java.lang.ClassLoader.loadClass(ClassLoader.java:424)
tại sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
tại java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 thêm
Thông thường là sự cố về đường dẫn lớp, nhưng tại sao nó lại hoạt động khác nhau trên macOS và Linux? Tệp jar chính (danh sách chứa đường dẫn lớp) và thư mục lib giống nhau.
Tôi không chắc chính xác điều gì đang gây ra sự cố này nhưng các bước dưới đây có thể giúp thu hẹp đường dẫn.
Bước 1 : Xác minh tệp lớp nl.wur.fbr.om.factory.InstanceFactory có trong jar
Bước 2: Xác minh tệp MANIFEST.MF và kiểm tra các mục sau -
ví dụ: Lớp chính: nl.wur.fbr.data.weather.WeatherData
Đường dẫn lớp:
../config/
lớp12.jar
bc4jct.jar
bc4jdomorcl.jar
bc4jmt.jar
commons-beanutils-bean-collections.jar
commons-beanutils-core.jar
Bước 3: Xác minh mục jar có trong Đường dẫn lớp
Bước 4: Nếu sự cố vẫn tiếp diễn, hãy thử chạy với tùy chọn java -classpath.
Tôi là một lập trình viên xuất sắc, rất giỏi!