Maven - 如何处理生成的类

时间:2011-10-14 10:26:11

标签: eclipse maven wsdl

我的困境是我对maven中生成的源文件有疑问。

我正在尝试从WSDL生成一些类,我真的不知道处理生成的源文件的标准方法是什么。

  • 我应该在哪里生成.java源文件? (src / main / java,src / main / generated)
  • 我应该将它们包含在源代码管理下,还是在签出后生成
  • 如果我不使用src / main / java文件夹,如何说服Eclipse自动“看到”那些类作为源文件夹?
  • 我真的需要.java文件,还是只需要.class-es?

有关此问题的最佳做法是什么?任何帮助或建议表示赞赏。

谢谢你的回答, 标记

3 个答案:

答案 0 :(得分:12)

我遇到的生成代码的大多数Maven插件遵循将生成的Java源文件放在target/generated-sources文件夹的子目录中的约定。例如,Maven 2 JAXB 2.x Plugintarget/generated-sources/xjc文件夹中生成Java源。

只要构建是可重复的,我就不需要将生成的源提交到我的源代码存储库。因此,我通常会将GitMercurialSVN或我正在使用的任何内容配置为忽略target下的所有内容。

我通常手动编辑.classpath文件以包含Eclipse的源文件夹,并将.classpath.project文件存储在源代码存储库中。

以下是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
    <classpathentry kind="src" path="target/generated-sources/xjc"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

请务必注意,某些Maven插件不会将生成的源附加到POM。您可以使用Build Helper Maven Plugin来解决此问题。

答案 1 :(得分:4)

我从未找到过处理结果源文件的标准方法。但是,根据我的经验,我会向您推荐以下内容:

  
      
  • 我应该在哪里生成.java源文件? (SRC /主/ JAVA,   的src /主/生成)
  •   
  • 我把它们放在src / main / com / mypackage / generated下。这样,它们已经在类路径中,您不需要任何其他手动配置来使Eclipse编译没有错误。
  
      
  • 我应该将它们包含在源代码管理下,还是在签出后生成
  •   
  • 以前不包含 ,但经过一些问题(开发人员因为忘记了而没有生成它们,缺少IDE Maven插件,等)我们最终将它们添加到源代码管理。这个帮助任何人都知道有一个生成的源包没有神奇地出现,只需浏览一个文件夹(一些源文件不再存在,等等)快速检查模式更改,并查看实际大小应用
  
      
  • 如果我不使用src / main / java文件夹,如何说服Eclipse自动“看到”那些类作为源文件夹?
  •   
  • 使用src / main / com / mypackage / generated解决。
  
      
  • 我真的需要.java文件,还是只需要.class-es?
  •   
  • 我建议使用.java文件。

在使用JAXB多年后,我只花了两分钱,主要用于WSDL到Java的生成。

答案 2 :(得分:0)

这是我多年后的建议:将所有代码生成放在一个单独的maven项目中,并在需要生成代码的正常项目中依赖它。

  • 为生成的代码执行mvn install,如果它是SNAPSHOT。
  • 除非你知道自己在做什么,否则我不建议将生成的代码放在子模块中,否则Eclipse会不断混淆,因为大多数人都会导入所有子模块(即多模块项目)
  • 然而如果您决定执行多模块(即生成的代码是兄弟项目),您可以:
    • 特别是不将项目导入Eclipse并在单个项目中使用mvn install
    • 依赖于m2e生命周期插件和Build Helper插件(这只适用于受到大力支持的某些代码生成)。
  • 如果您需要调试生成的代码,我强烈建议您使用maven-attach-sources插件将源附加到jar中。

虽然多模块方法在实践中似乎是一个好主意,但它变得非常令人讨厌,因为如果有新的SNAPSHOT,每次拉动时Eclipse都会失去同步。

如果生成的代码没有生成,那么通常只是释放它,因此它不是SNAPSHOT(显然这需要设置正确的maven存储库)。