ClassNotFoundException beim Ausführen von JAR, keine Fehler beim Ausführen in IntelliJ IDEA
Ich habe gerade angefangen, Java-Apps zu erstellen (ich habe .NET-Erfahrung), und ich habe versucht, eine kleine Test-App zu erstellen, deren gesamter Code wie folgt lautet:
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();
}
}
Wenn ich die App in der IDE (IntelliJ IDEA 12.1.6 Community Edition) ausführe und der SQL Server verfügbar ist, funktioniert die App genau so, wie sie sollte.
Der SQL Server-Treiber wird von Microsoft heruntergeladen und als externe Bibliothek hinzugefügt. Ich habe ein Artefakt als JAR-Datei erstellt:
Wenn ich nun die Datei sqljdbc4.jar in die Datei cliTest.jar (meine JAR) einbinde, ist die resultierende JAR fett (550 kB und enthält auch die Klassen in dieser JAR). Oder ich kann es ausschließen. Wie auch immer, rennen
java -jar cliTest.jar
Ergebnisse in
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
Ich wette, ich vermisse etwas ziemlich Grundlegendes, aber ich kann einfach nicht herausfinden, was genau das verursacht.
LE1: Ich habe versucht, sqljdbc4.jar (obwohl es nicht notwendig schien) und sqljdbc_auth.dll in das Verzeichnis aufzunehmen, das die JAR enthält, aber immer noch keine Änderung.
Späterer Teil 2: Auf der Grundlage von Nikolays Antwort habe ich Folgendes getan:
Das vorhandene Artefakt wurde gelöschtErstellt ein neues Artefakt wie folgt:.. und ergab dies:
Erstellen -> Artefakte erstellen -> cliTest.jar -> Neu erstellen
CMD-Eingabeaufforderung im Ordner mit:
[cliTest.jar 566 KB wurde generiert]
java -jar cliTest.jar
Jetzt bekomme ich:
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)