有一些类似的问题,但没有这样的问题。你如何应对这种情况(典型情况):
一个8-11个子项目的项目,有一个父工件/项目和一个主要项目,主要使用/声明其他项目为模块。
问题是所有项目“严格”只共享公共依赖项,如testng, logging, apache commons and stuff
。但总是喜欢其中3个使用相同特定deps的50-60%(apache-chemistry,jackrabbit,abdera等),另外2-3个也使用50-60%相同但不同的依赖项。主要使用很多相同的代表。
我无法将这些“非严格”共享deps放入父项目中以供其他人继承。所以只有常见的deps才会被继承。并且有大量重复的依赖项。我只能通过<dependencyManagement>
来管理他们的版本。
另一个选择是让父pom包含大多数依赖项,但是子项目甚至会继承它们不需要的项。
我可以有多个父项目,但感觉不对。父项目的继承也可能是噩梦,因为你不知道项目需要什么依赖项,如果你没有正确地记录/评论父pom定义。
另一种方法是创建仅作为依赖容器的pom工件 - 它们声明特定的依赖关系组,以便模块只声明那些以获得传递依赖关系。但是,嘿,你想部署和提交某种
OneDepArtifact声明jackrabit, abdera, chemistry
AnotherDepArtifact声明htmlcleaner, google-api, tika
ThirdDepArtifact声明spring, httpclient, selenium
这是一个巨大的混乱,我不确定我是否正确使用<dependencyManagement>
,它似乎只对管理依赖版本有用。
我正在考虑将我的应用程序开发改编为“maven multimodule design”。但是如果你想创建spring服务/ bean,只使用各种库,在一个模块中,你不会在不同的模块中实现它们,只是因为它们使用其他模块也使用的库: - )
答案 0 :(得分:3)
Maven 3.1应该通过引入“mixins”来解决这个问题。与此同时,我似乎可以通过正确使用配置文件获得大部分所需功能,正如我在此博客文章中所描述的那样:
http://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/maven-pom-composition-means-profiles
请告诉我您是否觉得它有用。
答案 1 :(得分:1)
我知道你说这可能是一场噩梦,但我强烈感觉你的父母之间的继承是可行的。
我在this answer中描述了一个很好的多模块项目结构。它还描述了使用聚合器和父链接继承。
有些事情会帮助你保持整洁有序......
parent1
和parent2
。使用描述它们所配置的依赖关系和其他内容的名称,以便人们直观地知道在何时使用它们。mvn dependency:tree
之类的命令可以显示项目的所有依赖项,而mvn dependency:analyze
则显示未使用的依赖项。希望有了这个建议,父POM文件继承似乎不会那么复杂和噩梦。祝你好运!
答案 2 :(得分:-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>
这是一个简单的解决方案,可让您使用一致的版本号指定特定的项目依赖项。