2011-08-17 3 views
5

최신 버전 jaxb : 2.2.4-1을 사용해야하지만, maven 또는 maven-jaxb2-plugin은 JDK에서 하나를 선택하는 것으로 보입니다. maven-jaxb2-plugin에서 JAXB 버전을 지정하는 방법은 무엇입니까?

는이 같은 버전 지정 시도 :

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

을하지만, 로그 읽기 : JAXB-API :

[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의 올바른 버전에 종속성을 추가하려 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-plugin을 사용해 보았지만 작동하지 않았습니다.

답변

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-plugin을 사용했지만 여전히 JDK에서 감지 된 버전을 얻고있다. – Lyle

0

내가 요른의 솔루션을 사용하려고하지만 받는다는 - 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에서 작업하는 사람들, 버전 2.2.4의 버그를 수정하기위한 버전 jaxb-impl 2.2.4-1, META-INF 폴더 아래 istack-commons-runtime의 pom 이 버전이 스냅 샷이 아니기 때문에 부모 pom 2.4-SNAPSHOT에 대한 참조는 jsut 2.4 여야합니다. 당신이 당신의 로컬 저장소에있는 모든 파일을 추가 할 경우가 아니면,이 오류와 함께 분쇄 할 것이다 스냅 샷 작업을하지 않으려면

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

그래서 당신은 항아리에 치어에 수동으로 버전을 업데이트해야 할 수 있습니다. 건배, 마누엘.