6

我需要使用最新版本的 jaxb:2.2.4-1,但 maven 或 maven-jaxb2-plugin 似乎从 JDK 中选择了一个。

我尝试像这样指定版本:

<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-plugin 但它也没有用。

4

3 回答 3

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>
于 2011-08-18T12:47:58.173 回答
0

我尝试使用 Jörn 的解决方案,但看起来 maven-jaxb2-plugin 继续使用 rt.jar 版本,因为我从插件中得到了明显的消息:[INFO] JAXB API is loaded from the [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>
于 2011-10-13T21:10:06.470 回答
0

嘿只是我想节省人们的时间。
对于从事 jaxb-impl 工作的人,版本 jaxb-impl 2.2.4-1 旨在修复版本 2.2.4 的错误,META-INF 文件夹下 istack-commons-runtime 的 pom 包含参考当它应该是 jsut 2.4 时,它的父 pom 2.4-SNAPSHOT,因为这个版本不是快照。

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

因此,如果您不想使用快照,则会出现此错误,除非您想在本地存储库中添加所有内容,否则您可能必须手动将此版本更新到 jar 上的 pom 中。干杯,曼努埃尔。

于 2012-01-12T01:24:53.600 回答