我试图在clojure中构建一个项目,该项目从数据库获取数据,并将其推送到MySQL数据库。
该项目使用lein运行良好,但当我使用leiningen将其打包到uberjar并使用java -jar运行它时,它将失败:
线程“主”java.sql.SQLException中的异常:没有为jdbc:sqlserver找到合适的驱动程序。
此错误仅在尝试同时使用MySQL数据库和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)发布于 2013-02-20 11:37:05
问题很可能是,在生成uber-jar时,您没有复制驱动程序所需的某些文件(例如.properties或XML配置),或者您正在覆盖这两个JDBC驱动程序中存在的文件。
覆盖的一个很好的例子是所有JDBC4驱动程序都拥有的META-INF/services/java.sql.Driver文件。该文件包含实现java.sql.Driver的jar中所有类的列表,以便java.sqlDriverManager类可以使用ServiceLoader自动加载所有驱动程序实现。
如果您使用多个JDBC驱动程序创建一个uber-jar,您需要确保该文件包含所有这些文件的合并,或者您的应用程序需要为每个必需的驱动程序显式地使用Class.forName("<name of the java.sql.Driver implementation>")加载所需的驱动程序,而不依赖于JDBC 4驱动程序自动加载。
还要验证创建uber-jar的过程是否复制了所有资源,而不仅仅是.class文件!
更好的方法是(在我看来),不要使用uber-jar,而是将依赖的.jar文件保存在外部,并在应用程序的META-INF/MANIFEST.MF文件的Class-Path条目中引用它们,这样可以节省大量的麻烦来使uber-jar正常工作(或者验证它确实正常工作)。
发布于 2013-08-23 21:16:25
添加这些作为我自己的参考,因为我以前没有接触过Java,并且与Java互操作进行了斗争。
添加
(. Class (forName "com.microsoft.sqlserver.jdbc.SQLServerDriver"))在名称空间中使用jdbc函数调用。
https://stackoverflow.com/questions/14977228
复制相似问题