【问题标题】:How can I organize source-generation in Maven?如何在 Maven 中组织源代码生成?
【发布时间】:2014-02-15 21:49:59
【问题描述】:

我有一个 Maven 插件,它为我的 java 项目生成源并将它们放入“target/generated-sources”文件夹。我在编译时需要这些源代码。我想在修改项目时将它们包含在我的项目中,已经生成。当然,我想将它们放入“src”文件夹下的正确文件夹中,而不是放入“target/generated-sources”。如何使用 Maven 组织这个?

换句话说,我希望能够:

  1. 通过运行我的特殊源生成插件的某个目标来生成我需要的源(已经完成,源具有我指定的包)

  2. 将这些生成的源移动到标准 Maven 布局的“src/main/java/...”文件夹。

  3. 将它们从“target/generated-sources”文件夹中删除,否则 mvn clean install 命令会引发错误,提示我有“重复的类”。事实上,如果我只是将生成的源从目标复制到 src - 我必须复制具有相同名称和包的类,尽管其中一个位于目标文件夹中。

哪些 Maven 插件可以解决这个问题?我想这是一个典型的任务。

【问题讨论】:

  • 看看你的 pom.xml 的相关配置会很有帮助。
  • 这个插件是你开发的?
  • 这不是典型的,因为所有生成的东西都应该进入目标文件夹。清理生成的文件很容易,也很容易将签入的文件分离到源代码控制系统中。
  • 插件是com4j-maven-plugin。它将生成的文件放入 target/generated-sources 文件夹中。
  • @Dymytry 来自target/generated-sources 的源代码不会自动编译成target/classes

标签: java maven maven-plugin


【解决方案1】:

maven中的标准解决方案是将所有源代码生成target/generated-sources,将target/generated-sourcessrc的所有源代码编译为target/classes并合并到目标jar中。

插件不应该接触src目录下的文件,因为这些文件是由版本控制系统(例如git)管理的。

如果插件写得不好并且来自target/generated-sources 的源文件没有自动编译成target,那么就像@James Kingsbery 所说的那样,使用来自Build Helper Maven Plugin 的目标build-helper:add-source

maven-com4j-plugin源代码中有cmets:

/**
   * Directory in which to create the Java COM wrapper files. This directory
   * will be added to the Maven project's compile source directory list and
   * will therfore be auto-compiled when the Maven compile phase is run.
   * 
   * @parameter expression="${outputDirectory}"
   *            default-value="${project.build.directory}/generated-sources/com4j/java"
   */

您的问题更重要的部分和解决方案是:

这个目录 将被添加到 Maven 项目的编译源目录列表和 因此将在 Maven 编译阶段运行时自动编译

因此,生成的源代码应该自动编译并归档到构建的jar中。

【讨论】:

    【解决方案2】:

    你应该看看build helper plugin。它允许您指定其他源目录(例如 target/generated-sources)。另见Usage of maven Build Helper Maven Plugin

    【讨论】:

      【解决方案3】:

      如果您的插件正常工作,它会将生成的源代码添加到内部项目中,而其他插件(如 maven-compiler-plugin)将拾取它并编译生成的代码。

      在您的插件代码中,您可以使用类似的方法来完成此操作:

      mavenProject.addCompileSourceRoot( getOutputDirectory().getAbsolutePath() );
      

      【讨论】:

        猜你喜欢
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 2013-05-04
        • 2011-01-18
        • 1970-01-01
        • 2020-08-21
        • 2011-06-11
        相关资源
        最近更新 更多