是否可以在不使用插件的情况下配置 maven 来编译生成的源代码?

Posted

技术标签:

【中文标题】是否可以在不使用插件的情况下配置 maven 来编译生成的源代码?【英文标题】:Is it possible to configure maven to compile generated sources wouthout the use of a plugin? 【发布时间】:2020-03-25 05:01:04 【问题描述】:

我知道这个问题并不新鲜。但似乎没有明确的答案。 2012 年的This answer 指出,如果生成的源代码放在target/generated-sources/<tool> 下,它们将被编译。 ANTLR 4 maven plugin 遵循这种范式。根据文档,outputDirectory 的默认值为:$project.build.directory/generated-sources/antlr4

现在就我而言,我有一个生成源的自定义工具。我已将其输出目录设置为$project.build.directory/generated-sources/whatever,但它不起作用。关于whateverpart,我尝试使用生成源的目标的ID,甚至尝试劫持antlr4 名称。但是没有结果。

当我尝试 this solution 建议使用 mojo build-helper-maven-plugin 时,它会按预期编译。但是根据maven guide to generating sources,它应该可以在没有任何帮助插件的情况下工作,不是吗?我错过了什么吗?


这是我用来生成源代码的 POM(片段)配置。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.4.0</version>
    <executions>
        <execution>
            <id>generate-code</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <includeProjectDependencies>false</includeProjectDependencies>
        <includePluginDependencies>true</includePluginDependencies>
        <executableDependency>
            <groupId>com.company.product</groupId>
            <artifactId>CodeGenerator</artifactId>
        </executableDependency>
        <arguments>
            <argument>$basedir/</argument>
            <argument>$project.build.directory/generated-sources/generate-code/</argument>
        </arguments>
        <mainClass>com.company.codegeneration.CodeGenerator</mainClass>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>com.company.product</groupId>
            <artifactId>CodeGenerator</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>jar</type>
        </dependency>
    </dependencies>
</plugin>

【问题讨论】:

您的插件应该将源代码添加到项目中这意味着您的插件应该像github.com/mojohaus/templating-maven-plugin一样正确地执行此操作 顺便说一句。不要在 pom 文件中使用反斜杠 ...此外,您应该真正创建一个正确的插件,该插件可以像 generate-source 这样绑定到生命周期并正确处理。 @khmarbaise 老实说,我不知道如何处理(反)斜线。感谢您指出。如果您的建议是创建插件,请务必将其发布为答案。我知道已经有一个,但正如我已经指出的那样,它并没有明确说明“制作一个插件,否则它将无法工作”。 【参考方案1】:

你的理解有点不对。

不是自动的,生成源代码的插件通常通过将其输出目录(按约定类似于 target/generated-sources/)作为源目录添加到 POM 中,以便稍后包含它来处理它在编译阶段。

一些不太好的实现的插件不适合你,你有 自己添加目录,例如使用 Build Helper Maven 插件。

正如另一个答案所述,大多数插件通常将生成的代码添加为新的源路径。

例如:见antlr4's Antlr4Mojo.java 类。这里,插件通过在execute方法中调用addSourceRoot方法将生成的类添加到项目源中。

    //  Omitted some code
  void addSourceRoot(File outputDir) 
            if (generateTestSources) 
                project.addTestCompileSourceRoot(outputDir.getPath());
            
            else 
                project.addCompileSourceRoot(outputDir.getPath());
            
          


    //  Omitted some code

 @Override
    public void execute() throws MojoExecutionException, MojoFailureException 
    //  Omitted code
        if(project!=null)

        
            // Tell Maven that there are some new source files underneath the output
            // directory.
            addSourceRoot(this.getOutputDirectory());
        

    //  Omitted some code

因此,您可以在自定义插件中执行此操作,也可以使用 build-helper-maven-plugin

【讨论】:

您好 Ramu,感谢您抽出宝贵时间回答。尽管您的回答提出的问题多于解决的问题:我是否需要创建一个插件才能使其正常工作?有没有办法获得与project.addCompileSourceRoot(...); 调用相同的结果但在 pom 上手动添加?我试图了解而不仅仅是有一个解决方案 :) @SteliosAdamantidis 很抱歉造成混乱。当您说我有自定义工具时,我以为您正在使用您创建的插件并告诉您将该代码添加到您的插件代码中。如果不是这种情况,那么您可以使用 build-helper-maven-plugin 来做同样的事情。 (即通过将源路径作为参数附加附加源根,然后执行project.addCompileSourceRoot(...)以附加所有传递给插件的路径为&lt;sources&gt;。没有其他方法可以直接在pom. @SteliosAdamantidis 简而言之,您不需要创建自己的插件,只需将新生成的路径添加为源根目录。您可以使用build-helper-maven-plugin 做到这一点。如果您使用的是您自己开发的插件,那么您可以将project.addCompileSourceRoot(...) 添加到该插件的执行方法中。您无法在没有插件帮助的情况下添加路径。

以上是关于是否可以在不使用插件的情况下配置 maven 来编译生成的源代码?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不使用浏览器插件的情况下修改链接目标的 html?

IDEA常用插件

Maven - 在不构建的情况下安装项目依赖项

如何在不允许联网的环境下使用Maven开发

JNI - 我可以在不调用 System.loadLibrary 的本地插件的情况下使用 RegisterNatives 吗?

阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_10idea集成maven插件