我正在尝试在clojure中构建一个从a中获取数据的项目 Microsoft SQL Server数据库,并将其推送到MySQL数据库。
该项目使用lein run运行良好,但当我将其打包成一个 uberjar使用leiningen,并使用java -jar运行它,它失败了:
线程“main”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)
答案 0 :(得分:2)
问题很可能在制作uber-jar时,你没有复制驱动程序所需的某些文件(例如.properties
或XML配置),或者你正在覆盖两个JDBC中都存在的文件驱动程序。
覆盖的一个很好的例子是所有JDBC 4驱动程序都有的META-INF/services/java.sql.Driver
文件。此文件包含实现java.sql.Driver
的jar中所有类的列表,以便java.sqlDriverManager
类可以使用ServiceLoader
自动加载所有驱动程序实现。
如果您创建一个包含多个JDBC驱动程序的超级jar,您需要确保此文件包含所有这些文件的并集,或者您的应用程序需要使用Class.forName("<name of the java.sql.Driver implementation>")
为每个驱动程序显式加载所需的驱动程序所需的驱动程序而不依赖于JDBC 4驱动程序自动加载。
同时验证用于创建超级jar的进程是否复制所有资源而不只是.class
个文件!
更好(在我看来),不要使用超级jar,但要将依赖的.jar
文件保留在外部,并在Class-Path
文件的META-INF/MANIFEST.MF
条目中引用它们在您的应用程序中,这可以为您的uber-jar正常工作(或验证它实际上是否正常工作)节省了很多麻烦。
答案 1 :(得分:1)
添加这个以供我自己参考,因为我之前没有触及Java并且难以使用Java互操作。
添加
(. Class (forName "com.microsoft.sqlserver.jdbc.SQLServerDriver"))
在带有jdbc clojure函数调用的命名空间中。