我有两个项目:
/src/main/resources/schema.xsd pom.xml
B/src/main/gen pom.xml
我想在B项目中生成来自XSD的类,它存在于A Project中
在B项目的pom.xml中我有:
<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>A</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
<outputDirectory>src/main/gen</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
但是在类路径中找不到xsd文件:
无法在项目B上执行目标org.codehaus.mojo:jaxb2-maven-plugin:1.5:xjc(xjc):未找到任何模式
如何使用其他项目的xsd?
这该怎么做:
a为剧集.a.xsd导入b.xsd,则必须在编译时使此架构可供JAXB使用b:
a.xsd从工件中提取a.a.xsd工件的位置a例如,请参阅此测试项目.
该项目a完全不引人注目.只需编译架构a.xsd.
该项目b更有趣.让我们来看看.
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<configuration>
<catalog>src/main/resources/catalog.cat</catalog>
<episodes>
<episode>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a</artifactId>
</episode>
</episodes>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
配置说使用工件a作为剧集.因此,当JAXB/XJC满足编译的类时a,它将重用它们而不是生成新的类.
顺便说一下,您可以使用useDependenciesAsEpisodes而不是配置单个剧集.在这种情况下,所有依赖关系都将被视为剧集,非常方便(配置较少).
配置还说要使用目录文件:
REWRITE_SYSTEM "http://www.ab.org" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!"
Run Code Online (Sandbox Code Playgroud)
这指示JAXB/XJC重写所有架构URL http://www.ab.org,maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!而不是从一开始 .后者将由the处理maven-jaxb2-plugin并最终解析为资源a.
让我们仔细看看.架构导入:b.xsd http://www.ab.org/a.xsd
<import namespace="urn:a" schemaLocation="http://www.ab.org/a.xsd"/>
Run Code Online (Sandbox Code Playgroud)
这将被重写maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!/a.xsd,将被解析到a.xsd项目的JAR内部a.因此,最后,JAXB/XJC将能够从aJAR工件中读取此模式.
您也可以使用PUBLIC而不是REWRITE_SYSTEM引用a.xsd每个名称空间URI而不是模式位置(这在逻辑上更好):
PUBLIC "urn:a" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!/a.xsd"
Run Code Online (Sandbox Code Playgroud)
但是,JAXB/XJC中存在一个错误,如果你有这个错误,这个错误就不起作用schemaLocation了xs:import.
这可以在当下工作:
<xsd:import namespace="urn:a"/>
Run Code Online (Sandbox Code Playgroud)
目前这不起作用:
<xsd:import namespace="urn:a" schemaLocation="a.xsd"/>
Run Code Online (Sandbox Code Playgroud)
我已向Oracle发送了拉取请求,该请求修复了该请求,但尚未应用.
上面的解释适用maven-jaxb2-plugin于0.10.0及更高版本中的和.
您最初的问题jaxb2-maven-plugin来自Codehaus,它是一个不同的Maven插件.这个插件没有我上面描述的所有功能,但至少剧集应该通过参数工作.目录也必须有效,但我相信,jaxb2-maven-plugin不支持在Maven工件中解析模式.您可以使用从工件中maven-dependency-plugin提取.a.xsda
免责声明:我是作者maven-jaxb2-plugin.
审核人员注意:我不打算推广/宣传我的插件,我只想提出问题的解决方案.而且我的项目似乎提供了最好/最优雅和完整的解决方案.
此配置的问题是<schemaDirectory>需要一个File名称/路径。问题File是它在文件系统中查找文件,并从当前工作目录中搜索。在这种情况下,项目为根。但是项目A的资源不在src/main/resources项目B的资源中。它是类路径资源,其中的(当在Maven中构建时)该类路径资源src/main/resources甚至不存在。
我从未尝试过使用jaxb2-maven-plugin,所以我不确定是否有可能。
但是使用maven-jaxb2-plugin,它可以从Maven工件编译模式。你可以这样
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.9.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemas>
<schema>
<dependencyResource>
<groupId>projecta.groupid</groupId>
<artifactId>project-a</artifactId>
<version>${project.version}</version>
<resource>/schema.xsd</resource>
</dependencyResource>
</schema>
</schemas>
<generateDirectory>src/main/gen/</generateDirectory>
<generatePackage>mypackage</generatePackage>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它的资源(schema.xsd)在src/main/resources项目A中。插件将生成类文件到mypackage程序包,并从src/main/gen
| 归档时间: |
|
| 查看次数: |
7624 次 |
| 最近记录: |