5

有几个类似的问题,但没有这样的。您如何处理这种情况(典型场景):

一个由 8-11 个子项目组成的项目,有一个父工件/项目和一个主要使用/声明其他项目作为模块的主项目。

问题是所有项目都“严格”共享公共依赖项,例如testng, logging, apache commons and stuff. 但总是像其中 3 个使用 50-60% 的相同特定依赖项(apache-chemistry、jackrabbit、abdera 等),另外 2-3 个也使用 50-60% 相同但不同的依赖项。主要的使用了很多相同的部门。

我不能将那些“非严格”共享的部门放入父项目中以供其他人继承。所以只有共同的部门被继承。并且有大量重复的依赖项。而且我只能通过<dependencyManagement>.

另一种选择是让父 pom 包含大部分依赖项,但子项目甚至继承他们不需要的那些。

我可以有超过 1 个父项目,但感觉不对。从父项目继承也可能是一场噩梦,因为如果您没有正确记录/注释父 pom 定义,您不知道项目需要哪些依赖项。

另一种方法是创建仅用作依赖容器的 pom 工件——它们声明特定的依赖组,因此模块只需声明这些依赖即可获得传递依赖。但是,嘿,你想部署并提交某种

OneDepArtifact 声明jackrabit, abdera, chemistry

另一个DepArtifact 声明htmlcleaner, google-api, tika

ThirdDepArtifact 声明spring, httpclient, selenium

这是一个巨大的混乱,我不确定我<dependencyManagement>是否正确使用,它似乎只对管理依赖版本有用。

我正在考虑使我的应用程序开发适应“maven 多模块设计”。但是,如果您想在一个模块中创建仅使用各种库的 spring 服务/bean,则不要在不同的模块中实现它们,因为它们使用其他模块也使用的库:-)

4

3 回答 3

3

Maven 3.1 应该通过引入“mixins”来解决这个问题。与此同时,我似乎可以通过正确使用配置文件来获得大部分所需的功能,正如我在这篇博文中所描述的:

http://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/maven-pom-composition-means-profiles

请让我知道您是否觉得它有用。

于 2011-07-19T17:57:29.170 回答
3

我知道你说这可能是一场噩梦,但我强烈认为你的父母 pom 之间的继承是要走的路。

我在这个答案中描述了一个好的多模块项目结构。它还描述了使用聚合器和父链继承。

一些可以帮助您保持井井有条和理智的事情...

  • 使用良好的命名约定;不要只调用父项目parent1parent2. 使用描述他们配置的依赖类型和其他内容的名称,以便人们直观地知道何时使用哪个。
  • 使用 maven 的发布/部署功能,以便在您的存储库中正确地对它们进行版本控制,并始终引用固定版本的工件。不使用 SNAPSHOT 是获得确定性、可重复构建的第一步。当事情发生变化时调试问题是非常困难的。
  • 不要依赖 pom.xml 文件来了解您的项目需要哪些依赖项。这将导致您避免继承和其他事情,如自定义配置文件。您应该使用maven-dependency-plugin来执行这些分析任务。有一些命令mvn dependency:tree可以显示项目的所有依赖项,mvn dependency:analyze也可以显示未使用的依赖项。

希望有了这个建议,父 POM 文件继承不会显得那么复杂和噩梦。祝你好运!

于 2011-06-14T21:59:21.190 回答
-1

如果它主要是关于版本(数字)控制 - 为什么不在父项目中仅将依赖版本指定为属性并在子项目中使用它,例如

家长

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>foo.bar</groupId>
    <artifactId>maven-parent</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>

    <properties>
        <log4j.version>1.2.16</log4j.version>
    </properties>

</project>

孩子

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>maven-parent</artifactId>
        <groupId>foo.bar</groupId>
        <version>0.0.1</version>
    </parent>

    <groupId>foo.bar</groupId>
    <artifactId>maven-child</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>

</project>

这是一个简单的解决方案,可让您指定具有一致版本号的特定项目依赖项。

于 2011-06-14T19:50:19.847 回答