2016-09-26 47 views
2

我有一個maven項目,其中jaxb2-maven-plugin (mojohaus one)用於生成源。如何檢測兩個linux路徑何時引用maven中的同一個文件?

當在Jenkins上調用時,由於所有生成的類都被複制,它失敗。

一些調查後,我可以追查到該配置在Maven的編譯器插件

[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的插件,我們設定的配置是

+=================== [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/

而且它在這個插件執行所生成的源文件夾將被添加到詹金斯路徑的端部,如下所述

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

EDIT 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生成文件夾只包含一次類。我其實是配置,它不能解決路徑「絕對」,它重複該配置。

+0

我不確定我是否理解「所有生成的類正在被複制」。該插件在運行前會默認刪除生成的類(請參閱[clearOutputDir](http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/xjc-mojo.html#clearOutputDir))。你能發佈你的錯誤信息,以及你的POM配置嗎? – Tunaki

回答

2

看起來,jaxb2-maven-plugin在2.2和2.3之間的行爲方式有所不同(它是在16年9月發佈的)。事實上,在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()); 

因此,絕對路徑添加一次,之後添加規範的路徑,因此錯誤。

考慮,最好的解決辦法是設置行家version屬性:

<version>2.2</version> 

顯然,有a bug report for that

相關問題