我有一个基于 Maven 的项目,我尝试在其中添加一些由 "jaxb2-maven-plugin" Maven 插件自动生成的 JAXB 类。 但是,我的第一次剪辑让我陷入了一个循环依赖循环:
- 因为这些 JAXB 类尚未生成,所以我引用它们的其他源存在编译错误。
- 因为这些其他源存在编译错误,所以不会生成这些 JAXB 类。
似乎有两种明显的可能性可以解决这个问题:
- 注释掉损坏的引用,以便自动生成项目生成和 JAXB 类。 然后将这些生成的源从
/target
复制到/src/main/java
中,以便对它们的引用不会导致编译错误。 - 创建一个完全独立的项目,只包含 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
时,我确实看到我的 JAXB 源代码在 /target
子目录下生成。 但是,这些生成的源不会自动添加到编译阶段的类路径中。
决议后更新:事实证明,我的编译问题更多地与我在Eclipse中运行的事实有关,并且它的Maven集成与"JAXB2-maven-plugin"有一些问题。 有关该问题及其解决方案的更多详细信息,请参阅此 StackOverflow 问题。
你是如何配置你的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 插件......(另请参阅此线程:Maven JAXB 插件的区别)。
我建议你将Jaxb生成的类(API)和BL类(实现)拆分为2个Maven项目,每个项目都有单独的pom.xml以及主根pom.xml编译顺序。 这样,您将能够构建 API.jar,然后 Maven 会将其安装在本地存储库中,然后您可以将其用作实现的依赖项。 所以它看起来像:
-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
也许尝试改用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的答案是正确的。 任何一个插件都应该在编译之前生成源代码,并且源代码生成的结果将在类路径上。 我用两个插件都对此进行了测试。 是否可以发布架构,或者至少发布代码无法在类路径上选取的类型的架构?