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

Maven Jaxb生成在编译依赖于多个模块的模块时失败

吕作人
2023-03-14

我有一个由多个模块组成的Eclipse Maven项目,其中一些包含我想(使用Jaxb)为其生成类的Xml模式。我的项目布局如下:

schemas\core (pom)
schemas\core\types (jar)
schemas\vehicle (pom)
schemas\vehicle\automobile (jar)
schemas\vehicle\civic (jar)

包含架构的项目有:

schemas\core\types (xsd\types.xsd)
schemas\vehicle\automobile (xsd\automobile.xsd)
schemas\vehicle\civic (xsd\civic.xsd)

某些模块包含从其他模块导入架构的架构:

automobile.xsd imports types.xsd
civic.xsd imports types.xsd, automobile.xsd

由于模式位于不同的项目中,我使用类路径目录解析器和目录文件来解析模式的位置。

automobile项目依赖于types项目中的模式。下面是其目录文件(catalog.xml)中的条目:

<rewriteSystem systemIdStartString="http://schemas/core/types/" rewritePrefix="classpath:xsd/" />

请注意使用classpath:xsd/告诉目录解析器在类路径上查找模式。

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.3</version>
    <configuration>
        <episodes>
            <episode>
                <groupId>schemas.core</groupId>
                <artifactId>types</artifactId>
                <version>1.0-SNAPSHOT</version>
            </episode>
        <episodes>
        <catalog>src/main/resources/catalog.xml</catalog>
        <catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
        <extension>true</extension>
        ....

当我运行mvn清洁安装汽车项目所有工作文件。在类路径上解析模式types.xsd,最终生成类。

我遇到问题的地方是试图编译项目Civic。

civic项目同时依赖于types.xsd和automobile.xsd。我使用一个目录文件(catalog.xml)来定义模式的位置:

<rewriteSystem systemIdStartString="http://schemas/core/types/" rewritePrefix="classpath:xsd/" />
<rewriteSystem systemIdStartString="http://schemas/vehicle/automobile/" rewritePrefix="classpath:xsd/" />

我使用插曲来防止类的重新生成。下面是Civic的pom.xml的一个片段:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.3</version>
    <configuration>
        <episodes>
            <episode>
                <groupId>schemas.core</groupId>
                <artifactId>types</artifactId>
                <version>1.0-SNAPSHOT</version>
            </episode>
            <episode>
                <groupId>schemas.vehicle</groupId>
                <artifactId>automobile</artifactId>
                <version>1.0-SNAPSHOT</version>
            </episode>
        </episodes>
        <catalog>src/main/resources/catalog.xml</catalog>
        <catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
        <extension>true</extension>
        ...

当我尝试在civic项目上运行mvn clean install时,我遇到了问题。它抱怨无法解析公共/系统ID。以下是我得到的一些错误消息:

Could not resolve publicId [null], systemId [jar:file:/_m2repository/schemas/vehicle/automobile/1.0-SNAPSHOT/automobile-1.0-SNAPSHOT.jar!http://schemas/core/types/types.xsd]
[ERROR] Error while parsing schema(s).Location [].
com.sun.istack.SAXParseException2; 
IOException thrown when processing "jar:file:/_m2repository/schemas/vehicle/automobile/1.0-SNAPSHOT/automobile-1.0-SNAPSHOT.jar!http://schemas/core/types/types.xsd".
Exception: java.net.MalformedURLException: no !/ in spec.
....

谢谢你。

注--我试着用捆绑来使事情运转起来,我确实找到了一种方法。但是,如果我从pom.xml文件中删除插曲,我就不会再得到错误,项目civic最终会得到依赖模块中的所有类型(这是我通过使用插曲来避免的)。

如果您想查看每个项目的完整catalog.xml和pom.xml文件,请参阅以下链接:

共有1个答案

堵睿范
2023-03-14

我也有同样的问题。模式C导入B和A,B导入A为A生成源,工作,B也很好,为C弹出一个MalformedUrlException。

我仍在调查这个错误,但一个解决方法是使用systemIdSuffix(Oasis Spec1.1)匹配systemId并重写它。您需要执行以下操作:

从POMS中的插件配置中删除“Catalog Resolver”元素。

<systemSuffix systemIdSuffix="types.xsd" uri="maven:schemas.core:types!/types.xsd"/>

将“Civic”项目目录文件的内容替换为以下内容:

<systemSuffix systemIdSuffix="types.xsd" uri="maven:schemas.core:types!/types.xsd"/>
<systemSuffix systemIdSuffix="automobile.xsd" uri="maven:schemas.vehicle:automobile!/automobile.xsd"/>

如果这对你有用就告诉我。

 类似资料:
  • 我有一些年的maven项目的经验,即使是多模块项目(这让我讨厌maven的多模块特性(所以免责声明现在已经完成了)),即使我真的喜欢maven,我也无法得到一个明确的答案: 多模块maven项目的典型用途是什么?与简单的依赖关系和父pom相比,这样的结构有什么附加值? 我已经看到了很多多模块项目的配置,但是所有这些都可以通过创建一个简单的依赖库结构来解决,这些依赖库作为交付品(即使有一个父pom,

  • 问题内容: 我正在尝试使用以下命令运行jdeps: 我依赖于应用程序模块和自动模块。我将所有依赖项放在“模块”文件夹中,但出现错误: 但是,当我添加时,它工作正常。 难道我做错了什么?我以为jdeps会找到所有模块,而不是手动添加它们。 问题答案: 执行以下命令时: 从目录解析的模块是 可观察的模块 ,在您的情况下,它们无法进入 根模块集 。 在问题的另一部分- 另一方面,显式添加它们可确保模块存

  • Velocity 不依赖 jQuery Velocity.js 可以在不引入 jQuery 的情况下单独使用。如果 你需要大部分动画效果能兼容 IE8,就必须引入 jQuery 1×。 它也可以和 Zepto 一起使用,写法和 jQuery 一样: // 无 jQuery 或 Zepto 时,Velocity()方法挂载在 window 对象上 (window.velocity) // ( 第一

  • 我知道我们可以通过使用mvn-f modulename/pom.xml dependency:tree命令获得特定的模块依赖树 是否有一种方法只使用特定模块的groupId、artifactId和version生成依赖树。

  • 我的错误是: “./src/index.js中的错误 模块生成失败(来自./node_modules/babel-loader/lib/index.js): 语法错误:d:/cource/react project/webpacktutorial/src/index.js:意外标记(7:16)” 我不知道为什么这个错误发生每次我这样做可能的事情为webpack,我使用CSS加载器,巴贝尔加载器或许

  • 嗨,朋友们,我正在开发一个基于maven的spring boot项目,这个项目是多模块的,其中一个模块是主模块,第二个模块是服务模块。我在主模块中有一个控制器,在Serivce模块中有一个服务 控制器 服务 在maven的多个模块中,这个场景可以很好地工作,但我还有一个以服务模块中的接口形式存在的存储库。 因此,当我从Main模块执行主类时,我的项目在服务模块中没有bookrepository(或