2012-08-15 63 views
10

我有一个基于Maven的项目,我尝试添加一些由“jaxb2-maven-plugin”Maven插件自动生成的JAXB类。然而,我的第一个切我有一个循环依赖循环:在Maven项目中管理JAXB生成的类

  • 由于这些JAXB类尚未生成,我引用它们的其他来源有编译错误。
  • 由于这些其他源具有编译错误,因此不会生成这些JAXB类。

好像有解决这个两个明显的可能性:

  1. 评论时的破环参数,使该项目建立和JAXB类是自动生成的。然后将生成的来源/target复制到/src/main/java中,以便引用它们不会导致编译错误。
  2. 创建一个完全独立的项目,只包含JAXB的东西。将其作为依赖项包含在我的主项目中。

我在这里错过了什么吗?选项#1看起来是平淡无味的......那只是不能是人们使用JAXB的方式。选项#2似乎更合理,但仍然效率低下且麻烦。为了使用JAXB,我真的必须承担一个完全独立的项目的开销吗?

开发人员在Maven插件生成的同一个项目中使用了哪些更优雅的方法来引用JAXB生成的类?

UPDATE:按要求,这里是我的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分辨率更新:事实证明,我的编译问题有更多的事情要做,我是在Eclipse中运行的事实,它的Maven的集成有一些问题,“JAXB2 - Maven的插件”。有关该问题及其解决方案的更多详细信息,请参阅this StackOverflow question

+0

请张贴POM的相关部分。 – jiggy 2012-08-15 15:42:55

回答

7

我建议你将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 
+0

谢谢。事实证明,我的问题与Eclipse相关的问题比其他问题更多(请参阅问题底部的更新)。 至于“循环依赖”问题,我决定从首先编写Java类开始......而不是从XML模式开始并以其他方式开始。然后我将这些模型类放入客户端JAR(它也在服务器应用程序的类路径中),并且每个人都很开心。 – 2012-08-17 17:53:16

9

你是如何配置你的jaxb maven插件的?通常它运行在生成源生命周期中,该生命周期来自编译生命周期之前。所以,当你自己的代码被编译时,你的JAXB生成的类应该已经存在了,Maven把它们放在target/generated-source中,并把这个文件夹放到classpath中。

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

<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) 。

+0

我已经更新了原始问题以包含我的POM的插件部分。 – 2012-08-15 17:25:03

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的答案是正确的,虽然。任何插件都应该在编译之前生成源代码,并且源代码的生成结果将位于类路径中。我测试了这两个插件。是否有可能发布您的模式,或者至少是您的代码无法在类路径中选择的类型的模式?

+0

我使用并会推荐org.jvnet插件。如果你的问题在星期五还没有解决,我可以和工作中的poms比较,看看可能缺少的东西。 – 2012-08-15 18:38:06

+0

更正,我不使用该插件(虽然我已经尝试过)。我在我的答案中发布了我的代码。 – 2012-08-17 08:58:31