当前位置: 首页 > 知识库问答 >
问题:

从多个Maven模块中具有相对schemaLocation的模式中生成具有equals()的JAXB类

晋俊贤
2023-03-14

我有一个Maven项目,包含三个模块:schemagmladdress。模式包含两个XSD:gmlprofil-1.1。xsd-一个简单的GML配置文件地址。xsd使用相对模式位置导入GML模式,如下所示:

<import schemaLocation="../gml/gmlprofil-1.1.xsd" namespace="http://www.opengis.net/gml/3.2"/>

gml模块和address模块中,我使用maven-jaxb2-pluginjaxb2 basics来生成带有equals()和hashCode()的类。gml模块工作正常,但在运行address时,我遇到以下错误:

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"

看起来绝对路径已解决,但随后出现了畸形的异常。

[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:

  <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>

我尝试过一些解决方案

  1. 将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"/>
<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。使用此方法,我甚至不需要曲库文件,但是我得到了这个错误:

[错误]无法执行目标组织。jvnet。jaxb2。maven2:maven-jaxb2-plugin:0.9.1:generate(default)on project address:target org的执行默认值。jvnet。jaxb2。maven2:maven-jaxb2-plugin:0.9.1:generate失败:执行org时缺少必需的类。jvnet。jaxb2。maven2:maven-jaxb2-plugin:0.9.1:generate:com/sun/tools/xjc/model/Aspect

这可以通过交换-Xequals-XhashCode来解决,而不是-XsimpleEquals-XsimpleHashCode

这三种解决方案都有效,但没有一种是完美的。前两种方法需要操作模式,而第三种方法在生成的类中引入了对jaxb2 basics runtime的不必要的依赖。后者是可以接受的,但如果有人知道如何使用我的设置运行SimpleQuals,我将不胜感激。

共有1个答案

戚学
2023-03-14

欢迎来到我的痛苦世界。

你肯定知道ogc模式项目,对吧?

有趣的是,曲库甚至看起来是正确的。不确定那里发生了什么,但这是我最终发现最有效的解决方案:

>

  • 编译绝对URL:

            <schemas>
                <schema>
                    <url>http://test.com/schemas/adres/adres.xsd</url>
                </schema>
            </schemas>
    

    使用曲库重写

    “重写系统”http://test.com/schemas“maven:com。测试:schema:jar:/com/test/schemas“

    这基本上是第三种解决方案,但不必更改模式。只需从绝对URL开始,它就会被目录重写。

    啊,是的:

    免责声明我是maven-jaxb2-plugin、jaxb2基础知识以及上述ogc模式项目的作者。

    顺便问一下,jaxb2基础运行时依赖项有什么不好的地方?

  •  类似资料:
    • 我有一个gradle android项目,有两个模块: 穿 在我的gradle配置中,我有不同的构建类型。默认设置(debug和release,每个都有自定义设置)以及dev和beta构建类型(也有自定义签名、自定义proguard和自定义applicationIdSuffix)。 我现在想做的是使用构建类型测试版(gradle清洁组件测试版)构建应用程序包。这就开始在测试版中构建应用程序,看到它

    • 我有一个带有多个模块的gradle(Android)库,有些模块依赖于其他模块(与这里的答案非常相似)https://stackoverflow.com/a/41761846/906362) 这对开发很有用,因为我可以对任何模块进行更改,并看到它们反映在其他模块上。但是要将构建发布到,我需要依赖项作为它们的在线版本。比如: 因此,当它被添加到项目中时,它正确地引用了在上找到的版本,而不是在使用时添

    • 问题内容: 我想将一个Web服务URL请求表示为一个对象,并发现在继承层次结构中可能有很多通用参数。一个请求可以有很多参数,一些是必选参数,而其他是可选参数,我相信Bloch的Builder模式是一个不错的选择,它可以使用流畅的接口模拟命名参数。 具体来说,我正在设计Google Maps网络服务API,该API具有常规的网络服务请求 和是必填参数,也是必填参数。还有一个可选参数。 每个服务都有其

    • 我目前正在使用maven-jaxb2-plugin v0.13.3。 插件配置有多个执行,每个执行都处理wsdl文件。其中有几个是完全独立的,但有几个只是同一企业中不同的wsdl,其模式导入公共的基本模式。 请注意,我无法更改WSDL或模式。 原始代码使用设置为true的“forceRegen”,以及所有写入相同目标目录的代码。这在命令行构建中运行良好,但正如许多人现在所知,这会导致Eclipse

    • 我尝试使用thajaxb来整理xml,我使用xjc命令从xsd文件order.xsd生成java类 我得到了许多带注释的类,但没有一个@XmlRootElement(name="Order"),也没有名为Order的类

    • 问题内容: 是否可以从多个源文件中构建一个内核模块,这些源文件中的一个与模块具有相同的名称? 例如:我要使用以下源文件构建“ mymodule.ko”: mymodule.c mymodule_func.c 这个makefile不起作用: 谢谢 问题答案: 我找到了解决方案,将源文件放在一个子文件夹中: 生成文件 src / mymodule.c src / mymodule_func.c