【问题标题】:How to make JAXB to annotate and provide equlas/hash code implementation如何让 JAXB 注释并提供 equlas/hash 代码实现
【发布时间】:2015-07-26 18:08:27
【问题描述】:

我正在尝试使用 JAXB 从 WSDL 生成类,这些类使用 Jsr303Annotations 进行注释并提供 equals 和 hashcode 的实现。

这两个单独工作,但是当我尝试同时满足这两个要求时,我得到了错误:

在“构建工作区”期间发生内部错误。 com.sun.tools.xjc.Plugin: Provider org.jvnet.jaxb2_commons.plugin.fixjaxb1058.FixJAXB1058Plugin 无法实例化: java.lang.NoClassDefFoundError: org/jvnet/jaxb2_commons/reflection/util/Accessor p>

有人能告诉我如何配置 JAXB 来完成这两项工作吗?

下面是我的尝试:

<plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate-wsdl</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <schemaDirectory>src/main/resources</schemaDirectory>
                            <schemaIncludes>
                                <include>*.wsdl</include>
<!--                                <include>*.xsd</include> -->
                            </schemaIncludes>
<!--                            <forceRegenerate>true</forceRegenerate> -->
                            <!-- <removeOldOutput>true</removeOldOutput> -->
                            <!-- <cleanPackageDirectories>true</cleanPackageDirectories> -->
                            <strict>true</strict>
                            <extension>true</extension>
                            <args>
                                <arg>-XJsr303Annotations</arg>
                                <arg>-Xannotate</arg>
                                <arg>-Xequals</arg>
                                <arg>-XhashCode</arg>
                            </args>
                            <plugins>
                                <plugin>
                                <groupId>org.jvnet.jaxb2_commons</groupId>
                                <artifactId>jaxb2-basics-annotate</artifactId>
                                <version>0.6.3</version>
                                </plugin>
                                <plugin>
                                    <groupId>org.jvnet.jaxb2_commons</groupId>
                                    <artifactId>jaxb2-basics</artifactId>
                                    <version>0.9.4</version>
                                </plugin>
                                <plugin>
                                    <groupId>com.github.krasa</groupId>
                                    <artifactId>krasa-jaxb-tools</artifactId>
                                    <version>1.1</version>
                                </plugin>
                            </plugins>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

编辑:我尝试使用的相关依赖项:

        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics-runtime</artifactId>
            <version>0.9.4</version>
        </dependency>

<!--        <dependency> -->
<!--            <groupId>org.jvnet.jaxb2_commons</groupId> -->
<!--            <artifactId>jaxb2-basics-annotate</artifactId> -->
<!--            <version>1.0.0</version> -->
<!--        </dependency> -->


<!--        <dependency> -->
<!--        <groupId>org.jvnet.jaxb2_commons</groupId> -->
<!--        <artifactId>jaxb2-commons-lang</artifactId> -->
<!--        <version>2.3</version> -->
<!--        </dependency> -->

只有第一个依赖和插件的组合才能产生结果。

如果我包含其他 2 个依赖项,那么项目中的每个依赖项都会缺少 artifact -id 消息。

注解插件无需显式依赖即可工作,当不使用 equals/hashcode 插件时,反之亦然。

编辑:最终解决方案,以防有人陷入同一问题

因此需要将注解和 equals/hash 代码插件分开执行,这解决了所有问题。

【问题讨论】:

  • 想解释一下为什么这是题外话?由于我对 maven 还很陌生,所以我不知道这些插件需要执行两次才能工作,也不是我可以谷歌搜索的信息。
  • 我刚刚解决了我们的问题
  • 您能否添加一个答案,说明您如何分离两个插件的执行。我也遇到了同样的问题,我无法将它分成两个不同的执行

标签: java xml jaxb


【解决方案1】:

找到了解决办法。这个插件需要另外一个依赖:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.12.3</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>                             
        <generatePackage>com.argonio.fias.entity</generatePackage>                       
        <schemaDirectory>src/main/resources/xsd</schemaDirectory>
        <readOnly>true</readOnly>
        <removeOldOutput>true</removeOldOutput>
        <verbose>true</verbose>
        <extension>true</extension>
        <args>
            <arg>-no-header</arg>
            <arg>-Xxew</arg>
            <arg>-Xxew:instantiate lazy</arg>
            <arg>-Xxew:plural</arg>
            <arg>-Xequals</arg>
        </args>
        <plugins>
            <plugin>
                <groupId>com.github.jaxb-xew-plugin</groupId>
                <artifactId>jaxb-xew-plugin</artifactId>
                <version>1.5</version>
            </plugin>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics</artifactId>
                <version>0.9.4</version>
            </plugin>
        </plugins>
    </configuration>
    <dependencies>
        <!-- This dependency is required to execute the plugin -->
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics-tools</artifactId>
            <version>0.9.4</version>
        </dependency>
    </dependencies>
</plugin>

【讨论】:

    【解决方案2】:

    尝试添加此依赖项。顺便说一句,你的 0.6.3 版本似乎很低。

    <dependency>
        <groupId>org.jvnet.jaxb2_commons</groupId>
        <artifactId>jaxb2-commons-lang</artifactId>
        <version>2.3</version>
    </dependency>
    

    【讨论】:

    • 稍后我会试试这个并告诉你
    • 尝试 0.9.4 版本作为所有其他 jaxb2 依赖项。
    • 我试过 1.0.0 和 1.0.1 版本,没有 0.9.4 版本的注解:mvnrepository.com/artifact/org.jvnet.jaxb2_commons/…
    • 所以我已经修复了代理问题,并更新了所有插件并添加了该依赖项。仍然没有运气:(
    【解决方案3】:

    @Viacheslav 的答案是正确的。但请注意,您还需要为项目添加依赖项:

    <dependency>
        <groupId>org.jvnet.jaxb2_commons</groupId>
        <artifactId>jaxb2-basics-runtime</artifactId>
        <version>0.9.4</version> <!-- same as jaxb2-basics plugin version -->
    </dependency>     
    

    详情请见http://confluence.highsource.org/display/J2B/JAXB2+Basics+Plugins

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 2011-06-20
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2011-11-20
      • 2021-07-05
      相关资源
      最近更新 更多