为使用MySQL和SQLServer的项目创建uberjar

时间:2013-02-20 10:12:12

标签: java jdbc jar clojure leiningen

我正在尝试在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)

2 个答案:

答案 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函数调用的命名空间中。