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)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage