我定义了一个maven多模块构建,其中一个模块仅用于生成源。它不会编译,测试或打包,除生成源文件外不会创建任何工件。
我还没有找到一种方法,只能在生成器模块上执行最多generate-sources
的阶段,无论我在启动多模块构建时指定的阶段如何。有一些解决方案可以跳过不需要的阶段,但这不是一个真正的选择,因为它们中只有很多。
对于那些想知道,为什么我会想要它:构建使用tycho和fornax oaw插件,因此我不得不将构建拆分为两个单独的pom文件并使用多模块构建文件“一起”执行它们。
答案 0 :(得分:2)
看到你的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
是中间人,为这些生成项目添加你想要的所有插件管理。
答案 1 :(得分:1)
据我所知,这是关于使用Xtext创建在maven构建中调用的代码生成器。我认为你需要更多地分割你的项目。当你改变你的语法时,你只需要构建生成器。因此,拥有一个包含生成器的独立项目(而不是模块)是个好主意。您将生成器构建并部署到maven存储库。在正常构建中,您可以使用fornax-oaw-m2插件在generate-sources
阶段生成源,就像您现在所做的那样。您只需要将生成器包含为fornax-oaw-m2插件的依赖项。
修改强>
所以回到你想要构建的多模块项目:我建议有一个模块只包含生成源的资源而不是其他任何东西。另一个java sourcec应该包含在它们自己的模块中。然后我可以建议使用生成器的两种方法:
您仍然始终在generate-sources
阶段生成。在第二种方案中,如果您需要为一组不同的模块生成源,那么fornax-oaw-m2插件的配置将会重复。但我认为这更像是maven的方式,因为你只改变你目前正在建设的项目。在第一种方法中,您必须从模块声明依赖项,其中生成源到执行源生成的模块。这看起来有点尴尬。