运行时依赖(例如连接池)和类路径?

时间:2012-03-06 15:24:33

标签: maven classpath

我有一个使用Hibernate 3的Maven 3项目。在Hibernate属性文件中,有一个hibernate.connection.provider_class条目,其中的类对应于C3P0连接提供程序(org.hibernate.connection.C3P0ConnectionProvider)。显然,这个类只在运行时使用,所以我不需要在编译范围内在POM中添加相应的依赖项。现在,我希望能够使用任何所需的连接池框架,所以我也不会向POM添加运行时依赖性

最佳做法是什么?

我考虑过在运行应用程序时(例如,使用命令行)向运行时依赖项(在本例中为hibernate-c3p0)中添加一个条目。但是,我不知道是否可能。

这几乎(也许是完全)与SLF4J相同的问题。我不知道Hibernate是否也使用Facade模式进行连接池化。

由于

3 个答案:

答案 0 :(得分:2)

由于您的代码不依赖于连接池(主代码和测试都不需要它),因此无需在任何地方提及依赖性。

如果有人提起它,那就是Hibernate,因为Hibernate在其配置中提供了这个功能。

但您可以使用optional: true将其添加到您的POM中,以表明:

  1. 我支持此功能
  2. 如果你使用它,那么我推荐这个框架和这个版本
  3. 这将使您的项目的消费者的生活稍微简单。

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

    [编辑] 您主要担心的是如何为QA配置项目。这项新运动的技术术语是" DevOps" - 而不是产生客户(QA)必须精心配置的转储WAR,配置是开发过程的一部分,就像其他一切一样。您传递的是完全配置的,可立即运行的设置。

    要实现这一点,请创建另一个名为" project -qa"的Maven模块。这取决于您的项目以及将死代码转换为正在运行的应用程序所需的一切(因此它将依赖于DBCP,它将包含所有必需的配置文件)。

    Maven支持overlayed WARs,这将允许您轻松实现这一点。

答案 1 :(得分:1)

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

答案 2 :(得分: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?