我使用jaxb2-maven-plugin的xjc目标从一组xsd文件生成Java类。
一个最小,完整且可验证的示例是带有以下pom.xml文件的Maven项目:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jaxb2-maven-episode-test</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.3.1</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<sources>
<source>${project.basedir}/src/main/resources/</source>
</sources>
<generateEpisode>false</generateEpisode>
</configuration>
</plugin>
</plugins>
</build>
</project>
在src / main / resources /文件夹中有一个名为example.xsd的文件(任何有效的xsd文件都可以):
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tempuri.org/PurchaseOrderSchema.xsd"
targetNamespace="http://tempuri.org/PurchaseOrderSchema.xsd"
elementFormDefault="qualified">
<xsd:element name="PurchaseOrder" type="tns:PurchaseOrderType"/>
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="ShipTo" type="tns:USAddress" maxOccurs="2"/>
<xsd:element name="BillTo" type="tns:USAddress"/>
</xsd:sequence>
<xsd:attribute name="OrderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:complexType name="USAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:integer"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
</xsd:complexType>
</xsd:schema>
<generateEpisode>false</generateEpisode>
可确保生成的代码没有一个插曲文件。
我需要将插件的版本升级到2.5.0。在此版本中,generateEpisode
已弃用:
从插件版本2.4开始,将不使用此参数。相反,默认情况下,所有JAXB操作都会生成情节文件。
从插件版本2.4开始,使用参数EpisodeFileName提供生成的情节文件的自定义名称(或依赖于标准文件名STANDARD_EPISODE_FILENAME)。
只需将更version
改为2.5.0,就会出现以下构建时错误:
引起原因:java.io.FileNotFoundException:C:\\-项目路径\目标\生成的源\ JAXB \ META-INF \ JAXB \ episode_xjc.xjb
通过切换generateEpisode
到true
构建成功,但是代码是用情节文件生成的,我想避免这种情况。(作为附带说明,generateEpisode
尽管文档中有说明,但这实际上并没有被忽略)。
如果有可能,如何使用插件的2.5.0版禁用情节文件的生成?
经过研究,我得出的结论是该功能不再存在。
但是,我发现了排除情节文件的两种解决方法:
使用JAXB2 Maven插件(maven-jaxb2-plugin)代替jaxb2-maven-plugin
JAXB2 Maven插件是一个类似的插件,它仍然支持不带情节文件的生成:
<build>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>${project.basedir}/src/main/resources/</schemaDirectory>
<episode>false</episode> <!-- skips episode file generation -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用单独的插件删除文件
在原始插件之后,可以使用Apache Maven AntRun插件删除文件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<delete>
<fileset dir="${project.build.directory}/generated-sources/jaxb/META-INF/JAXB" includes="episode*.xjb" />
</delete>
</target>
</configuration>
</execution>
</executions>
</plugin>
这需要挂接到generate-sources
阶段,以便在代码生成后直接执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句