我试图通过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.
我已经搜索了此错误消息并阅读了有关它的其他帖子,但没有找到任何解决它的干净说明。我找到的最接近的是this article,它表示annox插件is activated by the -Xannotate command-line argument
。
我读了this link,但是将以下内容添加到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文件,以便快速重现问题to this link。它是项目的zip文件,包括预期的架构。要重现问题,您只需将命令行导航到解压缩项目的根目录,然后键入mvn clean install
即可重现错误。
如何解决此错误?
我已经尝试在pom.xml中添加以下插件配置,但到目前为止还没有成功。
<args>
<arg>-Xannotate</arg>
</args>
我将@lexicore的建议添加到pom.xml
,但结果是null pointer exception
,您可以阅读by clicking on this link。为了促进其他人更轻松地使用hyperjaxb
,我将包含最新的pom.xml
at this link。同时,这个修订后的pom.xml
和上面的zip文件足以在几分钟内重现问题。这是配置问题还是错误?
答案 0 :(得分: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>
答案 1 :(得分:2)
我现在将针对新用户的兴趣回答这个具体问题。
如果您看到报告的错误:
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
相同的方式使用。这是来自an example的Hyperjaxb tests:
<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
,因为它已自动包含在{{1}}中。)
答案 2 :(得分:1)
请考虑在上一个问题中我必须添加到Xstian's answer的警告:
警告强>
此解决方法根本不使用Hyperjaxb。此解决方法使用
jaxb2-annotate-plugin
添加JPA注释。这是一项通常由Hyperjaxb执行的任务。也就是说,如果您选择使用此解决方法,则完全退出Hyperjaxb轨道。如果使用Hyperjaxb,则不需要
jaxb2-annotate-plugin
,反之亦然,如果使用jaxb2-annotate-plugin
添加注释,则不需要Hyperjaxb。但要注意,
jaxb2-annotate-plugin
只能添加您在绑定文件中明确配置的注释,这是一项非常肤浅的任务。另一方面,Hyperjaxb对您的模式模型进行了非常深入和全面的分析,并自动生成合理的JPA注释。在某些情况下,Hyperjaxb甚至必须扩充生成的JAXB代码以使其与JPA兼容。这些功能超出了jaxb2-annotate-plugin
的范围。
因此,如果任务是在模式派生类中生成JPA注释,则使用EITHER Hyperjaxb OR jaxb2-annotate-plugin
。在同一时间做这两件事是完全错误的。
我已将此特定问题重新标记为annox
,因为它是正确的标记。 Annox是jaxb2-annotate-plugin
背后的库,annox
代码通常与jaxb2-annotate-plugin
相关联,与您的相关问题相关联。