3

我正在尝试通过 hyperjaxb 运行真正的模式。我已经使用 jaxb 反复测试了架构,并且 jaxb 每次都正确导入架构。但是,当我尝试让 hyperjaxb 从同一架构生成带有 hibernate 注释的 java 类时,我收到以下错误:

[ERROR] Error while parsing schema(s).Location [ file:/C:/path/to/src/main/resources/schema.xsd{4,32}].
org.xml.sax.SAXParseException; systemId: file:/C:/path/to/src/main/resources/schema.xsd;  
lineNumber: 4; columnNumber: 32; 
Using "http://annox.dev.java.net" customizations requires the "-Xannotate" switch 
to enable this plug-in.

我已经用谷歌搜索了这个错误消息并阅读了其他关于它的帖子,但没有找到任何解决它的干净说明。我找到的最接近的是这篇文章,它说 annox 插件is activated by the -Xannotate command-line argument

我阅读了这个链接,但是在 xsd 文件中添加以下内容并没有消除错误,可能是因为在任何地方xsd都没有使用jaxb前缀。

xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.1" 
xmlns:annox="http://annox.dev.java.net" 
jaxb:extensionBindingPrefixes="annox"

我已经上传了一个包含所有相关材料的 zip 文件,以便快速将问题重现到此链接。它是项目的 zip 文件,包括预期的模式。重现问题所需要做的就是将命令行导航到解压缩项目的根目录并键入mvn clean install以重现错误。

如何解决此错误?


编辑:

我已经尝试将以下内容添加到 pom.xml 中的插件配置中,但到目前为止还没有成功。

<args>
    <arg>-Xannotate</arg>
</args>  

第二次编辑:

我在 中添加了@lexicore 的建议pom.xml,但结果是 a null pointer exception,您可以通过单击此链接阅读。为了促进hyperjaxb其他人更容易使用,我pom.xml 在此链接中包含了全部当前内容。这个修改pom.xml后的 zip 文件和上面的 zip 文件一起足以在几分钟内重现问题。这是配置问题还是错误?

4

3 回答 3

3

为了新用户的兴趣,我现在将回答这个特定的问题。

如果您看到报告的错误:

Using "http://annox.dev.java.net" customizations requires the "-Xannotate"
switch to enable this plug-in.

这意味着,您必须包含“-Xannotate”开关才能启用此插件。请参阅首页上的文档jaxb2-annotate-plugin

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <configuration>
        <extension>true</extension>
        <args>
            <arg>-Xannotate</arg>
        </args>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics-annotate</artifactId>
            </plugin>
            <!-- Add the dependencies with your annotations as 'plugins' below -->
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-annotate-plugin-test-annox-annotations</artifactId>
            </plugin>
        </plugins>
    </configuration>
</plugin>

看到-Xannotate开关了吗?就是这个。

jaxb2-annotate-plugin可以以maven-hyperjaxb3-plugin同样的方式使用。这是Hyperjaxb测试的一个示例

        <plugin>
            <groupId>org.jvnet.hyperjaxb3</groupId>
            <artifactId>maven-hyperjaxb3-plugin</artifactId>
            <configuration>
                <postArgs>
                    <arg>-Xannotate</arg>
                </postArgs>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-search</artifactId>
                    <version>3.0.0.GA</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-annotations</artifactId>
                    <version>3.5.6-Final</version>
                </dependency>
            </dependencies>
        </plugin>

(您不需要包含jaxb2-annotate-plugin,因为它已经被maven-hyperjaxb3-plugin自动包含在内。)

于 2014-10-17T19:43:47.493 回答
2

你应该删除这个插件<artifactId>maven-hyperjaxb3-plugin</artifactId>

        <plugin>
            <groupId>org.jvnet.hyperjaxb3</groupId>
            <artifactId>maven-hyperjaxb3-plugin</artifactId>
            <version>0.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <extension>true</extension>
                <roundtripTestClassName>RoundtripTest</roundtripTestClassName>
            </configuration>
        </plugin>
于 2014-10-17T18:40:00.000 回答
1

考虑一下这个警告,我必须在上一个问题中添加到Xstian 的答案中:

警告

此解决方法根本不使用 Hyperjaxb。此解决方法使用jaxb2-annotate-plugin来添加 JPA 注释。这是通常由 Hyperjaxb 执行的任务。

也就是说,如果您选择使用此解决方法,您将完全离开 Hyperjaxb 轨道。jaxb2-annotate-plugin如果您使用 Hyperjaxb,则不需要,反之亦然,如果您使用jaxb2-annotate-plugin.

但是请注意,jaxb2-annotate-plugin唯一一项非常肤浅的任务是添加您在绑定文件中显式配置的注释。另一方面,Hyperjaxb 对您的模式模型进行了非常深入和彻底的分析,并自动生成合理的 JPA 注释。在某些情况下,Hyperjaxb 甚至必须扩充生成的 JAXB 代码以使其与 JPA 兼容。这些是超出范围的功能jaxb2-annotate-plugin

因此,如果任务是在模​​式派生类中生成 JPA 注释,您可以使用 Hyperjaxb 或jaxb2-annotate-plugin。同时做这两件事是完全错误的。

我已将这个特定问题重新annox标记为正确的标签。Annox是背后的库jaxb2-annotate-pluginannox标签通常与jaxb2-annotate-plugin像你这样的相关问题相关联。

于 2014-10-17T19:36:33.700 回答