【问题标题】:Lifecycle phases in maven multi module buildMaven 多模块构建中的生命周期阶段
【发布时间】:2012-10-25 23:06:50
【问题描述】:

我定义了一个 Maven 多模块构建,其中一个模块仅用于生成源。它不会编译、测试或打包,也不会创建除了生成的源文件之外的任何工件。

我还没有找到一种方法,只在生成器模块上执行直到generate-sources 的阶段,而不管我在启动多模块构建时指定的阶段。有一些解决方案可以跳过不需要的阶段,但这不是一个真正的选择,因为其中有很多。

对于那些想知道,为什么我想要它的人:构建使用 tycho 和 fornax oaw 插件,因此我不得不将构建拆分为两个单独的 pom 文件并使用多模块构建文件来“一起”执行它们。

【问题讨论】:

  • 回答你的问题,我不知道这种方式。唯一的建议是将源生成不绑定到generate-sources 阶段,而是绑定到packageinstalldeploy 阶段(无论您喜欢哪个)。
  • 我对通常的阶段很好 - 只是“生成模块”应该在生命周期阶段之后停止,即使目标阶段是安装或部署或其他。我不需要后期阶段的任何其他输出。
  • 在生成器模块上指定pom包装怎么样?我还是想知道你为什么把它分开。我正在做一个项目,我们还使用 fornax oaw 插件来生成代码。我们只是将它绑定到它自己配置文件中的generate-sources 阶段。
  • “生成器模块”需要打包“eclipse-plugin”,在我的情况下这是无稽之谈,因为我不需要插件本身,只需要生成的源。这种强制包装类型是tycho强制的,我不能用pom之类的。 Tycho 需要它来收集依赖项。
  • 很遗憾,Tycho 不对其他包装类型开放:bugs.eclipse.org/bugs/show_bug.cgi?id=349115

标签: java maven lifecycle tycho


【解决方案1】:

在看到你的latest question 之后,我想我可能会为你找到解决方案。

我猜你所有的../projectN/generate/pom.xml 都将顶级 pom 作为其父级,但我建议你创建一个特殊的 generate-parent pom 并使用特殊的插件管理,它会为你跳过所有阶段。

在顶层创建一个名为 generate-parent 的额外文件夹:

<modules>
    <module>../generate-parent/pom.xml</module> <!-- NEW FOLDER WITH POM -->
    <module>../project1/generate/pom.xml</module>
    <module>../project1/pom.xml</module>
    <module>../project2/generate/pom.xml</module>
    <module>../project2/pom.xml</module>
    <!-- and many more projects with or without generate sub modules -->
</modules>

这个新的 pom 将照常继承父 pom,但只添加一些额外的插件管理:

<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>
        <groupId>your-group</groupId>
        <artifactId>your-parent-pom-artifact-id</artifactId>
        <version>your-parent-version</version>
    </parent>

    <artifactId>generate-parent</artifactId>
    <packaging>pom</packaging>

    <name>${project.artifactId}-${project.version}</name>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.4.3</version>
                    <executions>
                        <execution>
                            <id>default-resources</id>
                            <phase>none</phase>
                        </execution>
                        <execution>
                            <id>default-testResources</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <executions>
                        <execution>
                            <id>default-compile</id>
                            <phase>none</phase>
                        </execution>
                        <execution>
                            <id>default-testCompile</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.7.2</version>
                    <executions>
                        <execution>
                            <id>default-test</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.3.1</version>
                    <executions>
                        <execution>
                            <id>default-jar</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.3.1</version>
                    <executions>
                        <execution>
                            <id>default-install</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.5</version>
                    <executions>
                        <execution>
                            <id>default-deploy</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

现在有了这个 pom,所有默认阶段都被禁用了。

现在在所有生成项目中使用这个 pom。上面的 pom 继承了您在父 pom 中拥有的所有好东西,但只是添加了这些特殊的插件管理部分,这些部分会禁用 generate-sources 之后的阶段。

project1/generate/pom.xml

<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>
        <groupId>your-group</groupId>
        <artifactId>generate-parent</artifactId>
        <version>your-parent-version</version>
        <relativePath>../../generate-parent</relativePath>
    </parent>

    ...
    The rest of your pom
    ...
</project>

这将有效地做你想做的事,generate-parent 是为这些生成项目添加你想要的所有插件管理的中间人。

【讨论】:

    【解决方案2】:

    据我了解,这是关于使用 Xtext 创建在 maven 构建中调用的代码生成器。我认为您需要更多地拆分您的项目。当您更改语法时,您只需要构建生成器。因此,拥有一个包含生成器的独立项目(而不是模块)将是一个好主意。您构建生成器并将其部署到 Maven 存储库。在您的正常构建中,您使用 fornax-oaw-m2 插件在generate-sources 阶段生成您的源代码,就像您现在所做的那样。你只需要包含生成器作为 fornax-oaw-m2 插件的依赖项。

    编辑:
    所以回到你想要构建的多模块项目:我建议有一个模块只包含你从中生成源的资源,而不是其他任何东西。其他 java sourcec 应该包含在它们自己的模块中。然后我可以建议使用生成器的两种替代方案:

    1. 在包含您从中生成源的资源的模块中运行生成器并适当地设置相对路径
    2. 在模块中运行生成器,该模块应包含生成的源,并将模块与资源作为依赖项包含(您可能需要在生成资源之前解压缩该依赖项)

    你仍然总是在generate-sources 阶段生成。在第二种选择中,fornax-oaw-m2 插件的配置将被复制,如果您需要为一组不同的模块生成源。但我认为这更像是 maven 方式,因为您只更改当前正在构建的项目。在第一个替代方案中,您必须声明来自模块的依赖关系,其中源代码生成到执行源代码生成的模块中。这似乎有点尴尬。

    【讨论】:

    • 生成器不在同一个问题中,它在不同的 eclipse 插件中。我的项目包含用特定 dsl 和普通 java 代码编写的文件。很抱歉没有澄清这一点:这不是关于构建生成器,而是关于使用生成器基于 dsl 文件(使用 xtend)生成 java 源代码并编译整个东西。
    • @Andreas_D 我已经调整了我的答案。希望这会有所帮助。
    • 我不想将 dsl 和 java 文件分发到单独的 eclipse 项目中,然后尝试收集源文件,可能是通过在不同项目中定义目标目录。项目应包含构建库(jar)所需的所有文件。生成器生成 java 源代码,需要对其进行编译、jar 和安装/部署。
    猜你喜欢
    • 2011-07-31
    • 2019-09-28
    • 1970-01-01
    • 2013-05-05
    • 2016-08-05
    • 2021-01-25
    • 2014-04-18
    • 2016-02-18
    • 2015-11-20
    相关资源
    最近更新 更多