Как исключить создание файла эпизода в jaxb2-maven-plugin версии 2.5.0?
Я использую XJC цель jaxb2-Maven-плагин для создания классов Java из набора XSD файлов.
Минимальным, полным и поддающимся проверке примером может быть проект Maven со следующим файлом pom.xml:
<?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>
И файл с именем example.xsd (подойдет любой допустимый файл xsd) в папке src / main / resources /:
<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:\path-to-the-project\target\generated-sources\jaxb\META-INF\JAXB\episode_xjc.xjb
Путем переключения generateEpisode
к true
сборка выполнена успешно, но код создается с файлом эпизода, чего я хочу избежать. (Кстати, это доказывает, чтоgenerateEpisode
фактически не игнорируется, несмотря на то, что говорится в документации).
Как отключить генерацию файла эпизода в версии 2.5.0 плагина, если это вообще возможно?
2 ответа
После некоторого исследования я пришел к выводу, что этой функции больше не существует.
Однако я нашел два обходных способа исключения файла эпизода:
Использование JAXB2 Maven Plugin (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
phase, поэтому он выполняется сразу после генерации кода.
Вместо этого попробуйте использовать apache cxf, так как cxf не создает файл эпизода.
https://cxf.apache.org/docs/application-server-specific-configuration-guide.html