4

我正在尝试在 clojure 中构建一个项目,该项目从 Microsoft SQL Server 数据库中获取数据,并将其推送到 MySQL 数据库。

该项目使用 lein run 运行良好,但是当我使用 leiningen 将其打包到一个 uberjar 中并使用 java -jar 运行它时,它失败了:

线程“主”java.sql.SQLException 中的异常:找不到适合 jdbc:sqlserver 的驱动程序....

此错误仅在我尝试同时使用 MySQL 数据库和 SQL Server 数据库时发生。如果我单独使用其中任何一个,则 jar 文件使用 java -jar 运行良好。

我的 project.clj 如下:

(defproject sqlserver-clojure "1.0.0-SNAPSHOT"
  :description "A minimal example of the MySQL/SQLServer conflict"
  :dependencies [[org.clojure/clojure "1.4.0"]
             [com.microsoft/sqljdbc4 "3.0"]
             [clojureql "1.0.4"]
             [mysql/mysql-connector-java "5.1.6"]]
  :main sqlserverclojure.core)
4

2 回答 2

4

问题很可能是在制作 uber-jar 时,您没有复制.properties驱动程序所需的某些文件(例如 XML 配置),或者您正在覆盖两个 JDBC 驱动程序中存在的文件。

覆盖的一个很好的例子是META-INF/services/java.sql.Driver所有 JDBC 4 驱动程序都有的文件。此文件包含 jar 实现中所有类的列表java.sql.Driver,以便java.sqlDriverManager该类可以使用ServiceLoader.

如果您使用多个 JDBC 驱动程序创建一个 uber-jar,您需要确保该文件包含所有这些文件的联合,或者您的应用程序需要Class.forName("<name of the java.sql.Driver implementation>")为每个所需的驱动程序显式加载您需要的驱动程序,而不依赖于 JDBC 4 驱动程序自动加载。

Also verify that the process you use to create the uber-jar copies all resources and not just .class files!

Better yet (in my opinion), don't use an uber-jar, but keep the dependent .jar files external and reference them in the Class-Path entry of the META-INF/MANIFEST.MF file of your application, this saves you a lot of hassle to get your uber-jar working correctly (or verify that it is actually working correctly).

于 2013-02-20T11:37:05.960 回答
1

Adding this for my own reference since I've not touched Java before and struggle with Java interop.

Add

(. Class (forName "com.microsoft.sqlserver.jdbc.SQLServerDriver"))

In the namespace with your jdbc clojure function calls.

于 2013-08-23T21:16:25.663 回答