如何在 Maven 中的清洁包期间保护自动生成的源?
How to protect auto-generated sources during clean package in maven?
我有一个 Maven 配置文件触发 xsd
和 wsdl
类 的自动生成,如下所示:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>${cxf-xjc-plugin}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/src/main/java</sourceRoot>
<xsdOptions>
//xsds, wsdls etc
</xsdOptions>
</configuration>
<goals>
<goal>xsdtojava</goal>
</goals>
</execution>
</executions>
</plugin>
生成的类转到:target/generated/src/main/java
.
问题:运行 'mvn clean package' 将始终删除那些 类。我该如何预防? clean
是否可以删除 target
目录中除 generated/
目录之外的全部内容?
使用maven-clean-plugin
可以不删除某些目录,但这绝对不是一个好主意:
- 它违反了 Maven 约定
- 它会强制您在每次想要生成 类 时更改 POM
您的确切问题的解决方案(不推荐)
您可以使用 excludeDefaultDirectories
and filesets
参数排除带有 maven-clean-plugin
的目录:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.6.1</version>
<configuration>
<excludeDefaultDirectories>true</excludeDefaultDirectories>
<filesets>
<fileset>
<directory>${project.build.directory}</directory>
<excludes>
<exclude>generated/*</exclude>
</excludes>
</fileset>
</filesets>
</configuration>
</plugin>
请注意,我强烈建议您不要使用此解决方案。
建议的解决方案
您的实际问题不是每次构建时都重新生成 类,因为这会花费很多时间。目标是通过使用自定义配置文件避免生成:
<profiles>
<profile>
<id>noGenerate</id>
<properties>
<xjc.generate>none</xjc.generate>
</properties>
</profile>
<profile>
<id>generate</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<xjc.generate>generate-sources</xjc.generate>
</properties>
</profile>
</profiles>
使用以下插件定义:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>${cxf-xjc-plugin}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>${xjc.generate}</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/src/main/java</sourceRoot>
<xsdOptions>
//xsds, wsdls etc
</xsdOptions>
</configuration>
<goals>
<goal>xsdtojava</goal>
</goals>
</execution>
</executions>
</plugin>
似乎cxf-xjc-plugin
没有任何skip
参数所以当我们想避免执行时,我们不得不求助于将phase
设置为none
(这是一个未记录的功能,但它有效)。
诀窍是定义两个配置文件:一个默认激活,设置一个 属性 告诉 cxf-xjc-plugin
在 generate-soures
阶段执行,而另一个设置一个属性 告诉 cxf-xjc-plugin
不要执行。
因此,当你想生成类时,你可以用mvn clean install
调用Maven,当你不想生成类时,你可以调用Maven mvn clean install -PnoGenerate
.
这里真正的收获和优势是你不需要在每次决定生成或不生成 类 时更改你的 POM。
我会有另一种方法。
1st) 配置你的 xjc 插件不删除任何文件即:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<clearOutputDir>false</clearOutputDir>
<outputDirectory>${project.build.directory}</outputDirectory>
<sources>
<source> [any xsd] </source>
</sources>
</configuration>
2nd) 使用 maven-clean-plugin 清理 jxc class 在清理阶段生成的目录:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}/generated/src/main/java/...where the generated classes are</directory>
<includes>
<include>**/*.java</include>
</includes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
这对我有用,我希望能有用。
我有一个 Maven 配置文件触发 xsd
和 wsdl
类 的自动生成,如下所示:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>${cxf-xjc-plugin}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/src/main/java</sourceRoot>
<xsdOptions>
//xsds, wsdls etc
</xsdOptions>
</configuration>
<goals>
<goal>xsdtojava</goal>
</goals>
</execution>
</executions>
</plugin>
生成的类转到:target/generated/src/main/java
.
问题:运行 'mvn clean package' 将始终删除那些 类。我该如何预防? clean
是否可以删除 target
目录中除 generated/
目录之外的全部内容?
使用maven-clean-plugin
可以不删除某些目录,但这绝对不是一个好主意:
- 它违反了 Maven 约定
- 它会强制您在每次想要生成 类 时更改 POM
您的确切问题的解决方案(不推荐)
您可以使用 excludeDefaultDirectories
and filesets
参数排除带有 maven-clean-plugin
的目录:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.6.1</version>
<configuration>
<excludeDefaultDirectories>true</excludeDefaultDirectories>
<filesets>
<fileset>
<directory>${project.build.directory}</directory>
<excludes>
<exclude>generated/*</exclude>
</excludes>
</fileset>
</filesets>
</configuration>
</plugin>
请注意,我强烈建议您不要使用此解决方案。
建议的解决方案
您的实际问题不是每次构建时都重新生成 类,因为这会花费很多时间。目标是通过使用自定义配置文件避免生成:
<profiles>
<profile>
<id>noGenerate</id>
<properties>
<xjc.generate>none</xjc.generate>
</properties>
</profile>
<profile>
<id>generate</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<xjc.generate>generate-sources</xjc.generate>
</properties>
</profile>
</profiles>
使用以下插件定义:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>${cxf-xjc-plugin}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>${xjc.generate}</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/src/main/java</sourceRoot>
<xsdOptions>
//xsds, wsdls etc
</xsdOptions>
</configuration>
<goals>
<goal>xsdtojava</goal>
</goals>
</execution>
</executions>
</plugin>
似乎cxf-xjc-plugin
没有任何skip
参数所以当我们想避免执行时,我们不得不求助于将phase
设置为none
(这是一个未记录的功能,但它有效)。
诀窍是定义两个配置文件:一个默认激活,设置一个 属性 告诉 cxf-xjc-plugin
在 generate-soures
阶段执行,而另一个设置一个属性 告诉 cxf-xjc-plugin
不要执行。
因此,当你想生成类时,你可以用mvn clean install
调用Maven,当你不想生成类时,你可以调用Maven mvn clean install -PnoGenerate
.
这里真正的收获和优势是你不需要在每次决定生成或不生成 类 时更改你的 POM。
我会有另一种方法。
1st) 配置你的 xjc 插件不删除任何文件即:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<clearOutputDir>false</clearOutputDir>
<outputDirectory>${project.build.directory}</outputDirectory>
<sources>
<source> [any xsd] </source>
</sources>
</configuration>
2nd) 使用 maven-clean-plugin 清理 jxc class 在清理阶段生成的目录:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}/generated/src/main/java/...where the generated classes are</directory>
<includes>
<include>**/*.java</include>
</includes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
这对我有用,我希望能有用。