2

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

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

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

4

2 回答 2

2

在看到您的最新问题后,我想我可能会为您提供解决方案。

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

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是为这些生成项目添加你想要的所有插件管理的中间人。

于 2012-10-25T15:06:50.363 回答
1

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

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

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

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

于 2012-10-18T17:05:44.230 回答