我有一个由多个模块组成的 Eclipse Maven 项目,其中一些包含我想要为其生成类的 Xml 模式(使用 Jaxb)。我的项目布局如下:
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
由于模式位于不同的项目中,我使用类路径目录解析器和目录文件来解析模式的位置。
汽车项目依赖于类型项目中的模式。这是其目录文件 ( catalog.xml ) 中的条目:
<rewriteSystem systemIdStartString="http://schemas/core/types/" rewritePrefix="classpath:xsd/" />
请注意使用classpath:xsd/来告诉目录解析器在类路径上查找模式。
我还使用情节来防止类型中的类在汽车项目中重新生成。这是我的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>
<episodes>
<catalog>src/main/resources/catalog.xml</catalog>
<catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
<extension>true</extension>
....
当我在汽车项目上运行mvn clean install时,一切工作文件。模式types.xsd在类路径上解析,最终生成类。
我遇到问题的地方是尝试编译项目civic。
civic项目同时依赖于types.xsd和auto.xsd。我使用目录文件 ( catalog.xml ) 来定义模式的位置:
<rewriteSystem systemIdStartString="http://schemas/core/types/" rewritePrefix="classpath:xsd/" />
<rewriteSystem systemIdStartString="http://schemas/vehicle/automobile/" rewritePrefix="classpath:xsd/" />
我使用剧集来防止类的重新生成。这是来自pom.xml的civic的片段:
<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.
....
由于某种原因,它在尝试解析汽车项目中的 jar 文件时找不到types.xsd 。
有谁知道为什么会发生这种情况?
谢谢你。
注意 - 我正在尝试使用捆绑来让事情正常工作,但我确实找到了一种方法。如果我从pom.xml文件中删除剧集,我将不再收到错误,但是,项目civic最终会包含依赖模块中的所有类型(这是我试图通过使用剧集来避免的事情)。
如果您想查看每个项目的完整catalog.xml和pom.xml文件,请查看以下链接:
类型: http: //pastebin.com/Uym3DY6X
汽车: http: //pastebin.com/VQM4MPuW
公民: http: //pastebin.com/eGSVGwmE