【问题标题】:Maven JAXB - How to specify root node for generating from XSDMaven JAXB - 如何指定根节点以从 XSD 生成
【发布时间】:2012-06-07 13:02:29
【问题描述】:

我有问题。我有一个非常大的公司 XSD 文件,其中包含跨许多系统的许多对象的定义。我不想从这个 XSD 在我的单独项目中生成一些 java 类,但是 我不想生成 XSD 中定义的所有类,因为我不只是需要它们。

是否可以在 Maven 中使用 JAXB 指定类似 XSD 根节点来生成 java 类?

我希望我的问题很清楚:)

【问题讨论】:

    标签: java xml maven xsd jaxb


    【解决方案1】:

    您的问题是我经常看到的问题,我想说的是大型 XSD 的典型问题。

    不幸的是,我不知道控制生成过程的 JAXB 方式,而不是您想要的方式。

    我为此开发的替代解决方案,因此我从这一点开始的偏见,依赖于自动 XML 模式重构 (XSR)。它基本上接受您的 XSD,并从一组 XSD 对象(在您的情况下可能是几个全局元素,也可能是某些类型)中,它会生成一个 XSD 子集,其中只包含必要的项目,没有绒毛。通过 JAXB 处理这些 XSD,它会为您提供您想要的东西。这涉及到 QTAssistant 及其 XSR 功能。高级步骤是:

    • 构建一个新的 XSR 文件;
    • 在 XML 模式集合中引用您的源 XSD
    • 创建“发布”:图形编辑器可以帮助您。基本上,您可以匹配所需的顶级 XSD 对象和新的 XSD 文件位置。
    • 生成新的 XSD。
    • 将新的 XSD 与您的工件结合使用。

    QTAssistant 支持通过Exec Maven Plugin 与 Maven 进行命令行集成,但仅适用于 Windows。

    【讨论】:

    • 感谢您的回复。不幸的是,我无法从我的应用程序运行外部程序。它是部署在许多环境中的大型企业应用程序的一部分。
    • 您已经说过您想通过 Maven 运行 JAXB ...您的评论在问题的上下文中令人困惑。我会假设在您尝试生成 JAXB 类时正在构建您的应用程序。
    • 我无法在我们所有的机器上安装任何外部程序。所以 Exec Maven 插件在我的开发机器上取得了不错的进展(我可以在其中安装我想要的任何东西)但在生产上对我来说毫无用处,因为我无法安装任何外部程序。
    【解决方案2】:

    有一个用于生成可以接受 XJC 参数的 Java 类的插件,这可能是更高级配置中的一个钩子。但我不熟悉这些。

    取自插件源码:

    /**
     * Space separated string of extra arguments,
     * for instance <code>-Xfluent-api -episode somefile</code>;
     * These will be passed on to XJC as
     * <code>"-Xfluent-api" "-episode" "somefile"</code> options.
     * 
     * @parameter expression="${xjc.arguments}"
     */
    protected String arguments;
    

    插件配置的pom.xml示例:

    <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>1.3.1</version>
    <executions>
        <execution>
            <id>xjc</id>
            <phase>process-resources</phase>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <packageName>package.name</packageName>
        <schemaDirectory>${basedir}/src/main/webapp/WEB-INF/xsd</schemaDirectory>
        <bindingDirectory>${basedir}/src/main/java</bindingDirectory>
    </configuration>
    </plugin>
    

    【讨论】:

    • 是的,这对我来说可能是正确的插件。我对 jaxb2 maven 插件的许多变体感到有些困惑。看起来每个人的工作方式都差不多。但是使用这种方法结合绑定文件看起来可以解决我的问题。我唯一的问题是这个 jaxb2 插件不尊重命名空间作为 xjc 命令行命令。 Xjc 命令通常为每个命名空间创建文件夹,并根据它们的命名空间将源生成到这些文件夹中。该插件将每个 java 类生成到一个文件夹中,并导致重复错误。有什么提示吗? :)
    • 您是否可以使用命令行 配置来配置插件,或者它是否仅适用于插件未涵盖的其他配置?我在互联网上找到了很多解决方案,即在不同的执行/配置块中使用不同的 xsd,如the answer here...中提到的...
    • ...通过这种方法,似乎另一个 jaxb maven 插件提供了更优雅的配置see answer about CXF XJC Maven Plugin。我知道他们处理不同的 Maven 插件,这使得它更加混乱。我提到了一个对我有用的,我对其他人没有经验。我希望链接的答案将迅速提供一个工作配置。 (它不适合 1 条评论)
    猜你喜欢
    • 2012-07-12
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多