0

Is it not possible to include dependencies based on class properties? E.g. if I am building a framework that I want to integrate with any customer system, the type of DB the customer uses could be a variable but my framework may use it if it can acquire a data source. So in this case, my Maven project should be able to integrate with any DB by declaring the corresponding DB war as dependency.

E.g.

<dependency>
   <artifactId>${database.artifactId}</artifactId>
   ....
</dependency>

But this database.artifactId in itself will be read from properties file that may be accesible to customer code, so the idea of having parent pom declare the versions and artifactId as mentioned here may not suit my case.

Is there a work around or is this use case itself so wrong? I strongly think if we build a framework that is more like a product the customer can integrate with, this flexibility of declaring any runtime dependency based on propertie should be there.

Thanks,
Paddy

4

1 回答 1

0

这不是使用 Maven 的方式。

如果像您的情况一样,您编写了一个可能使用不同依赖项的框架,那么您就不会以某种方式有条件地依赖于具体的实现。这是行不通的,因为确切的依赖列表是在构建时构建的(即构建和安装框架的 Maven 工件时)。

相反,应该有一个特殊的 Maven 工件,它只描述您需要的功能的接口。该工件通常包含您的框架需要的 (Java) 接口;这是您的框架所依赖的。

然后,在使用您的框架时,必须包含这些接口的具体实现 - 由使用您的框架的人,因为只有他们知道他们使用哪个实现。

例如,“Maven by Example”,“7.10.1. Programming to Interface Projects”一章对此进行了解释。


例子:

  • JDBC:接口是 JDK 的一部分,因此使用 JDBC 的框架不需要声明任何特殊的依赖项(如果 JDBC 不是 JDK 的一部分,您将依赖 Maven 工件,如“jdbc-api”或类似的) . 实际使用 JDBC 的软件必须依赖于它实际使用的任何 JDBC 驱动程序(Oracle、HSQL 等)。
于 2013-02-18T13:50:24.013 回答