我刚刚开始构建Java应用程序(我确实有.NET体验),并且正在尝试构建一个小测试应用程序,其整个代码如下:ClassNotFoundException在运行JAR时,在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();
}
}
如果我在IDE(IntelliJ IDEA 12.1.6社区版)中运行该应用程序,使SQL Server可用,该应用程序运行良好,正是它应该做的。
SQL Server驱动程序从Microsoft下载并作为外部库添加。我已经创建了一个假象的JAR文件:现在
,如果我包括在cliTest.jar(我的JAR)所得到的JAR是脂肪(550KB的sqljdbc4.jar,包括在JAR中的类太)。或者我可以排除它。无论哪种方式,运行
java -jar cliTest.jar
结果
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
我敢打赌,我失去了一些东西很简单,但我无法弄清楚究竟是什么原因造成这一点。 LE1:我尝试在包含JAR的目录中添加sqljdbc4.jar(尽管看起来不需要)和sqljdbc_auth.dll,但仍然没有改变。
后来编辑2:基于尼古拉的答案,我已经做了以下内容:
- 删除现有的神器
- 创建一个新的神器,像这样:
.. a ND导致这样的:
生成 - >生成伪像 - > cliTest.jar - >重建
CMD提示在包含文件夹:
[cliTest.jar 566 KB生成]
Java的罐子cliTest.jar
现在,我得到:
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)
这是一种方法。但是,将每个类文件嵌入到一个jar中也应该可行。请注意,jar文件实际上是zip文件,因此您可以随时打开它们并查看它们是否包含所有类。 – lbalazscs
是的,我查看了依赖JAR(sqljdbc4.jar),但试图将它嵌入到我的结果JAR中,就会在问题的最后部分产生SecurityException。我猜想嵌入的JAR是被签名的,其中包含的JAR不是......或类似的东西。 –
是的,如果您将签名的jar文件的所有文件嵌入大容器中,签名可能会导致问题。您可以删除META-INF/* .SF,META-INF/* .DSA和META-INF/* .RSA文件以消除签名。 – lbalazscs