在使用SQL Server JDBC时出现"NoClassDefFoundError: javax/xml/bind/DatatypeConverter"错误

5

我最近切换到了Intellij,但是我发现很难连接到我的本地数据库。相同的代码在eclipse上运行良好。 另外,我已经将sqljdbc42.jar添加为模块依赖项。

package com.enter;
import java.sql.*;

public class SqlConnect {
    private String username, password, url;
    public Connection conn;

    public SqlConnect() {
        username = "user=admin;";
        password = "password=admin";
        url = "jdbc:sqlserver://Bossman-PC\\SQL2014TRAINING;databaseName=EnterDB;";
        Connect();
    }
    public SqlConnect(String user, String pass) {
        username = user;
        password = pass;
        url = "jdbc:sqlserver://Bossman-PC\\SQL2014TRAINING;databaseName=EnterDB;";
        Connect();
    }

    public void Connect() { //Loads sql driver and creates a connection object with local database
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String connectionUrl = url + username + password;
            conn = DriverManager.getConnection(connectionUrl);
            System.out.println("Connected.");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() {
        return conn;
    }


}

产生的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4098)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3160)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:43)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3123)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7505)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2445)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1981)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1628)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1459)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:773)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1168)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:678)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:252)
at com.enter.SqlConnect.Connect(SqlConnect.java:25)
at com.enter.SqlConnect.<init>(SqlConnect.java:12)
at com.enter.Login.makeConnection(Login.java:26)
at com.enter.Login.<init>(Login.java:16)
at com.enter.Execute.initLogin(Execute.java:14)
at com.enter.Execute.main(Execute.java:9)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 19 more

Process finished with exit code 1

非常感谢您的帮助。我也尝试过使用重载的DriverManager.getConnection(url, user, pass)方法,但是仍然出现了相同的错误。


你最近是否也切换到使用Java 9了? - Gord Thompson
你的Intellij使用了哪个编译器?当我切换到Intellij后,我的项目“语言级别”总是设置为1.5。打开“模块设置”并更改为正确的语言级别应该会有所帮助。 - Haifeng Zhang
是的,我有Java 9 JDK和sqljdbc42作为模块依赖。 - J.Johnson
@haifzhan 在语言级别9上尝试过,也尝试了语言级别8,但仍然出现相同的错误信息。这是项目的视图 https://gyazo.com/17ff5d773ea99e79458393042c883f78 - J.Johnson
你将JDK 9用作模块/项目JDK吗? - y.bedrov
相关链接:https://dev59.com/TFcP5IYBdhLWcg3w8uhi - Mark Rotteveel
3个回答

7

为了与Java 9+兼容,您需要使用版本号为6.4.0或更高版本的Java版本,该版本由jreXX版本后缀标识。使用低于或等于您Java版本的最高版本。


之前的答案

正如微软在GitHub上指出的那样:

目前我们发布的驱动程序Jars都不兼容JDK9。

你可以切换到使用Java 8 JDK,或者将微软的开发代码从他们的“JDBC4.3”分支合并到你的项目中,并使用Java 9 JDK。


非常感谢。无论更改语言模式到8,Java 9 JDK都无效。切换到Java 8 JDK可以毫无问题地工作。 - J.Johnson
谢谢。Gord。我该如何将位于 https://github.com/Microsoft/mssql-jdbc/tree/JDBC4.3?files=1 的 MS 开发代码制作成 .jar 文件? - user1224441
@Ethan - 这里有一些可用的 JAR 包,可以从 GitHub Issue 帖子 这里 获取。他们还提到我们应该能够使用 Maven (mvn install) 构建 JAR 包。 - Gord Thompson
1
@GordThompson 我更新了你的答案,包括Java 9+版本已经发布。希望你不介意。 - Mark Rotteveel

3

如果你包含额外的jvm参数,就可以让它正常工作。

--add-modules=java.se.ee

在Intellij中的运行配置中可以找到此处

enter image description here

这个配置包括了多个模块,而在java9中这些模块已被标记为即将废弃以便在java10中移除,因此这只是一个临时解决方案,直到Microsoft发布与java9兼容的jdbc驱动程序。

有关更多信息,请参见Java9迁移指南


它给了我这个: java.lang.module.FindException: 找不到模块 java.se.ee - Yazid Erman

2
如果您有Maven构建,请将以下内容添加到您的pom.xml文件中。
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接