首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为使用MySQL和SQLServer的项目创建一个uberjar

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

Stack Overflow用户
提问于 2013-02-20 10:12:12
回答 2查看 784关注 0票数 4

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

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

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

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

我的project.clj如下:

代码语言:javascript
复制
(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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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正常工作(或者验证它确实正常工作)。

票数 4
EN

Stack Overflow用户

发布于 2013-08-23 21:16:25

添加这些作为我自己的参考,因为我以前没有接触过Java,并且与Java互操作进行了斗争。

添加

代码语言:javascript
复制
(. Class (forName "com.microsoft.sqlserver.jdbc.SQLServerDriver"))

在名称空间中使用jdbc函数调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14977228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档