2012-08-15 55 views
10

我有一個基於Maven的項目,我嘗試添加一些由「jaxb2-maven-plugin」Maven插件自動生成的JAXB類。然而,我的第一個切我有一個循環依賴循環:在Maven項目中管理JAXB生成的類

  • 由於這些JAXB類尚未生成,我引用它們的其他來源有編譯錯誤。
  • 由於這些其他源具有編譯錯誤,因此不會生成這些JAXB類。

好像有解決這個兩個明顯的可能性:

  1. 評論時的破環參數,使該項目建立和JAXB類是自動生成的。然後將生成的來源/target複製到/src/main/java中,以便引用它們不會導致編譯錯誤。
  2. 創建一個完全獨立的項目,只包含JAXB的東西。將其作爲依賴項包含在我的主項目中。

我在這裏錯過了什麼嗎?選項#1看起來是平淡無味的......那只是不能是人們使用JAXB的方式。選項#2似乎更合理,但仍然效率低下且麻煩。爲了使用JAXB,我真的必須承擔一個完全獨立的項目的開銷嗎?

開發人員在Maven插件生成的同一個項目中使用了哪些更優雅的方法來引用JAXB生成的類?

UPDATE:按要求,這裏是我的POM的相關部分:

<build> 
    <plugins> 
     <plugin> 
      <!-- configure the compiler to compile to Java 1.6 --> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin>  
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxb2-maven-plugin</artifactId> 
      <version>1.4</version> 
      <executions> 
       <execution> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>xjc</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <!-- The name of your generated source package --> 
       <packageName>com.mypackage</packageName> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

當我運行mvn clean package,我看到了/target子目錄下生成我JAXB來源。但是,那些生成的源不會自動添加到編譯階段的類路徑中。

POST分辨率更新:事實證明,我的編譯問題有更多的事情要做,我是在Eclipse中運行的事實,它的Maven的集成有一些問題,「JAXB2 - Maven的插件」。有關該問題及其解決方案的更多詳細信息,請參閱this StackOverflow question

+0

請張貼POM的相關部分。 – jiggy 2012-08-15 15:42:55

回答

7

我建議你將jaxb生成的類(api)和你的BL類(實現)拆分爲2個maven項目,每個項目分別具有不同的pom.xml,以及具有編譯順序的主根pom.xml。這樣,你將能夠構建api.jar,然後maven會將其安裝在本地repo中,之後可以將其用作實現的依賴項。所以它看起來像:

-API\ 
--pom.xml - for api, jaxb generation 
-IMPL\ 
--pom.xml - for impl, api dependency is here 
pom.xml - main pom.xml with references to the projects above 
+0

謝謝。事實證明,我的問題與Eclipse相關的問題比其他問題更多(請參閱問題底部的更新)。 至於「循環依賴」問題,我決定從首先編寫Java類開始......而不是從XML模式開始並以其他方式開始。然後我將這些模型類放入客戶端JAR(它也在服務器應用程序的類路徑中),並且每個人都很開心。 – 2012-08-17 17:53:16

9

你是如何配置你的jaxb maven插件的?通常它運行在生成源生命週期中,該生命週期來自編譯生命週期之前。所以,當你自己的代碼被編譯時,你的JAXB生成的類應該已經存在了,Maven把它們放在target/generated-source中,並把這個文件夾放到classpath中。

編輯: 這是我的代碼,我們在工作中使用(和按預期工作):

<plugin> 
      <groupId>com.sun.tools.xjc.maven2</groupId> 
      <artifactId>maven-jaxb-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <schemaDirectory>src/main/resources/<companyname>/xsd</schemaDirectory> 
       <includeSchemas> 
        <includeSchema>retrieval.xsd</includeSchema> 
        <includeSchema>storage.xsd</includeSchema> 
       </includeSchemas> 
      </configuration> 
     </plugin> 

顯然,我們用另一種JAXB插件...(另見本主題:Difference of Maven JAXB plugins) 。

+0

我已經更新了原始問題以包含我的POM的插件部分。 – 2012-08-15 17:25:03

3

也許嘗試使用maven-jaxb2-plugin代替:

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.8.2</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

從dfuse的答案是正確的,雖然。任何插件都應該在編譯之前生成源代碼,並且源代碼的生成結果將位於類路徑中。我測試了這兩個插件。是否有可能發佈您的模式,或者至少是您的代碼無法在類路徑中選擇的類型的模式?

+0

我使用並會推薦org.jvnet插件。如果你的問題在星期五還沒有解決,我可以和工作中的poms比較,看看可能缺少的東西。 – 2012-08-15 18:38:06

+0

更正,我不使用該插件(雖然我已經嘗試過)。我在我的答案中發佈了我的代碼。 – 2012-08-17 08:58:31