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数据库的连接

在eclipse里jdbc连接mysql 怎么安装

在Eclipse中使用JDBC连接数据库

JDBC连接后在Eclipse中执行准备语句后无法检索数据

在基于 Eclipse 的 IDE 中,如何通过两个 ssh 连接访问远程文件?

在 Eclipse JDBC ODBC 中连接数据库时出错,