Tôi chỉ mới bắt đầu xây dựng các ứng dụng Java (Tôi có trải nghiệm .NET) và tôi đang cố gắng xây dựng một ứng dụng thử nghiệm nhỏ có toàn bộ mã này:ClassNotFoundException khi chạy JAR, không có lỗi khi chạy trong IntelliJ IDEA
package com.company;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws SQLException {
System.out.println("Buna lume!");
SQLServerDataSource ds = new SQLServerDataSource();
ds.setIntegratedSecurity(true);
ds.setServerName("localhost");
ds.setPortNumber(1433);
ds.setDatabaseName("Test");
Connection con = ds.getConnection();
String SQL = "SELECT * FROM Test WHERE ID = ?";
PreparedStatement stmt = con.prepareStatement(SQL);
stmt.setInt(1, 2);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + ", " + rs.getString(2));
}
rs.close();
stmt.close();
con.close();
}
}
Nếu tôi chạy ứng dụng trong IDE (IntelliJ IDEA 12.1.6 Community Edition), có SQL Server khả dụng, ứng dụng chạy tốt làm chính xác những gì cần.
Trình điều khiển máy chủ SQL được tải xuống từ Microsoft và được thêm làm Thư viện bên ngoài. Tôi đã tạo ra một artifact như tập tin JAR:
Bây giờ, nếu tôi bao gồm các sqljdbc4.jar trong cliTest.jar (JAR của tôi) JAR dẫn là chất béo (550kB và bao gồm các lớp trong JAR quá). Hoặc tôi có thể loại trừ nó. Dù bằng cách nào, chạy
java -jar cliTest.jar
Kết quả trong
Buna lume!
Exception in thread "main" java.lang.NoClassDefFoundError: com/microsoft/sqlserv
er/jdbc/SQLServerDataSource
at com.company.Main.main(Main.java:15)
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLSer
verDataSource
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
Tôi đặt cược tôi là thiếu một cái gì đó khá cơ bản nhưng tôi chỉ không thể tìm ra chính xác những gì đang gây ra này.
LE1: Tôi đã thử thêm sqljdbc4.jar (mặc dù nó không có vẻ cần thiết) và sqljdbc_auth.dll trong thư mục chứa JAR nhưng vẫn không thay đổi.
Sau đó chỉnh sửa 2: Dựa trên câu trả lời Nikolay của tôi đã thực hiện như sau:
- Deleted artifact hiện
- Tạo một artifact mới như vậy:
.. a nd dẫn này:
Build -> Build hiện vật -> cliTest.jar -> Rebuild
CMD Prompt tại thư mục chứa:
[cliTest.jar 566 KB được tạo]
java -jar cliTest.jar
Bây giờ tôi nhận được:
Exception in thread "main" java.lang.SecurityException: Invalid signature file d
igest for Manifest main attributes
at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)
at sun.security.util.SignatureFileVerifier.process(Unknown Source)
at java.util.jar.JarVerifier.processEntry(Unknown Source)
at java.util.jar.JarVerifier.update(Unknown Source)
at java.util.jar.JarFile.initializeVerifier(Unknown Source)
at java.util.jar.JarFile.getInputStream(Unknown Source)
at sun.misc.URLClassPath$JarLoader$2.getInputStream(Unknown Source)
at sun.misc.Resource.cachedInputStream(Unknown Source)
at sun.misc.Resource.getByteBuffer(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Đây là một cách. Nhưng việc nhúng mọi tập tin lớp vào một cái bình cũng sẽ hoạt động. Lưu ý rằng tệp jar thực sự là tệp zip, vì vậy bạn luôn có thể mở chúng và xem bên trong để xem liệu chúng có chứa tất cả các lớp hay không. – lbalazscs
Có, tôi đã nhìn trộm trong JAR phụ thuộc (sqljdbc4.jar) nhưng cố gắng để đẩy nó vào kết quả JAR của tôi sẽ mang lại SecurityException như trong phần cuối của câu hỏi. Tôi đoán JAR đã được nhúng đã được ký kết và bao gồm một không ... hoặc một cái gì đó như thế. –
Có, nếu bạn nhúng tất cả các tệp của một lọ đã ký vào một cái lọ lớn, chữ ký có thể gây ra vấn đề. Bạn có thể xóa các tệp RSA META-INF/*. SF, META-INF/*. DSA và META-INF/* .Để loại bỏ chữ ký. – lbalazscs