2

ソースの生成にjaxb2-maven-plugin (mojohaus one)を使用する Maven プロジェクトがあります。

Jenkins で呼び出すと、生成されたすべてのクラスが重複しているため失敗します。

いくつかの調査の後、maven-compiler-plugin のこの構成まで追跡できました

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ my-maven-module ---
[DEBUG] Using compiler 'javac'.
[DEBUG] Source directories: [/var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/src/main/java
 /var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java
 /appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java]

表示されるとおり、/var/lib/jenkinsフォルダは にリンクされてい/appli/projects/jenkinsます。そして、jaxb2-maven-plugin で設定した構成は次のとおりです。

+=================== [16 XJC Arguments]
|
| [0]: -xmlschema
| [1]: -encoding
| [2]: UTF-8
| [3]: -p
| [4]: fr.erdf.sge.f5.asm
| [5]: -d
| [6]: /var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java
| [7]: -classpath
| [8]: /logiciels/maven/apache-maven-3.1.1/conf/logging/
| [9]: -extension
| [10]: -episode
| [11]: /appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java/META-INF/sun-jaxb.episode
| [12]: -Xvisitor
| [13]: -Xvisitor-package:com.massfords.humantask
| [14]: m-maven-supermodule/my-maven-module/src/main/resources/xsd/asm/asmbuilder.xsd
| [15]: m-maven-supermodule/my-maven-module/src/main/resources/xsd/import_export_xml.xsd
|
+=================== [End 16 XJC Arguments]

違いはすでにここにあることがわかります。引数は、-d引数が参照する/var/lib/jenkins場所-episodeを参照し/appli/projects/jenkins/ます。

ここで述べたように、生成されたソース フォルダーが Jenkins パスに追加されるのは、このプラグインの実行の最後です。

[DEBUG] Adding existing JAXB outputDirectory [/appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java] to Maven's sources.

編集1 jaxb2プラグインの構成は

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <configuration>
                <arguments>
                    <argument>-Xvisitor</argument>
                    <argument>-Xvisitor-package:com.massfords.humantask</argument>
                </arguments>
                <sources>
                    <source>${project.basedir}/src/main/resources/xsd/import_export_xml.xsd</source>
                    <source>${xsd}</source>
                </sources>
                <packageName>myPackage</packageName>
                <outputDirectory>${jaxb.src}</outputDirectory>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>com.massfords</groupId>
                    <artifactId>jaxb-visitor</artifactId>
                    <version>2.0</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>xjc</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

jaxb 生成フォルダーにはクラスが 1 回だけ含まれていることに注意してください。その構成を複製するのは、パスを「絶対に」解決しない構成です。

4

1 に答える 1

3

ご覧のとおり、2.2 と 2.3 (2016 年 9 月にリリースされた) の間で jaxb2-maven-plugin の動作に違いがあります。実際、2.3 ではAbstractJaxbMojo、次のコードを使用しています。

    // 4) If the output directories exist, add them to the MavenProject's source directories
    if(getOutputDirectory().exists() && getOutputDirectory().isDirectory()) {

        final String canonicalPathToOutputDirectory = FileSystemUtilities.getCanonicalPath(getOutputDirectory());

        if(log.isDebugEnabled()) {
            log.debug("Adding existing JAXB outputDirectory [" + canonicalPathToOutputDirectory
                    + "] to Maven's sources.");
        }

        // Add the output Directory.
        getProject().addCompileSourceRoot(canonicalPathToOutputDirectory);
    }

残念ながら、 には同等のコードはありませんXjcMojo#addGeneratedSourcesToProjectRoot()

    getProject().addCompileSourceRoot(getOutputDirectory().getAbsolutePath());

結果として、絶対パスが 1 回追加され、正規パスが後で追加されるため、バグが発生します。

それを考慮すると、最善の解決策は mavenversionプロパティを設定することでした:

<version>2.2</version>

明らかに、そのためのバグレポートがあります。

于 2016-09-26T14:10:29.453 に答える