And*_*nea 16 java jar intellij-idea sqljdbc classnotfoundexception
我刚刚开始构建Java应用程序(我确实有.NET经验),我正在尝试构建一个小型测试应用程序,其整个代码是这样的:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在IDE(IntelliJ IDEA 12.1.6社区版)中运行该应用程序,使SQL Server可用,该应用程序运行正常,它应该做到这一点.
SQL Server驱动程序从Microsoft下载并添加为外部库.我已经创建了一个工件作为JAR文件:

现在,如果我在cliTest.jar(我的JAR)中包含sqljdbc4.jar,则生成的JAR很胖(550kB并且也包含该JAR中的类).或者我可以排除它.无论哪种方式,跑步
java -jar cliTest.jar
Run Code Online (Sandbox Code Playgroud)
结果是
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
Run Code Online (Sandbox Code Playgroud)
我打赌我错过了一些非常基本的东西,但我无法弄清楚究竟是什么导致了这一点.
LE1:我尝试添加sqljdbc4.jar(尽管似乎没有必要)和sqljdbc_auth.dll在包含JAR的目录中但仍然没有变化.
后来编辑2:根据尼古拉的回答我做了以下事情:


..并且结果如下:

构建 - >构建工件 - > cliTest.jar - >重建
CMD提示符包含以下文件夹:
[生成cliTest.jar 566 KB]
java -jar 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)
Run Code Online (Sandbox Code Playgroud)
好吧,我应该在没有嵌入 sqljdbc4.jar 的情况下构建 JAR。
第二件事我应该像这样运行命令:
java -classpath sqljdbc4.jar;cliTest.jar com.company.Main
Run Code Online (Sandbox Code Playgroud)
..然后一切正常!
使用java -cp代替java -jar并将所有依赖项jar放入类路径。
另一种方法是将所有依赖项打包到单个jar中,从而允许您使用来运行应用程序java -jar。
编辑:
在Java中,*。jar文件包含大量类。通常,在构建自己的应用程序时,结果jar文件仅包含您的类,但仍然必须从您使用的外部库(所谓的依赖项)中加载类。
可以通过两种不同的方法来完成:
您为应用程序创建了一个文件夹,例如,名为lib并将应用程序jar和所有依赖项放入其中。然后你使用运行应用程序java -cp lib:/\* com.company.Main或(感谢@NilsH,我错过这个变体)你让MANIFEST.MF文件并指定Main-Class与Classpath所描述的属性里面点击这里
您可以使用特殊工具(如果使用maven进行构建,则可以使用诸如maven-dependency-plugin之类的工具)来打包所有类,这些类可以是您自己的,也可以是单个jar外部的。您有一个大文件,可以使用运行它java -jar cliTest.jar。
通常,首选第一种方法,并且使用MANIFEST.MF文件是一种很好的形式。
| 归档时间: |
|
| 查看次数: |
34067 次 |
| 最近记录: |