我们有 Java 和 Flex 项目。我们目前有 1 个基础 pom,其中包含我们要用于两个项目的配置。问题在于:Flex 项目继承了配置,例如 javadoc
和 pmd
插件,这是不可取的。
我想清理它并拥有一个真正的基础 pom,然后是一个 java-base-pom
和一个 flex-base-pom
。但是,这在同时具有 Flex 部分和 Java 部分的多模块中是如何工作的呢?
我们有我们自己的应用程序的插件,我们使用以下结构:
我的插件我的插件客户端(flex)我的插件服务器(java)
我的插件客户端(flex)
我的插件服务器(java)
my-plugin
仅包含一个带有 <modules/>
的 pom.xml
部分。我会使用 my-plugin
pom.xml 作为两者的父级,但是我也不能使用 java base-pom 或 flex base-pom 作为父级。最好的方法是什么?
即使 maven 项目有单亲,它们也可以像这样导入任意数量的其他 pom:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>my-shared-dependencies</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
与父母相比,这有两个重要的区别:
导入的 pom 中定义的插件不会被导入 导入的 pom 中定义的依赖不会添加到当前 pom 中,只会将依赖导入到依赖管理部分
但是,如果您的父 pom 有一个 <dependencies>
部分,并且您希望将它们包含到 your 依赖项中,那么您可以像常规依赖项一样将父项添加到您的 <dependencies>
部分:
<dependency>
<groupId>org.example</groupId>
<artifactId>my-shared-dependencies</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
即使已经导入了相同的依赖项,也必须再次指定版本标记。为了减少重复,它可以存储在一个属性中
一个项目只能有一个父级(与 C++ 中的多重继承不同),但这个父级可以是更大父级层次结构的一部分。正如其他人所指出的那样,您可以拥有这样的东西:
base-pom/ |-- flex-base-pom | |-- my-plugin-client | | `-- pom.xml | `-- pom.xml |-- java-base-pom | |-- my-plugin-server | | `-- pom.xml | `-- pom.xml `-- pom.xml
也就是说,我注意到您写道,您的实际问题是:
例如,flex 项目继承了 javadoc 和 pmd 的配置,这是他们不想要的。
您应该使用 pluginManagement
元素来避免这种情况:
pluginManagement 是一个与侧面插件一起看到的元素。插件管理以几乎相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个项目继承的项目构建。但是,这仅配置子级的 plugins 元素中实际引用的插件。孩子们有权覆盖 pluginManagement 定义。
因此,在父 pom 中,在 pluginManagement
中配置您的插件(例如 javadoc 和 pmd),并在所需子项的 plugins
元素中引用它们(此处仅在 my-plugin-server 中)。这将解决您当前的问题。
唯一的方法是让 base-pom 作为 java-base-pom 和 flex-base-pom 的父级。
我的春季项目有类似的结构:
base-pom (basic configuration - eclipse, reports, repositories, etc)
|
+ spring-base-pom (spring definitions)
|
+ spring-jar-base-pom (jar specific definitions)
|
+ spring-war-base-pom (spring web and servlet dependencies)
|
+ spring-webapp-base_pom (spring web mvc dependencies)
我也遇到了这个确切的问题,我发现的最佳解决方案是按照这个问题的建议使用继承和聚合:does maven support multiple parents (multiple inheritance) ?
您可以拥有一个聚合器 pom,它不是它聚合的项目的父级。
并在 Maven Documentation 中解释
继承和聚合创建了一个很好的动态来通过单个高级 POM 控制构建(...)相反,POM 项目可能会聚合不继承自它的项目。
从这里我继承了我的 POM(pom-master 包含公社配置,每个孩子都有具体的配置):
pom-master |-- pom-java |-- pom-flex
所以我的项目可以根据需要获得每个模块配置的细节:
project (aggregate project-flex & project-java) |-- project-java | `-- pom.xml => parent = pom-java |-- project-flex | `-- pom.xml ==> parent = pom-flex `-- pom.xml => parent = pom-master
希望它也能帮助其他人:)
想象一下 pom.xml
实际上是 Java 类:您只能有一个父级(或扩展一个类),但这个父级也可以有另一个父级,依此类推。
正如我解释的here,您必须区分 Maven 中的父项和聚合原则,这意味着 my-plugin 将被视为聚合项目,不一定是 my-plugin-client 和 my-plugin-parent 的父项目.
所以总结一下:
my-plugin
将为您的所有项目定义基础 pom。然后,您创建两个新的 pom 项目:java-base-pom
和 flex-base-pom
。他们都有 my-plugin
作为父级。现在,my-plugin-client 将 java-base-pom
作为父级,而 my-plugin-server 将 flex-base-pom
作为其父级。
这样,my-plugin-client 将继承 my-plugin
pom.xml 以及 java-base-pom
项目中定义的所有属性。
您可以使用配置文件实现多重继承:
您在根 pom 中创建(多个)配置文件,并自动激活这些配置文件的任何变体,以实现 Maven 配置的多重继承。