从具有多个 Maven 模块中的相对 schemaLocation 的模式中使用 equals() 生成 JAXB 类
Generate JAXB classes with equals() from schemas with relative schemaLocation in multiple Maven modules
我有一个包含 3 个模块的 Maven 项目:schema
、gml
和 adress
。 schema 包含两个 XSD:gmlprofil-1.1.xsd
- 一个简单的 GML 配置文件和 adress.xsd
,它使用相对 schemaLocation 导入 GML 模式,如下所示:
<import schemaLocation="../gml/gmlprofil-1.1.xsd" namespace="http://www.opengis.net/gml/3.2"/>
在 gml
模块和 adress
模块中,我使用 maven-jaxb2-plugin
和 jaxb2-basics
来生成 classes 和 equals()和哈希码()。 gml
模块工作正常,但是当 运行ning adress
时,我得到这个错误:
com.sun.istack.SAXParseException2; IOException thrown when processing "../gml/gmlprofil-1.1.xsd". Exception: java.io.FileNotFoundException: C:\code\gml\gmlprofil-1.1.xsd
很好。救援目录文件!
REWRITE_SYSTEM "../gml/gmlprofil-1.1.xsd" "maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd"
看起来绝对路径解析正常,但随后出现格式错误URL异常。
[DEBUG] Parent resolver has resolved publicId [null], systemId [../gml/gmlprofil-1.1.xsd] to [maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd].
[DEBUG] Resolving systemId [maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd] as Maven dependency resource.
[DEBUG] Resolved dependency resource [Dependency {groupId=com.test, artifactId=schema, version=1.0-SNAPSHOT, type=jar, classifier=null, resource=com/test/schemas/gml/gmlprofil-1.1.xsd}] to resource URL [jar:file:/C:/code/jaxb-test/schema/target/schema-1.0-SNAPSHOT.jar!/com/test/schemas/gml/gmlprofil-1.1.xsd].
[DEBUG] Resolved systemId [maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd] to [jar:file:/C:/code/jaxb-test/schema/target/schema-1.0-SNAPSHOT.jar!/com/test/schemas/gml/gmlprofil-1.1.xsd].
[ERROR] Error while parsing schema(s).Location [ maven:com.test:schema:jar::!/com/test/schemas/adress/adress.xsd{8,97}].
org.xml.sax.SAXParseException; systemId: maven:com.test:schema:jar::!/com/test/schemas/adress/adress.xsd; lineNumber: 8; columnNumber: 97; unknown protocol: maven
...
Caused by: java.net.MalformedURLException: unknown protocol: maven
这是我的 pom adress
:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<bindingDirectory>src/main/resources</bindingDirectory>
<episode>true</episode>
<useDependenciesAsEpisodes>true</useDependenciesAsEpisodes>
<extension>true</extension>
<forceRegenerate>false</forceRegenerate>
<schemaLanguage>XMLSCHEMA</schemaLanguage>
<strict>false</strict>
<verbose>false</verbose>
<catalog>src/main/resources/catalog.cat</catalog>
<args>
<arg>-npa</arg>
<arg>-XsimpleEquals</arg>
<arg>-XsimpleHashCode</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.9.5</version>
</plugin>
</plugins>
<schemas>
<schema>
<dependencyResource>
<groupId>com.test</groupId>
<artifactId>schema</artifactId>
<resource>com/test/schemas/adress/adress.xsd</resource>
</dependencyResource>
</schema>
</schemas>
</configuration>
</plugin>
我尝试了一些解决方案:
- 将 Maven URL 设置为 schemaLocation:
<import schemaLocation="maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd" namespace="http://www.opengis.net/gml/3.2"/>
- 设置绝对 schemaLocation 并相应地更新目录文件:
<import schemaLocation="http://test.com/schemas/gml/gmlprofil-1.1.xsd" namespace="http://www.opengis.net/gml/3.2"/>
REWRITE_SYSTEM "http://test.com/schemas" "maven:com.test:schema:jar::!/com/test/schemas"
正在将 maven-jaxb2-plugin
版本降低到 0.9.1。使用这种方法,我什至不需要目录文件,但是我得到了这个错误:
[错误] 无法执行目标 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.9.1: 在项目地址上生成(默认):目标 org.jvnet 的执行默认值。 jaxb2.maven2:maven-jaxb2-plugin:0.9.1:generate failed: 执行 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.9.1:generate 时缺少必需的 class: com/sun/tools/xjc/model/Aspect
这可以通过交换 -Xequals
和 -XhashCode
而不是 -XsimpleEquals
和 -XsimpleHashCode
来解决。
所有三个解决方案都有效,但 none 是完美的。前两个需要操纵模式,而第三个在生成的 classes 中引入了对 jaxb2-basics-runtime
的不需要的依赖。后者是可以接受的,但如果有人知道如何使用我的设置 运行 simpleEquals,我将不胜感激。
好吧,欢迎来到我的痛苦世界。
您肯定知道 ogc-schema 项目,对吧?
有趣的是,该目录甚至似乎已正确解析。不确定那里发生了什么,但这是我最终发现最有效的解决方案:
编译绝对URL:
<schemas>
<schema>
<url>http://test.com/schemas/adres/adres.xsd</url>
</schema>
</schemas>
使用目录重写
REWRITE_SYSTEM "http://test.com/schemas" "maven:com.test:schema:jar::!/com/test/schemas"
这基本上是您的第三个解决方案,但您不必更改架构。刚从一个绝对URL开始,就会被目录改写
啊,是的:
免责声明 我是 maven-jaxb2-plugin、jaxb2-basics[=45= 的作者]以及上面提到的ogc-schema项目。
顺便问一下,jaxb2-basics-runtime
依赖性有什么不好?
我有一个包含 3 个模块的 Maven 项目:schema
、gml
和 adress
。 schema 包含两个 XSD:gmlprofil-1.1.xsd
- 一个简单的 GML 配置文件和 adress.xsd
,它使用相对 schemaLocation 导入 GML 模式,如下所示:
<import schemaLocation="../gml/gmlprofil-1.1.xsd" namespace="http://www.opengis.net/gml/3.2"/>
在 gml
模块和 adress
模块中,我使用 maven-jaxb2-plugin
和 jaxb2-basics
来生成 classes 和 equals()和哈希码()。 gml
模块工作正常,但是当 运行ning adress
时,我得到这个错误:
com.sun.istack.SAXParseException2; IOException thrown when processing "../gml/gmlprofil-1.1.xsd". Exception: java.io.FileNotFoundException: C:\code\gml\gmlprofil-1.1.xsd
很好。救援目录文件!
REWRITE_SYSTEM "../gml/gmlprofil-1.1.xsd" "maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd"
看起来绝对路径解析正常,但随后出现格式错误URL异常。
[DEBUG] Parent resolver has resolved publicId [null], systemId [../gml/gmlprofil-1.1.xsd] to [maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd].
[DEBUG] Resolving systemId [maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd] as Maven dependency resource.
[DEBUG] Resolved dependency resource [Dependency {groupId=com.test, artifactId=schema, version=1.0-SNAPSHOT, type=jar, classifier=null, resource=com/test/schemas/gml/gmlprofil-1.1.xsd}] to resource URL [jar:file:/C:/code/jaxb-test/schema/target/schema-1.0-SNAPSHOT.jar!/com/test/schemas/gml/gmlprofil-1.1.xsd].
[DEBUG] Resolved systemId [maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd] to [jar:file:/C:/code/jaxb-test/schema/target/schema-1.0-SNAPSHOT.jar!/com/test/schemas/gml/gmlprofil-1.1.xsd].
[ERROR] Error while parsing schema(s).Location [ maven:com.test:schema:jar::!/com/test/schemas/adress/adress.xsd{8,97}].
org.xml.sax.SAXParseException; systemId: maven:com.test:schema:jar::!/com/test/schemas/adress/adress.xsd; lineNumber: 8; columnNumber: 97; unknown protocol: maven
...
Caused by: java.net.MalformedURLException: unknown protocol: maven
这是我的 pom adress
:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<bindingDirectory>src/main/resources</bindingDirectory>
<episode>true</episode>
<useDependenciesAsEpisodes>true</useDependenciesAsEpisodes>
<extension>true</extension>
<forceRegenerate>false</forceRegenerate>
<schemaLanguage>XMLSCHEMA</schemaLanguage>
<strict>false</strict>
<verbose>false</verbose>
<catalog>src/main/resources/catalog.cat</catalog>
<args>
<arg>-npa</arg>
<arg>-XsimpleEquals</arg>
<arg>-XsimpleHashCode</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.9.5</version>
</plugin>
</plugins>
<schemas>
<schema>
<dependencyResource>
<groupId>com.test</groupId>
<artifactId>schema</artifactId>
<resource>com/test/schemas/adress/adress.xsd</resource>
</dependencyResource>
</schema>
</schemas>
</configuration>
</plugin>
我尝试了一些解决方案:
- 将 Maven URL 设置为 schemaLocation:
<import schemaLocation="maven:com.test:schema:jar::!/com/test/schemas/gml/gmlprofil-1.1.xsd" namespace="http://www.opengis.net/gml/3.2"/>
- 设置绝对 schemaLocation 并相应地更新目录文件:
<import schemaLocation="http://test.com/schemas/gml/gmlprofil-1.1.xsd" namespace="http://www.opengis.net/gml/3.2"/>
REWRITE_SYSTEM "http://test.com/schemas" "maven:com.test:schema:jar::!/com/test/schemas"
正在将
maven-jaxb2-plugin
版本降低到 0.9.1。使用这种方法,我什至不需要目录文件,但是我得到了这个错误:[错误] 无法执行目标 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.9.1: 在项目地址上生成(默认):目标 org.jvnet 的执行默认值。 jaxb2.maven2:maven-jaxb2-plugin:0.9.1:generate failed: 执行 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.9.1:generate 时缺少必需的 class: com/sun/tools/xjc/model/Aspect
这可以通过交换
-Xequals
和-XhashCode
而不是-XsimpleEquals
和-XsimpleHashCode
来解决。
所有三个解决方案都有效,但 none 是完美的。前两个需要操纵模式,而第三个在生成的 classes 中引入了对 jaxb2-basics-runtime
的不需要的依赖。后者是可以接受的,但如果有人知道如何使用我的设置 运行 simpleEquals,我将不胜感激。
好吧,欢迎来到我的痛苦世界。
您肯定知道 ogc-schema 项目,对吧?
有趣的是,该目录甚至似乎已正确解析。不确定那里发生了什么,但这是我最终发现最有效的解决方案:
编译绝对URL:
<schemas> <schema> <url>http://test.com/schemas/adres/adres.xsd</url> </schema> </schemas>
使用目录重写
REWRITE_SYSTEM "http://test.com/schemas" "maven:com.test:schema:jar::!/com/test/schemas"
这基本上是您的第三个解决方案,但您不必更改架构。刚从一个绝对URL开始,就会被目录改写
啊,是的:
免责声明 我是 maven-jaxb2-plugin、jaxb2-basics[=45= 的作者]以及上面提到的ogc-schema项目。
顺便问一下,jaxb2-basics-runtime
依赖性有什么不好?