Maven 2 Maven-创建独立于父项目的子项目

Maven 2 Maven-创建独立于父项目的子项目,maven-2,Maven 2,我有点像Maven新手,我正在尝试建立一个Maven项目,它可以构建几个子项目,但仍然允许有人只获取一个子项目,并在没有父项目的情况下独立构建它 parentfolder ->pom.xml ->project1 ->pom.xml ->src ->project2 ->pom.xml ->src ->project3 ->pom.xml ->src 基本上,我希望有人能

我有点像Maven新手,我正在尝试建立一个Maven项目,它可以构建几个子项目,但仍然允许有人只获取一个子项目,并在没有父项目的情况下独立构建它

parentfolder
  ->pom.xml
  ->project1
    ->pom.xml
    ->src
  ->project2
    ->pom.xml
    ->src
  ->project3
    ->pom.xml
    ->src
基本上,我希望有人能够签出parentfolder并进行mvn编译以构建所有项目,也希望有人能够签出project1并进行mvn编译以构建它

我已经尝试在顶级pom.xml中将子项目声明为模块

<modules>
  <module>project1</module>
  <module>project2</module>
  <module>project3</module>
</modules>

项目1
项目2
项目3

但这似乎需要在子对象中声明父对象pom.xml信息。这使得子项目依赖于存在的父pom.xml,这是我想要避免的。

必须在子项目中声明父pom及其版本

如果您的项目已声明父级,则它必须在生成中可用,因此其中一个模块必须是父pom,或者在存储库中可用。您似乎在说,您希望有人签出依赖于父级的项目,但没有访问父级的权限,并且仍然能够构建该项目,就像尝试构建一个没有依赖项的项目一样

使父pom可用的选项有:

  • 设置公共maven存储库,将父pom部署到其中,并将存储库信息放入子pom中
  • 您可以告诉maven在检查存储库之前在相对路径上查找父pom(这有助于您在尚未部署的父pom中进行本地更改)。因此,您可以在您的子项目中将svn:external或其等效项简化为父pom

您必须注意Maven2中父子关系和聚合概念之间的差异。它们不是相同的原理,即使它们确实经常同时使用

家长

第一个概念是项目在其
pom.xml
中声明父项:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>42</version>
    </parent>
    ...
这意味着您将在此根项目上运行的每个命令都将在每个模块上执行(顺序由Maven 2 Reactor定义)。例如,如果在根项目上运行
mvn clean install
,Maven 2将在根项目上运行此命令,然后在项目
commons
,然后在
client
上,最后在
服务器上运行此命令

在这个概念中,您可以编译一个项目,而无需编译任何其他项目(当然,除非存在相互依赖关系)

下面是一个显示两个不同概念的模式:


在Maven:最终指南中,您对这两个概念有了更详细的解释。

如果子项目使用标记(Maven继承),则子项目仅依赖于父项目。您不需要在子模块中使用标记。但是,如果希望模块从父pom继承公共元素,则必须使用maven继承


严格地说,如果您使用的是继承,并且只想构建一个子项目,那么父pom.xml不必存在于父目录中;只要maven能够在本地或远程存储库中找到父pom,它就会构建。在实践中,如果您的父pom发生了变化,您将必须解决如何让您的团队成员跟上父pom的最新情况。

在我看来,问题在于Maven正在重载父标记。Maven文档一直告诉我继承和聚合是两件不同的事情,但它们都使用相同的标记来实现它们的功能。这确实不利于原始海报所要求的场景。人们可能想

  • 从公共父级继承某些设置,但
  • 有两个不同应用程序的版本共享一个公共组件

  • 因此,我们对父母关系有两种不同的理解。首先是为每个模块提供设置的“父级”,其次是构建子模块的“父级”。因为后者有两个,所以这就发生了故障。亲子关系的两个概念相互阻碍。

    这个问题可以通过使用maven的而不是。

    你的意思是,如果你只想构建子模块,而不想继承任何父pom定义,你不必在子pom中使用标记?谁知道,那是7年前我回答这个问题时;)
    <modules>
        <module>commons</module>
        <module>client</module>
        <module>server</module>
        ...
    </modules>