Java 跨无关项目共享Maven pom.xml部分的最佳方式?

Java 跨无关项目共享Maven pom.xml部分的最佳方式?,java,maven-2,pom.xml,Java,Maven 2,Pom.xml,我们公司定义了许多与Maven POM相关的“最佳实践”。例如,为资源处理指定utf-8、对哪些文件夹进行筛选、处理单元测试与集成测试以及编译器设置 目前,这些最佳实践记录在我们公司的wiki上,但当“最佳实践”列表发生变化时,这些变化很少反映在项目POM中,直到出现问题为止。人性是什么,一切都是什么 我们是否可以通过Maven提供/实施这些设置和属性?这几乎就像给每个项目一个父pom.xml,但我不想(也不能)让所有这些项目都引用同一个父pom 我们需要一种能够在开发人员的机器上以及我们的Hu

我们公司定义了许多与Maven POM相关的“最佳实践”。例如,为资源处理指定utf-8、对哪些文件夹进行筛选、处理单元测试与集成测试以及编译器设置

目前,这些最佳实践记录在我们公司的wiki上,但当“最佳实践”列表发生变化时,这些变化很少反映在项目POM中,直到出现问题为止。人性是什么,一切都是什么

我们是否可以通过Maven提供/实施这些设置和属性?这几乎就像给每个项目一个父pom.xml,但我不想(也不能)让所有这些项目都引用同一个父pom


我们需要一种能够在开发人员的机器上以及我们的Hudson CI服务器上工作的方法。

唯一的maven解决方案是公共父级。也许如果你使用一个“释放”的父母,你能做到吗


创建一个只包含父pom的项目,并运行发布插件,将其发布到您的内部存储库中。然后将该父项目用作您所有项目的父项目,让他们从您的repo下载该项目,而不是通过相对路径名查找该项目?

如果没有主pom,就没有技术方法来强制执行您的要求(也不是每个项目一开始都能很好地处理它)。 随着时间的推移,保持最佳实践得到实施的唯一有效方法是让实施者承担起自己的工作。你可以将它传播到许多人身上(例如,通过将它添加到他们的工作描述中),但这往往会使它被遗忘,因为每个人都会认为是其他人在做这件事。一个人,按姓名识别,不会推卸责任

这几乎就像给每个项目一个父pom.xml,但我不想(也不能)让所有这些项目都引用同一个父pom

我并不是说一定要把所有的东西都放在一个父级POM中,但是在一个企业环境中,拥有一个具有自己发布周期的顶级企业POM(如maven书的一节所示)确实是一个好主意


但这还不足以强制执行任何内容,我的建议是查看提供的,但也允许使用编写您自己的自定义规则。不过,我无法评论你能在多大程度上遵循自定义规则。无论如何,我强烈推荐这个插件。如果您还没有使用它,那么肯定是时候开始了:)

您可以使用满足公司最佳实践的设置来构建maven项目原型。它更像是“提供”而不是“实施”解决方案,可能还不够(取决于那些最佳实践是什么)

(这是一个旧线程,我只是添加此信息以供参考)

对于依赖项,可以使用“dependencyManagement”导入bloc(但它仅适用于依赖项,而不适用于属性,等等)

只要有一个“库”pom,像往常一样定义各种依赖项(包括它们的排除项和特定版本)

然后在项目的主pom中,将该依赖项部分导入“dependencyManagement”部分:将导入库pom中定义的每个依赖项。此外,在dependencyManagement中定义的每个版本都将始终由Maven使用(Maven不会采用dependencyManagement中定义的版本以外的其他版本)。如果您有依赖于相同库集的各种项目,那么为了管理类路径,这几乎是强制性的

在主项目的pom中,按如下方式导入库pom:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.mycompany.mylibrary</groupId>
            <artifactId>mylibrary-artifact</artifactId>
            <version>mylibrary-version</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        ...

com.mycompany.mylibrary

我读到了另一种字体的“porn.xml”。☺如果我理解正确,那么我是否必须更改所有现有项目的目录结构?而且,我认为这可能会对我们的释放过程造成严重破坏。但是这个建议确实给了我一个想法,至少让部分pom.xml保持在源代码控制之下……根本不改变目录。父级不必具有文件系统树关系。它可能只是从存储库中获取的工件。我按照你的建议做了,效果很好。非常感谢。除了目录mental block之外,我还有一个(长期)错误的想法,即引用父pom的任何pom.xml都必须命名为该父pom中的模块——也就是说,父母和孩子必须是双向关联的。maven文档的各个外围方面都鼓励双向性假设。这是一个好主意,原型实际上可以引用我新的标准化父母pom…并为maven发布插件正确设置SCM URL。