【问题标题】:custom pom.xml filename in maven multimoduleMaven 多模块中的自定义 pom.xml 文件名
【发布时间】:2012-08-19 14:29:47
【问题描述】:

我有一个 maven3 多模块项目,出于一个奇怪的原因,我需要为我的一个子模块自定义 POM 文件名(即:module-pom.xml)

是否可以在父 pom 中进行配置?

奇怪的原因解释起来有点长,抱歉,但你会明白的。

上下文

  • 我正在开发一个也使用 LGPL 项目的封闭源代码项目。这个项目叫main

  • 我希望main 声明每个项目的模块,关闭和打开。完整的构建应该使用唯一的mvn clean package 命令。

  • main reactor 项目中,我有 lgpl-reactor 多模块项目,其中包含 3 个 LGPL 模块(API、插件和分发项目)。一些开发者只能访问lgpl-reactor,所以我也希望这个项目使用mvn clean package 命令从它的文件夹构建,就像一个完全独立的项目。

  • 我还有 main-dist 项目,它是一个仅限 maven-assembly-plugin 的项目(用于构建分发版)。

问题

    1234563 .xml 未找到)。
  • 如果我从lgpl-reactor pom.xml 中删除父引用,独立的lgpl-reactor 构建工作,但main-dist 创建的程序集无效(缺失。

如何解决?

  • 使用另一个 POM 文件 module-pom.xml 用于 lgpl-reactor 模块声明在 main 模块声明列表中。从 main 项目执行完整构建时,module-pom.xml 包含对父 POM 的引用并且工作正常。

  • 使用默认的 POM 文件 pom.xml 进行独立构建 lgpl-reactor。这个POM很难引用带有<parent>标签的relativePath属性的父pom

但是我该怎么做呢?如果可能的话 ?或者有没有更好的解决方案?

主反应堆项目目录

lgpl-lib [LGPL Library]
lgpl-ext [LGPL Reactor Project]
closed-core [Closed source module]
closed-spring [Closed source module]
closed-web [Closed source module]
closed-webserver [Closed source module]
main-dist [Main assembly module]
pom.xml [Main Reactor POM]

LGPL 反应堆项目目录

lgpl-api [LGPL API module]
lgpl-plugins [LGPL Plugins module]
lgpl-ext-dist [LGPL assembly module]
main-pom.xml [Main Reactor POM, copy of main pom.xml]
pom.xml [Standalone LGPL Reactor POM]
module-pom.xml [Module LGPL Reactor POM]

主反应堆 POM (pom.xml & lgpl-reactor/main-pom.xml)

    ...
    <modelVersion>4.0.0</modelVersion>
    <groupId>main.group</groupId>
    <artifactId>main</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Main</name>
    <packaging>pom</packaging>
    ...
    <modules>
        <module>closed-core</module>
        <module>closed-web</module>
        <module>closed-webserver</module>
        <module>closed-spring</module>
        <module>lgpl-reactor</module>
        <module>lgpl-lib</module>
        <module>main-dist</module>
    </modules>
    ...

lgpl-reactor/pom.xml

...
<modelVersion>4.0.0</modelVersion>
<artifactId>lgpl-reactor</artifactId>
<name>LGPL Reactor</name>
<packaging>pom</packaging>

<parent>
    <groupId>main.group</groupId>
    <artifactId>main</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>main-pom.xml</relativePath>
</parent>
...
    ...
<modules>
    <module>lgpl-api</module>
    <module>lgpl-plugins</module>
    <module>lgpl-ext-dist</module>
</modules>
    ...

main-dist的pom.xml

<project>
    <parent>
        <groupId>main.group</groupId>
        <artifactId>main</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>main-dist</artifactId>

    <packaging>pom</packaging>

    <description>Main Distribution</description>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <id>plugins-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>assembly.xml</descriptor>
                            </descriptors>
                            <appendAssemblyId>false</appendAssemblyId>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>closed</groupId>
            <artifactId>closed-webserver</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>closed</groupId>
            <artifactId>closed-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

main-dist的assembly.xml

<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>plugins-assembly</id>
    <formats>
        <format>dir</format>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>../closed-webserver/conf</directory>
            <outputDirectory>conf</outputDirectory>
        </fileSet>
    </fileSets>

    <dependencySets>
        <dependencySet>
            <excludes><exclude>main.group:closed-webserver</exclude></excludes>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>

    <moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>

            <includes>
                <include>main.group:closed-webserver</include>
            </includes>

            <binaries>
                <outputFileNameMapping>${module.artifactId}${dashClassifier?}.${module.extension}</outputFileNameMapping>
                <unpack>false</unpack>
                <includeDependencies>false</includeDependencies>
            </binaries>
        </moduleSet>

        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>

            <includes>
                <include>main.group:closed-spring</include>
            </includes>

            <binaries>
                <outputFileNameMapping>${module.artifactId}${dashClassifier?}.${module.extension}</outputFileNameMapping>
                <unpack>false</unpack>
                <includeDependencies>false</includeDependencies>
            </binaries>

        </moduleSet>

        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>

            <includes>
                <include>main.group:lgpl-ext-dist</include>
            </includes>

            <binaries>
                <outputDirectory>plugins</outputDirectory>
                <unpack>false</unpack>
                <includeDependencies>true</includeDependencies>
            </binaries>

        </moduleSet>
    </moduleSets>

</assembly>

【问题讨论】:

  • 你能不能告诉我们那个奇怪的原因是什么?这可能会帮助我们了解您为什么需要它,然后可能会想出一个解决方案。
  • 好的,我已经添加了一些细节......
  • 自定义 pom 路由对您不起作用怎么办?在多模块清单中,您可以指定子工件的自定义 POM 文件名。

标签: java maven-2 maven-3


【解决方案1】:

您可以覆盖默认的 pom.xml。 Maven 有 -f 命令选项。

mvn -f <path>/pom.xml clean install

【讨论】:

    【解决方案2】:

    我建议将文件夹结构更改为以下。

    root (pom.xml)
      +-- closed-core
      +-- closed-web
      +-- closed-webserver
      +-- closed-spring
      +-- lgpl-reactor
             +-- lgpl-lib
             +-- lgpl-dist
             +-- lgpl-etc..
    

    您不需要单独的 module-pom.xml 文件。您可以默认使用 pom.xml。

    如果您不想构建 lgpl-reactory,您可以简单地提供:

    mvn -pl lgpl-reactory clean package 
    

    如果您在其他模块中对 lgpl 有依赖项,则可以使用:

    mvn -am -pl lgpl-reactory clean package 
    

    这也将构建所有依赖模块。

    【讨论】:

    • 问题是根 pom.xml 不会作为 LGPL 发布,也不会在 lgpl-reactor 的 github 存储库中可用...因此,用户从 GitHub 克隆 lgpl-reactor不能这样做来构建项目,它们只有 lgpl-reactor 目录。
    • 封闭代码源位于私有 Git 存储库中。 lgpl-reactor 目录位于公共 GitHub 存储库中。我可以将根 pom.xml 的副本作为 LGPL 发布到 github 存储库中,你是对的。
    • 最好的办法是制作一个单独的 lgpgl 项目,该项目将单独发布和您的封闭源代码部分。比你没有问题。
    • 是的,我想我会选择这个解决方案,但是在 Eclipse 环境中使用这两个项目不太方便。但是 maven 似乎没有被设计为在同一个项目中为不同的部件/许可证提供不同的存储库。 (我想象 maven:release 插件的其他问题,例如,它不能在 2 个不同的存储库中正常工作......)
    • 发布插件确实是个说法。在 Eclipse 中,您可以将这两个项目放入 eclipse 中并打开工作区分辨率(据我所知,这是默认设置)。
    【解决方案3】:

    一个解决方案是应用逆逻辑,并使用“mvn -f Standalone-pom.xml clean package”将lgpl-reactor构建为独立项目......但如果独立项目构建会更好一个标准的 maven2 命令行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2014-05-31
      • 2011-08-19
      • 2018-12-17
      • 1970-01-01
      相关资源
      最近更新 更多