ClassNotFoundException lors de l'exécution POT, pas d'erreurs lors de l'exécution dans IntelliJ IDEA
Je viens juste de commencer à construire des applications Java (j'ai .NET de l'expérience) et j'étais en train de construire une petite application de test, dont l'ensemble du code est: est-ce
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();
}
}
Si je lance l'application dans l'IDE IntelliJ IDEA 12.1.6 Community Edition), ayant le code SQL Server disponible, l'application fonctionne très bien en train de faire exactement ce qu'il devrait.
Le Pilote SQL Server est téléchargé à partir de Microsoft et ajouté comme une Bibliothèque Externe. J'ai créé un artefact en tant que fichier JAR :
Maintenant, si je comprend l'sqljdbc4.jar dans le cliTest.jar (mon POT) l'a entraîné POT de graisse (550kB et comprend les classes dans ce POT trop). Ou je peut l'exclure. De toute façon, la course
java -jar cliTest.jar
Résultats dans
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
Je parie que je suis absent quelque chose d'assez basique, mais je ne peux pas comprendre ce qui exactement qui est à l'origine.
LE1 : j'ai essayé d'ajouter sqljdbc4.jar (bien qu'il ne semblait pas nécessaire) et sqljdbc_auth.dll dans le répertoire contenant le POT mais toujours pas de changement.
Plus tard edit 2 : sur la Base des Nikolay réponse, j'ai effectué les opérations suivantes :
- Supprimé l'artefact existants
- Créé un nouvel artefact comme suit :
.. et a abouti à ceci :
-
Build -> Construire des artefacts -> cliTest.jar -> Reconstruire
-
Invite de CMD dans le dossier contenant :
[cliTest.jar 566 KO a été généré]
java-jar cliTest.jar
Maintenant, je reçois :
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)
OriginalL'auteur Andrei Rînea | 2013-11-03
Vous devez vous connecter pour publier un commentaire.
Utilisation
java -cp
au lieu dejava -jar
et mettez vous tous dépendances pots de classpath.Une autre façon est d'pack toutes les dépendances pour seul bocal, vous permettant d'exécuter l'application à l'aide de
java -jar
.EDIT:
En Java *.jar fichier contient un ensemble de classes. Lorsque vous créez votre propre application, généralement, le résultat de fichier jar contient seulement des classes, mais encore à la charge des classes à partir de bibliothèques externes que vous utilisez (soi-disant dépendances).
Il peut être fait de deux manières différentes:
Vous créer un dossier de votre application, par exemple, a appelé
lib
et le lieu de votre application jar et toutes les dépendances. Ensuite, vous exécutez l'application à l'aide dejava -cp lib:/\* com.company.Main
ou (merci @NilsH, je m'ennuie de cette variante de), vous faites desMANIFEST.MF
fichier et spécifiezMain-Class
etClasspath
attributs à l'intérieur comme décrit iciVous utilisez l'outil spécial (comme maven-dépendance-plugin si vous utilisez maven pour construire) pour le conditionnement de toutes les classes, que ce soit votre propre, soit externe à un seul pot. Vous en avez un énorme fichier et de les exécuter à l'aide de
java -jar cliTest.jar
.Généralement, la première approche est privilégiée et à l'aide d'un
MANIFEST.MF
fichier est une bonne forme.Oui, j'ai expliqué ma réponse.
Je suis en désaccord. La "bonne" façon de construire un exécutable jar est de disposer d'un MANIFESTE.MF fichier dans le répertoire META-INF du fichier jar et de l'exécuter avec
java -jar
. LeMANIFEST.MF
fichier doit contenir des entrées pour le dépendant pots dans uneClass-Path
section, en plus de laMain-Class
attribut du manifeste.Pas dans tous les cas. Certains gros projets à l'aide de
java -cp
. Par exemple, Apache Tomcat commence avecjava -classpath
, mais JBoss AS7 utilisationjava -jar
. PS: j'ai ajouté cette suggestion de réponse.Je vais venir avec un montage en 2 minutes!
OriginalL'auteur Nikolay
Bien je devrais avoir construit le POT sans le sqljdbc4.jar incorporé.
La deuxième chose que je devrais avoir exécuté la commande comme suit :
.. et puis tous travaillé!
Oui, je n'ai coup d'œil à la charge de la fiole (sqljdbc4.jar) mais en essayant de emved dans ma entraîné POT donnerait la SecurityException comme dans la dernière partie de la question. Je suppose que le POT qui était intégré a été signé et de l'englobant un pas ... ou quelque chose comme ça.
Oui, si vous incorporez un tous les fichiers et signée d'un pot dans un grand bocal, la signature peut causer des problèmes. Vous pouvez supprimer le META-INF/*.SF, META-INF/*.DSA et META-INF/*.RSA fichiers pour se débarrasser de la signature.
OriginalL'auteur Andrei Rînea
Eh bien, si vous utilisez maven, vous pouvez utiliser maven-ombre-plugin pour inclure dépendante pot en exécutable jar l'extrait de l'pom.xml est donnée ci-dessous.
OriginalL'auteur neeraj tiwari