【问题标题】:Maven : exclude target/generated-sources from compilationMaven:从编译中排除目标/生成源
【发布时间】:2018-08-13 10:13:58
【问题描述】:

这个问题,只是为了确保我的解释是正确的:

我正在使用 Mojohaus jaxb2-maven-plugin 从 .xsd 文件生成 java 类,默认情况下它会将它们放在目标/生成源中

现在,我想在源代码控制中跟踪这些类(目标当然不包括在内),有一天我可能会用注释或一行代码稍微定制一个,我什至可能会更改我的类生成插件, 那我把这些类和包复制到 src/main/java 怎么办

当我尝试编译时,这让 Maven 感到不安,因为他将“目标/生成源”视为源目录,并且他两次找到所有类。据我了解,我可以在源目录中排除类,但我不能从 Maven 构建中删除源目录,对吗?

所以唯一的解决方案是配置我的 jaxb2 插件以在其他地方生成类,对吧?

更新

好吧,这不像我想的那样工作,如果我更改了我的 jaxb 插件的 outputDirectory,它仍然被 Maven 作为源目录包含在内,我不知道为什么。

    <configuration>      
                <outputDirectory>${project.build.directory}/tatata/jaxb</outputDirectory>
    </configuration>

更新 2 :解释是插件在构建的 generate-sources 阶段将 outputDirectory 添加为 maven 源目录,它不是可选的或可定制的。

【问题讨论】:

  • 请说明您使用的是哪个插件,maven-jaxb2-plugin 或 Codehaus jaxb2-maven-plugin
  • 您的意思比原始问题中的“我正在使用 Mojohaus jaxb2-maven-plugin 生成 java 类”更清楚? ;) Codehaus 已于 3 年前关闭:mojohaus.org
  • 是的,稍微清楚一点。 Mojohaus 插件的名称是 maven-jaxb2-plugin ,而您指定了 jaxb2-maven-plugin ,这是 Codehaus 插件的名称。所以你可以理解@lexicore 的澄清请求。即使 Codehaus 关闭,codehaus 插件仍然可用。也可以在这里查看:stackoverflow.com/a/9199036/48082

标签: maven jaxb maven-3 jaxb2-maven-plugin


【解决方案1】:

Lexicore 的回答是一个有趣的线索,但我的问题是关于我目前使用的插件,而不是如何使用其他插件。

所以这里是 Mojohaus 插件的解决方法:您可以默认跳过 generate-sources(当您的模型每周更改一次,然后每年更改一次时,无需在每次构建时执行此任务),并且仅在需要时使用专用的 Maven 配置文件触发它:How to skip generate-sources in Maven

【讨论】:

    【解决方案2】:

    首先,不要将生成代码添加到源代码管理中。不要手动修改。你会遇到麻烦。相信我,我已经看过太多次了。一个新版本的架构,你就迷路了。


    好的,现在回答你的问题。

    使用maven-jaxb2-plugin,您可以关闭将生成目录添加为编译源根目录:

    <configuration>
        <addCompileSourceRoot>false</addCompileSourceRoot>
    </configuration>
    

    免责声明:我是maven-jaxb2-plugin的作者。

    【讨论】:

    • 是的,我不得不说你的插件看起来比另一个更灵活,我可能会切换到它。现在关于对生成的代码进行版本控制,只是因为生成部分会在几次迭代后停止,并且之后发生的所有微小更改都将手动处理。只是一种高效的工作方式,避免过多不必要的绑定配置,以及在任何 maven 插件升级或 maven 升级破坏构建时跟踪工作源的方法(见过太多次;)
    【解决方案3】:

    您始终可以在 pom 配置文件中指定目标目录(generateDirectory),如下所示。希望对你有帮助

    `

    <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.12.3</version>
            <executions>
                                <execution>
                                    <goals>
                                        <goal>generate</goal>
                                    </goals>
                                </execution>
                            </executions>
                            <configuration>
                                <schemaLanguage>WSDL</schemaLanguage>
                                <generateDirectory>${basedir}/src/main/java</generateDirectory>
                                <generatePackage>com.myproj.proxy</generatePackage>
                                <schemas>
                                    <schema>
                                        <!-- <url>${project.basedir}/src/main/resources/wsdl/test.wsdl</url> -->
                                        <fileset>
                                            <!-- Defaults to schemaDirectory. -->
                                            <directory>${basedir}/src/main/resources/wsdl</directory>
                                            <!-- Defaults to schemaIncludes. -->
                                            <includes>
                                                <include>*.wsdl</include>
                                            </includes>
                                        </fileset>
                                    </schema>
                                </schemas>
                            </configuration>
                        </plugin>
    

    `

    【讨论】:

    • 是的,你可以,但它解决了主要问题吗?我刚刚完成了(见更新),它并没有改变任何东西。
    • 您可能不想为每个 Maven 构建生成存根,您可以将生成目标设置为不同的配置文件。当您运行此配置文件时,请清理您的目标目录。
    • 请注意maven-jaxb2-plugin 不是jaxb2-maven-plugin
    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 2011-05-06
    • 1970-01-01
    • 2014-03-09
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多