繁体   English   中英

Maven:如果我不知道客户端将使用哪个数据库,如何创建正确的JDBC驱动程序依赖关系?

[英]Maven: How to create a correct JDBC driver dependency, if I don't know which database the client will use?

我目前正在学习使用Maven,我了解如何使用Maven存储库中的依赖项创建Maven项目-现在我有以下问题:

如果我有一个使用数据库访问(例如通过Hibernate)的应用程序,那么我需要添加一个代表相应数据库驱动程序的依赖项,例如MySql的mysql-connector-java,Oracle的ojdbc等。

但是,如果我希望程序在其他计算机上运行并且不知道它使用的是什么数据库引擎,该怎么办? 解决此问题的常用方法是什么? 只需将所有可能的驱动程序导入为依赖项? 还是有一种更优雅的方式?

使用Hibernate之类的ORM(对象关系映射)是最好的解决方案,因为您编写的Java代码将由Hibernate解释并转换为SQL查询。

在某个时候,您将必须决定要使用哪个数据库,然后必须添加驱动程序。

另一个解决方案是使用Maven为不同的环境进行配置: https : //maven.apache.org/guides/mini/guide-building-for-different-environments.html

问题不是特别受行家约束。 每当移动到新数据库时,管理员都必须根据数据库使用正确的JDBC驱动程序,是的,它需要不同的jar文件。

事实是,您不想将数据库jar文件与代码捆绑在一起。 它可能已经存在(例如,在应用程序服务器中),或者您可以指定在安装过程中将其删除的路径。

假设您正在创建一个Web应用程序。 如果将war文件与maven捆绑在一起,它将包含war文件中的所有依赖关系,因此必须指定在编译和测试期间存在依赖关系,但不在任何软件包中。 这样做的方法是通过指定提供

<dependency>
  <groupId>some.db</groupId>
  <artifactId>jdbc-driver<artifactId>
  <scope>provided</scope>
</dependency>

这意味着jar文件将存在于目标平台上,因此不应打包在任何捆绑软件中。

所以我的假设确实是,这是一个网络应用程序吗? 还是独立的? 无论如何,希望能有所帮助。

您根本不需要依赖项。 您需要的是一个在运行时可用的驱动程序。 确实,做到这一点的一种方法是使用依赖项,但是如果您不知道数据库,则无法将其中的所有内容真正捆绑在一起。 您可以坚持使用一些最常见的驱动程序,但随后会出现许可问题。

如果您正在谈论Web应用程序,则可以告诉用户获取适当的驱动程序并配置该软件使用的JNDI数据源。 这是过去的/曾经的标准,但是它假定该应用程序是一个Web应用程序,并且最终用户知道如何配置(尽管如果他不这样做,他可能不应该在操作系统中设置系统)。第一名)。

对于使用本地数据库的独立程序,您可以轻松选择使用内存数据库,例如H2,而不允许任何其他数据库。 当然,这种情况并不适用于所有情况,但我将其作为示例。 无论如何,它都可以归结为与webapp相同。 让最终用户获得正确的驱动程序。 如果他们正在运行数据库服务器和您的应用程序,那么他们也应该能够找到正确的驱动程序。 然后,只需确保它包含在运行时类路径中,这可能会有点困难。

例如,通过SquirrelSQL完成此操作的方法是显式选择驱动程序,如下图所示。 当然,这再次意味着用户需要了解他在做什么。

在此处输入图片说明

我假设您希望一切都自动进行,并且您并不太急于指导每个用户/机器管理员如何配置系统以使您的应用程序正常运行。 恐怕不可能以您希望的方式实现。

Kayaman建议的独立数据库解决方案可能是您所用的最佳解决方案,但在不知情的情况下很难说。

但是,这里有一些有关使用maven方面以及一些注意事项可能存在的困难。

如果我有一个使用数据库访问(例如通过Hibernate)的应用程序,那么我需要添加一个代表相应数据库驱动程序的依赖项,例如MySql的mysql-connector-java,Oracle的ojdbc等。

是。 而且您还需要告诉hibernate有关该Driver以及其他可能相关的内容。 它不仅增加了依赖关系,而且还过滤了一些支持文件或persistence.xml。 对于maven及其某些插件而言,这可能是一项工作。 但是,仍然需要掌握所有可能的数据库替代方案和Maven配置文件的知识,以便每个替代方案和Maven配置文件来处理它们。

但是,如果我希望程序在其他计算机上运行并且不知道它使用什么数据库,该怎么办? 解决此问题的常用方法是什么? 我有什么选择? 只需将所有可能的驱动程序导入为依赖项? 有没有更优雅的方式?

所有程序都具有依赖性。 是否与数据库有关。 在某种意义上,正如其他答案所暗示的,这并不是maven特有的(但还是很相关的!)。 如果您确实想在JDBC驱动程序级别上进行开发,则需要了解任何环境的要求。

我相信,您的这个特定问题是开发类似以下内容的动力:

注意1甚至是类似的命名ODBC&JDBC都完全处于不同的级别(我的意思是找到JDBC驱动程序的方法,这实际上可能是主要问题...)

注2: JNDI不限于数据源

但是,根据您的需求, maven可能会提供很大的帮助,并最终决定要做什么。 但是,如果可以使用ODBC / JNDI,则作用不大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM