首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在maven中的清洁包中保护自动生成的源?

如何在maven中的清洁包中保护自动生成的源?
EN

Stack Overflow用户
提问于 2015-09-25 13:50:57
回答 2查看 3.2K关注 0票数 2

我有一个maven配置文件,它触发xsdwsdl类的自动生成,如下所示:

代码语言:javascript
复制
    <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删除target目录中除generated/目录之外的全部内容?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-25 14:12:37

不使用maven-clean-plugin删除某些目录是可能的,但这绝对不是一个好主意:

  • 这违反了Maven公约
  • 每当您希望生成这些类时,它都会强制您更改POM。

解决你的确切问题(不推荐)

可以使用maven-clean-pluginexcludeDefaultDirectories参数排除具有filesets的目录:

代码语言:javascript
复制
<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>

请注意,我强烈建议您使用此解决方案,而不是而不是

拟议解决方案

您的实际问题不是每次构建时都重新生成类,因为这需要大量时间。因此,目标是通过使用自定义配置文件来避免生成:

代码语言:javascript
复制
<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>

具有以下插件定义:

代码语言:javascript
复制
<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-plugingenerate-soures阶段执行,另一个设置一个属性,告诉cxf-xjc-plugin不要执行。

因此,当您想要生成类时,可以使用mvn clean install调用Maven,当您希望不生成类时,可以使用mvn clean install -PnoGenerate调用Maven。

这里真正的好处和优势是,每次决定生成或不生成类时,都不需要更改POM。

票数 5
EN

Stack Overflow用户

发布于 2017-03-13 15:17:42

我会有另一种方法。

1)将xjc插件配置为不擦除任何文件,即:

代码语言:javascript
复制
<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>

2)使用maven-洁净插件来清除清洁阶段生成的jxc类:

代码语言:javascript
复制
<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>

这对我是有用的,我希望是有用的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32783735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档