【问题标题】:Managing JAXB-generated classes in a Maven project在 Maven 项目中管理 JAXB 生成的类
【发布时间】:2012-08-11 21:55:54
【问题描述】:

我有一个基于 Maven 的项目,我尝试在其中添加一些由“jaxb2-maven-plugin”Maven 插件自动生成的 JAXB 类。然而,我的第一次剪辑让我陷入了循环依赖循环:

  • 因为这些 JAXB 类尚未生成,所以我的其他引用它们的源有编译错误。
  • 因为那些其他来源有编译错误,所以这些 JAXB 类不会生成。

似乎有两种明显的可能性可以解决这个问题:

  1. 注释掉损坏的引用,以便项目构建和 JAXB 类自动生成。然后将这些生成的源代码从/target 复制到/src/main/java,这样对它们的引用就不会导致编译错误。
  2. 创建一个完全独立的项目,只包含 JAXB 的东西。将其作为依赖项包含在我的主项目中。

我在这里遗漏了什么吗?选项 #1 似乎完全荒谬...只是 不能 是人们使用 JAXB 的方式。选项#2 似乎更合理,但仍然相当低效和麻烦。为了使用 JAXB,我真的必须承担一个完全独立的项目的开销吗?

是否有任何更优雅的方法可供开发人员在 Maven 插件生成它们的同一项目中引用 JAXB 生成的类?

更新:应要求,这是我的 POM 的相关部分:

<build>
    <plugins>
        <plugin>
            <!-- configure the compiler to compile to Java 1.6 -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>       
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- The name of your generated source package -->
                <packageName>com.mypackage</packageName> 
            </configuration>
        </plugin>
    </plugins>  
</build>

当我运行mvn clean package 时,我确实看到在/target 子目录下生成了我的JAXB 源。但是,这些生成的源代码不会自动添加到编译阶段的类路径中。

POST-RESOLUTION UPDATE:事实证明,我的编译问题与我在 Eclipse 中运行的事实有关,它的 Maven 集成与“jaxb2-maven-plugin”有一些问题”。有关该问题及其解决方案的更多详细信息,请参阅this StackOverflow question

【问题讨论】:

  • 请贴出POM的相关部分。

标签: java jakarta-ee maven jaxb spring-oxm


【解决方案1】:

你是如何配置你的 jaxb maven 插件的?通常它在生成源生命周期中运行,该生命周期在编译生命周期之前。因此,当您自己的代码被编译时,您的 JAXB 生成的类应该已经存在,Maven 将它们放在目标/生成源中,并将该文件夹放在类路径中。

编辑: 这是我们在工作中使用的代码(按预期工作):

<plugin>
            <groupId>com.sun.tools.xjc.maven2</groupId>
            <artifactId>maven-jaxb-plugin</artifactId>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaDirectory>src/main/resources/<companyname>/xsd</schemaDirectory>
                <includeSchemas>
                    <includeSchema>retrieval.xsd</includeSchema>
                    <includeSchema>storage.xsd</includeSchema>
                </includeSchemas>
            </configuration>
        </plugin>

显然我们使用了另一个 jaxb 插件...(另请参阅此线程:Difference of Maven JAXB plugins)。

【讨论】:

  • 我已更新原始问题以包含我的 POM 的插件部分。
【解决方案2】:

我建议您将 jaxb 生成的类(api)和您的 BL 类(实现)拆分为 2 个 maven 项目,每个项目具有单独的 pom.xml,主根 pom.xml 具有编译顺序。这样,您将能够构建 api.jar,然后 maven 将其安装在本地 repo 中,之后您可以将其用作实现的依赖项。所以它看起来像:

-API\
--pom.xml - for api, jaxb generation
-IMPL\
--pom.xml - for impl, api dependency is here
pom.xml - main pom.xml with references to the projects above

【讨论】:

  • 谢谢。事实证明,我的问题与 Eclipse 的关系比其他任何事情都多(请参阅问题底部的更新)。至于“循环依赖”问题,我决定先从编写 Java 类开始……而不是从 XML 模式开始,然后另辟蹊径。然后我将这些模型类放入客户端 JAR(也在服务器应用程序的类路径中),每个人都很高兴。
【解决方案3】:

也许尝试改用maven-jaxb2-plugin

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.2</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

不过,dfuse 的答案是正确的。任何一个插件都应该在编译之前生成源代码,源代码生成的结果将在类路径中。我用两个插件对此进行了测试。您是否可以发布您的架构,或者至少发布您的代码未能在类路径上获取的类型的架构?

【讨论】:

  • 我也使用并推荐 org.jvnet 插件。如果您的问题在星期五之前没有解决,我可以与工作中的 pom 进行比较,看看可能缺少什么。
  • 更正,我不使用那个插件(虽然我试过了)。我在答案中发布了我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多