我有一个包,里面有多个java类。
我需要读取带有包的类数据的 xml 文件。
是否有一种自动方法(使用maven)从包的内容生成ObjectFactory类或jaxb.index文件?
我知道我可以使用特定的类启动 jaxb 上下文,但这将迫使我每次添加新类时都更改代码。
预先感谢,
阿夫纳
你必须使用jaxb2-maven插件来生成其他东西。如果类有适当的注释,那应该不是问题。
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.3.1</version>
经过一些研究,我选择使用 API JAXBContext.newInstance,它接受一组类。我编写了一个简短的包装器,它接受包名称并使用 spring 扫描它们以获取相关类(基于 XmlRootElement 注释)。然后我使用上面的 API 创建 jaxb 上下文。由于这是一项昂贵的操作,您应该考虑缓存这些上下文(线程安全)以供将来使用。
“最简单”的方法是使用 Atteo 的类索引。 拥有这个 Maven 依赖:
<dependency>
<groupId>org.atteo.classindex</groupId>
<artifactId>classindex</artifactId>
<version>3.13</version>
</dependency>
将在构建中添加注释处理器。
将
@IndexSubclasses
注释添加到相应的 package-info.java
将使该注释处理器生成 jaxb.index
文件。即:
@XmlSchema(
namespace = "https://schemas.com/super.xsd",
elementFormDefault = XmlNsForm.QUALIFIED
)
@XmlAccessorType(XmlAccessType.FIELD)
@IndexSubclasses
package pkg.with.my.schema;
import org.atteo.classindex.IndexSubclasses;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
重要 这种方法的一个很大的缺点是 Atteo 的注释具有运行时保留;因此,该依赖项必须作为运行时依赖项和编译时依赖项包含在内。如果您正在构建一个独立的 jar,那么使用 Atteo 的类索引将不再可能,除非您使用依赖项来遮蔽或构建 jar。