2011-08-17 37 views
5

我需要使用最新版本的jaxb:2.2.4-1,但maven或maven-jaxb2-plugin似乎從JDK中選擇了一個。如何在maven-jaxb2-plugin中指定JAXB版本?

我試圖指定的版本是這樣的:

<configuration> 
    <specVersion>2.2</specVersion> 
    ... 
</configuration> 

但日誌閱讀:

[INFO] [jaxb2:generate {execution: common}] 
[INFO] Started execution. 
[INFO] JAXB API is loaded from the [jar:file:/opt/jdk1.6.0_24/jre/lib/rt.jar!]. 
[INFO] Detected JAXB API version [2.1]. 

我試圖依賴添加到正確的版本javax.xml.bind中的:JAXB的API和com.sun.xml.bind:jaxb-impl,但這沒有幫助。

<plugins> 
    <plugin> 
     <groupId>org.jvnet.jaxb2.maven2</groupId> 
     <artifactId>maven-jaxb2-plugin</artifactId> 
     <version>0.8.0</version> 

     <dependencies> 
      <dependency> 
       <groupId>javax.xml.bind</groupId> 
       <artifactId>jaxb-api</artifactId> 
       <version>2.2.4</version> 
      </dependency> 

      <dependency> 
       <groupId>com.sun.xml.bind</groupId> 
       <artifactId>jaxb-impl</artifactId> 
       <version>2.2.4-1</version> 
      </dependency> 
     </dependencies> 

     <executions> 
      <execution> 
       <id>common</id> 
       <goals> 
        <goal>generate</goal> 
       </goals> 
       <configuration> 
        <specVersion>2.2</specVersion> 
        ... 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

我也嘗試過使用maven-jaxb22插件,但它也沒有工作。

回答

2

以下代碼是從netbeans生成的默認webapp進行調整的。它使用依賴插件將jar複製到一個臨時文件夾中,並將該文件夾指定爲編譯器的授權目錄,以覆蓋jdk中的實現。

<properties> 
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
</properties> 

... 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <compilerArguments> 
        <endorseddirs>${endorsed.dir}</endorseddirs> 
       </compilerArguments> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${endorsed.dir}</outputDirectory> 
         <silent>true</silent> 
         <artifactItems> 
          <artifactItem> 
           <groupId>javax.xml.bind</groupId> 
           <artifactId>jaxb-api</artifactId> 
           <version>2.2.4</version> 
           <type>jar</type> 
          </artifactItem> 
          <artifactItem> 
           <groupId>com.sun.xml.bind</groupId> 
           <artifactId>jaxb-impl</artifactId> 
           <version>2.2.4-1</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

有趣的想法。我會試試看。 同時,我恢復使用antrun ...它的作品,但它不是很好。 – ivant

+0

我也嘗試了這種方法,甚至使用了特定的maven-jaxb22插件,但我仍然獲得了JDK檢測版本。 – Lyle

0

我嘗試使用喬恩的解決方案,但它看起來像Maven的JAXB2-插件說幹就幹,反正使用的rt.jar的版本,我從插件訴說消息:[INFO] JAXB API是從[jar:file:/ C:/jdk1.6.0_25/jre/lib/rt.jar!]加載。

我的解決方案不成功的版本是它如何使用依賴插件略有不同,但就是這樣成功構建的一個部分......

<properties> 
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
    <v.jaxb2-api>2.2.4</v.jaxb2-api> 
    <v.jaxb2-impl>2.2.4-1</v.jaxb2-impl> 
    <v.jaxb2-xjc>2.2.4-1</v.jaxb2-xjc> 
    <v.jaxb2-basics-jaxb>2.1.13.MR2</v.jaxb2-basics-jaxb> 
</properties> 
... 
<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>validate</phase> 
      <goals> 
      <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
      <outputDirectory>${endorsed.dir}</outputDirectory> 
      <excludeTransitive>true</excludeTransitive> 
      <includeArtifactIds>jaxb-api,jaxb-impl</includeArtifactIds> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.3.2</version> 
     <configuration>       
     <source>1.6</source> 
     <target>1.6</target> 
     <fork>true</fork> 
     <meminitial>256m</meminitial> 
     <maxmem>768m</maxmem> 
     <compilerArguments> 
      <endorseddirs>${endorsed.dir}</endorseddirs> 
     </compilerArguments> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
+0

嘗試使用調試信息(選項-X)運行maven以查看會發生什麼。這可能會讓你知道問題出在哪裏以及如何解決問題。 – ivant

0

嘿嘿只是我想保存的時間人。
爲jaxb-impl工作的人,版本jaxb-impl 2.2.4-1,旨在修復版本2.2.4的bug,META-INF文件夾下istack-commons-runtime的pom包含當它應該是2.4,因爲這個版本不是快照而引用它的父pom 2.4-SNAPSHOT。

<parent> 
    <groupId>com.sun.istack</groupId> 
    <artifactId>istack-commons</artifactId> 
    <version>2.4-SNAPSHOT</version> 
</parent> 

,所以如果你不想與快照工作,你會與此錯誤粉碎,除非你想在你的本地庫添加一切你可能需要把這個版本手動更新到在瓶子的POM。 歡呼聲, Manuel。