JDBC 连接在 IDE (eclipse) 中有效,但在 .jar 文件中无效
Posted
技术标签:
【中文标题】JDBC 连接在 IDE (eclipse) 中有效,但在 .jar 文件中无效【英文标题】:JDBC connection works in IDE (eclipse), but not in .jar file 【发布时间】:2013-05-19 01:39:14 【问题描述】:我真的在这里看到了一个谜。我在 Eclipse 中创建了一个 Java 程序并建立了 JDBC 连接。代码如下:
import java.sql.*;
public class Login
public static void main(String[] args)
try
// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection connection = DriverManager
.getConnection("jdbc:sqlserver://localhost;databaseName=testdb; integratedSecurity=true;");
//adding port 1433 doesn't make a difference
System.out.println("Connection successful");
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("select * from testtable");
while (rs.next())
line = rs.getString(2);
catch (Exception e)
e.printStackTrace();
当我在 Eclipse 中运行它时,一切都很好。数据库和表都很好,Java Built Path中的库和身份验证都设置好了,我得到了我想要的结果,即“Hello World”,它是所选表中的一个字符串。
但创建可执行 JAR 文件并运行它会引发异常“此驱动程序未配置为集成身份验证”。它甚至没有连接,因此即使数据库中出现错误也无所谓。
更令人困惑的是,几周前,我还创建了一个可执行的 JAR 文件,并且它工作了!
操作系统:Windows Vista Home Premium x86
JDBC 驱动位置:“C:\sqljdbc_4.0\enu\sqljdbc4.jar”
本机库位置:“C:\sqljdbc_4.0\enu\auth\x86”
Java 版本:Java 7 Update 17 和 JDK 7 Update 17
之前,我使用的是 Update 21,但我改回来检查驱动程序是否可能是原因。
那么,有什么建议吗?不胜感激!
【问题讨论】:
您是否将系统属性“java.library.path”设置为您的 sqljdbc_auth.dll 的位置? “我希望这是一个 SSCCE” - 这会让其他人重现您的问题吗?如果不是,则不是 SSCCE。 如何执行jar? 关于SSCCE:如果人们复制粘贴代码,添加一些东西(即一个JFrame)以便他们可以在创建和执行JAR文件时看到问题,他们应该是能够看到问题。如果它不破坏简单性,我可以立即提供代码,所以人们真的只需要复制粘贴。关于sqljdbc_auth.dll:在添加的sqljdbc4.jar中,我将native library location设置为:"C:/sqljdbc_4.0/enu/auth/x86 "(当然存在) 横向建议:一定要用SQL server吗?对于作业,嵌入式数据库会更好地工作 【参考方案1】:检查eclipse的运行时类路径,然后尝试创建系统级“CLASSPATH”变量并添加相同的路径。设置变量后,在新的命令提示符下执行它或重新加载环境变量
确保您的可执行 jar 在 MANIFEST.MF 中具有所有必要 jar(以及 MainClass)的依赖项
最后,Java 中的惯例是在大写字母中制作第一个字母(“登录”而不是“登录”)
【讨论】:
好吧,关于“CLASSPATH”,我真的不知道该怎么办。我经常阅读“设置 CLASSPATH”,但没有人解释如何以及在哪里......而且,上面的代码应该只是一个 SSCCE。实际上,我正在构建一个 GUI,所以我希望看到的结果不是在命令行中,而是在 GUI 中。最后,我不知道在哪里设置 MANIFEST.MF ......所以看来,我要么错过了重要的事情,要么在不知道我做了什么的情况下设置了一些东西。请给我一些提示好吗? 您可以在命令提示符下使用set CLASSPATH
或在计算机->属性->高级系统设置->环境变量中设置环境(系统)变量
是否可以将类路径设置为非管理员?因为这可能非常重要,因为这个程序需要在我大学的计算机上运行。
不要设置系统范围的类路径。 这是一种糟糕的做法,正是因为它是一个令人头疼的部署。使用正确调用java -cp <the classpath> <everything else>
的启动器脚本,或者在可执行文件中使用带有Class-Path:
标头的MANIFEST.MF
文件,或者使用Maven shade plugin 或@987654322 将所有需要的类捆绑到JAR 中@
此外,网络上可能有大量结果,因此“class-path manifest.mf”可以告诉您需要将什么放在哪里。【参考方案2】:
实际的问题是,如果你从 Eclipse 运行你的项目,它会自动添加在运行/运行配置//参数中定义的运行参数,所以你运行你的程序时正确设置了 sqljdbc_auth.dll 的路径。但是,如果您将应用程序导出到 .jar 文件并运行它,您将收到这些错误,因为没有正确的类路径到 auth 文件。
因此,如果您使用正确的参数从命令行运行您的应用程序,它应该可以工作。
【讨论】:
这是一个 GUI 项目,这意味着它是一个 jar 文件,应该由用户通过单击它来执行。所以没有办法添加启动参数,是吗?以上是关于JDBC 连接在 IDE (eclipse) 中有效,但在 .jar 文件中无效的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse IDE for Java Developers(4.10.0)建立与SQL Server 2008数据库的连接