我有一个模式,我试图使用它(未修改)来使用 XJC 创建 Java 类/枚举。然而,对于几个已实现的类,我有不同的实现。
因此,我使用普通的 JAXB
<baseType name="..."/>
属性来映射到我现有的实现。映射效果很好(或者至少,它可以编译并且单元测试通过)。
但是,如果可能的话,我仍然会得到我不想拥有的生成类(由于 jar 大小和美观的原因)。
有没有办法让XJC不使用外部绑定文件生成特定的类?或者使用maven插件的一些配置?
如果有区别的话,那就是 Java 17 和 Jakarta 的 JAXB 4。
我们使用 XJC 从 xsd 和 dtd 生成 java 类。我们使用 maven-antrun-plugin 和 antcontrib 在 Maven 构建中执行此操作。您可能会在 pom.xml 中找到一些有用的东西
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>generate-model</id>
<configuration>
<target>
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
<delete dir="${project.basedir}/src/main/java/com/mycompany/myproject/model" />
<for param="dtd">
<path>
<fileset dir="${project.basedir}/src/main/resources/schema/path1">
<include name="Type1.dtd" />
<include name="Type2.dtd" />
<include name="Type3.dtd" />
</fileset>
</path>
<sequential>
<local name="fileName"/>
<basename property="fileName" file="@{dtd}" suffix=".dtd"/>
<java classname="com.sun.tools.xjc.Driver" fork="true">
<sysproperty key="enableExternalEntityProcessing" value="true"/>
<arg value="-p" />
<arg value="com.mycompany.myproject.model.path1.${fileName}" />
<arg value="-d" />
<arg value="${project.basedir}/src/main/java" />
<arg value="-dtd" />
<arg value="-XautoNameResolution" />
<arg value="@{dtd}" />
<classpath>
<path refid="maven.plugin.classpath" />
</classpath>
</java>
</sequential>
</for>
<for param="xsd">
<path>
<fileset includes="*.xsd" dir="${project.basedir}/src/main/resources/schema/path2" />
</path>
<sequential>
<java classname="com.sun.tools.xjc.Driver" fork="true">
<sysproperty key="enableExternalEntityProcessing" value="true"/>
<arg value="-p" />
<arg value="com.mycompany.myproject.model.path2" />
<arg value="-d" />
<arg value="${project.basedir}/src/main/java" />
<arg value="-XautoNameResolution" />
<arg value="@{xsd}" />
<classpath>
<path refid="maven.plugin.classpath" />
</classpath>
</java>
</sequential>
</for>
<replaceregexp match="\Q// Generated on:\E.*" replace="//" byline="true">
<fileset dir="${project.basedir}/src/main/java/com/mycompany/myproject/model" />
</replaceregexp>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>1.0b3</version>
<exclusions>
<exclusion>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-xjc</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.sun.istack</groupId>
<artifactId>istack-commons-runtime</artifactId>
<version>3.0.8</version>
</dependency>
</dependencies>
</plugin>