2012-03-06 115 views
0

我有一个Maven 3项目,该项目使用Hibernate 3.在Hibernate属性文件中,有对hibernate.connection.provider_class与对应C3P0连接提供商(org.hibernate.connection.C3P0ConnectionProvider)类条目。显然,这个类只在运行时使用,所以我不需要在编译范围中添加我的POM中相应的依赖项。现在,我想给出使用任何连接池框架的可能性,,所以我也不会将运行时依赖添加到POM运行时依赖关系(例如连接池)和类路径?

最佳做法是什么?

我考虑添加到对应于运行时依赖性类路径中的条目(在这种情况下,休眠-C3P0)在应用程序运行时(例如,使用命令行)。但是,我不知道这是否可能。

这与SLF4J差不多(可能是完全相同)的问题。我不知道Hibernate是否也使用门面模式进行连接池。

感谢

+0

任何解决方案..? – 2012-03-07 15:31:22

回答

2

因为您的代码不依赖于连接池(既不是主码也不是测试需要的话),没有一点提到任何地方的依赖。

如果有人提到它,那么这将是休眠,因为Hibernate提供在其配置此功能。

但是你可以用optional: true添加到您的POM来表示:

  1. 我支持此功能
  2. 如果你使用它,那么我建议这个框架和这个版本

那将使您的项目的消费者的生活变得更简单。提供

但总体来说,你不应该提到的功能/其他项目需要,除非它们对你的代码有一定影响(当你提供一个更简单的方法来配置连接池的Hibernate等)。

[编辑]您的主要担心可能是如何配置项目的质量保证。这个新机芯的技术术语是“DevOps” - 与客户(QA)必须艰苦配置的转储WAR不同,配置是开发过程的一部分,就像所有其他产品一样。你传递的是一个完全配置的,随时可用的设置。

要实现这一点,创建一个名为“项目 -qa”另一个Maven的模块,它取决于你的项目和一切你需要把死代码到运行的应用程序(所以这将取决于DBCP,再加上它会含有所有必要的配置文件)。

Maven的支持overlayed WARs,让您可以顺利地实现这一点。

+1

我的项目不是图书馆。当我发布它时,QA可能会开始测试它。但是,hibernate-c3p0依赖不在程序集中,因为我不想强制他们使用c3p0作为连接池框架。如果我使用可选范围声明对c3p0的依赖关系,它有什么用处? – 2012-03-08 15:50:07

+0

在这种情况下,它没有。对于像Hibernate这样的库和框架更有用。在你的情况下,QA必须知道如何正确设置Hibernate。 – 2012-03-08 15:59:12

+0

但是,因为如果QA选择使用C3P0连接池,Hibernate可能需要hibernate-c3p0 JAR,那么它对类路径的工作方式如何?如果我没有在POM中声明C3P0依赖项,那么JAR将不在类路径中。 – 2012-03-08 18:16:40

0

你可以使用不同的配置文件为每个连接提供商。在每个配置文件中,将运行时依赖关系与您要使用的连接提供程序对应,并相应地更改hibernate.connection.provider_class属性。

有关如何在配置文件中配置的依存关系,请参阅Different dependencies for different build profiles in maven更多细节。

要了解如何改变hibernate.connection.provider_class属性的值看How can I change a .properties file in maven depending on my profile?

+0

该解决方案不能帮助我,因为在生产决定使用其他连接池框架的情况下,项目必须重新编译(以便重新过滤属性文件并添加所需的运行时依赖项)。不管怎么说,还是要谢谢你。 – 2012-03-08 12:51:41

+0

你使用什么样的包装? JAR,WAR ...? – 2012-03-08 12:59:21

+0

JAR和WAR。它关系到数据库访问,我独立和访问数据库的Web应用程序。 – 2012-03-08 14:00:16

1

您可以标记你的依赖作为optional。在这种情况下,它不会被打包成档案。在这种情况下,您必须确保您的容器提供了所需的库。

+0

如果编译时不需要依赖关系,并且您将委托给容器提供它的责任,那么没有理由在您的pom中声明依赖关系,甚至没有可选的 – 2012-03-08 13:34:23

+0

@Fabrice:true,但是出于测试和开发的目的建议这样做。 – tom 2012-03-08 14:17:06

+1

+1“可选”意味着您的代码可以利用这一点,这反过来又使您的项目消费者更容易正确配置其POM。 – 2012-03-08 14:39:01

相关问题