Maven:捆绑特定的依赖

时间:2014-10-15 21:07:33

标签: maven

想象一下,您拥有特定于环境的构建,从而产生两个捆绑包:Home和Office。构建的特定于环境的工件取决于一些常见的工件,我们称之为“核心”。它只是Home和Office构建的常用功能。 Home工件依赖于Core,而Office工件依赖于Core。实际上,Home和Office甚至可以是在不同Maven配置文件下构建的相同工件:如果我们使用-pHomeBundle调用Maven,它会以一种方式构建工件,如果使用-pOfficeBundle - 它会为办公室构建它,两次服用核心作为依赖,与家庭相同。

到目前为止一切顺利。

现在的一个问题是:如果家庭和Office捆绑包中常见的Core工件依赖于其他与Home和Office捆绑包不同的工件,我们能做些什么呢?即核心工件不依赖于bundle,但它的依赖关系是。

我们如何为我们的Core提供这种依赖?

我们如何为此编写Core POM?

UPDATE 针对此问题提出了两个解决方案:向Core项目添加两个特定于bundle的依赖项(然后在特定于bundle的模块Home / Office中添加一个real,将Core作为依赖项),或者向Core模块添加两个真正的依赖项然后在特定于包的模块Home / Office中过滤它们。 但是我无法确定将构建哪个依赖Core。无论我们是否提供它 - 它应该构建一些依赖,因为它进入存储库。据我所知,它只需要第一个可用的类并使用它。所以我将使用其中一个依赖项构建一个Core工件。

3 个答案:

答案 0 :(得分:2)

听起来这里的事情有点混乱。您永远不应该真正构建特定于环境的应用程序版本。您应该只构建一个应用程序,它应该适用于任何合适的环境,无论是家庭还是办公室。不同的东西应该由环境提供。

让我们具体化。

例如:您在工作时依赖于oracle数据库,在家中依赖于mysql数据库。您可以使用标准界面构建软件,例如JPA。您的家庭和工作容器(让我们假设是tomcat)应该在其provided库文件夹中的jar中包含一个包含数据库连接字符串的属性文件。然后,当您的应用启动时,它可以获取环境的数据库。一个应用程序,多个环境。

另一个例子:你在家时依赖log4j,但在办公室审核比这更严格,你必须使用自定义库。您的代码是根据标准日志记录界面构建的,并且您的容器在家中有provided文件夹中的log4j库,当您的应用程序在家中部署时,它将获取log4j实现,但是您的{{{工作中的1}}文件夹具有自定义日志记录库,因此当您的应用程序启动时,它会选择它。

希望您可以从这些示例中看到,我们构建的软件应该被赋予一个环境,该环境具有其期望的服务的环境特定实现。使用现代java,osgi和现代容器,这总是如此。我们总能以这种方式构建我们的软件。我们不应该也不需要特定于环境的构建。

如果您在每个环境中都具有不同的功能,请将其拆分为单独的模块,并将其标记为使用它的模块中提供的模块。通常这将导致至少三个模块,一个用于接口,两个用于环境特定的实现。该接口几乎总是运行时依赖,并且几乎总是提供实现。

答案 1 :(得分:1)

重新“家庭和办公室甚至可以是相同的工件”

您的意思是使用相同的GAV jar文件名构建officehome(快照或发布)但具有不同的配置文件?

因为一张图片胜过千言万语是你想要实现的目标:

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  office-for-core:jar                      office:jar     
                     \                    /                 office build 
                      \                  /
 - - - - - - - - - - - (office-)  - - - / - - - - - - - - - - - - - - - -
                                core:jar                     core build
 - - - - - - - - - - - - (home-)  - - - \ - - - - - - - - - - - - - - - -
                        /                \
                       /                  \                  home build
      home-for-core:jar                    home:jar
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

答案 2 :(得分:-1)

我更希望在各自的pom.xml中添加这些特定于bundle的依赖项,并将它们排除在核心依赖项之下,以便我100%确定只获得为该项目添加的那些依赖库。

当我们必须为两个不同的运行时构建相同的应用程序时,我们在应用程序中遇到了类似的情况,并且一些框架库将运行时库捆绑在其中。因此,我们最终将它们从核心依赖项中排除,并将它们作为单独的依赖项包含在应用程序POM中。

希望这是有道理的,也有帮助。很想知道传说是否有更好的方法。