【问题标题】:How to process project sources in maven plugin如何在maven插件中处理项目源
【发布时间】:2012-05-28 16:53:44
【问题描述】:

我正在编写一个基本上应该执行以下操作的 maven 插件:

  1. 处理所建项目的所有类
  2. 创建一个描述部分源代码的文件
  3. 将该文件添加到构建的 jar 中(作为添加到 MANIFEST 或作为 META-INF 目录中的新文件)

由于我只是在创建 maven 插件方面迈出第一步,这是我的(可能是愚蠢的)问题:

如何从构建项目时执行的插件访问项目的源代码(最好的方法:作为构建路径上的包,我可以轻松处理)? p>

到目前为止,我唯一的方法是使用类似的东西获取项目的源代码

// assuming the project exists (to exclude instance checks etc.)
MavenProject project = (MavenProject) getPluginContext().get("project");
String projectSource = project.getSourceDirectory();

然后用文件操作处理这个目录的内容。但这对我来说似乎很丑陋,以至于我很确定存在更好的解决方案(我只是无法通过 google、maven 页面和 stackoverflow 找到它)。

【问题讨论】:

    标签: java maven maven-plugin


    【解决方案1】:

    您知道Mojo API,其中包含例如有关当前项目的信息。这可以简单地由丛包含通过使用适当的标记自动注入,如下所示:

    public class WhatEverMojo extends AbstractMojo {
    
        /**
         * The Maven project.
         *
         * @parameter expression="${project}"
         * @required
         * @readonly
         */
        private MavenProject project;
    }
    

    可能是我误解了你的问题,但我建议阅读Introduction to Plugin development

    更新: 看看apt-maven-plugin等其他插件可能会有所帮助:

    以下内容可能会有所帮助:

    /**
     * The source directories containing the sources to be processed.
     * 
     * @parameter expression="${project.compileSourceRoots}"
     * @required
     * @readonly
     */
    private List<String> compileSourceRoots;
    

    complete source code is available via SVN,您可以深入了解。

    【讨论】:

    • 您的回答使类型检查/强制转换变得不必要(谢谢),但并没有解决我的问题:我需要检查项目的每个类是否包含一些值。 i> 因此我需要访问插件中的那些类(我在介绍/API 中找不到)。
    • 感谢您的更新,我会按照您的建议研究其他插件的源代码,但是 apt 插件并没有真正帮助我,因为它只是将所有源的路径传递给 apt (@987654327 @) 本身并且不处理它们。但我会在这里查看并报告我的结果
    【解决方案2】:

    注入MavenProject 的语法现在是:

    @Parameter(defaultValue = "${project}", required = true, readonly = true)
    MavenProject project;
    

    您必须将 maven-project 的依赖项添加到插件的 pom 中:

    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-project</artifactId>
        <version>2.0.6</version>
    </dependency>
    

    然后管理源文件我不确定,但似乎首选的答案是针对MavenProject.getSourceDirectory() 使用文件系统API。我不知道你会期望核心 maven 告诉你什么以外的来源。当然,对于某些类型的项目,其他插件(例如用于编译 java 的插件)可能具有更复杂的域模型。

    【讨论】:

      【解决方案3】:

      我使用静态字段,因为在一次运行中,类只加载一次到类加载器中。

      private static final Set<MavenProject> proceeded = new HashSet<MavenProject>();
      
      @Override
      public void execute() throws MojoExecutionException {
          MavenProject project = (MavenProject) getPluginContext().get("project");
          if (proceeded.contains(project)) {
              getLog().info("Already done in this run.");
              return;
          } else {
              proceeded.add(project);
          }
      

      【讨论】:

        猜你喜欢
        • 2013-12-01
        • 2012-08-12
        • 2010-09-18
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        相关资源
        最近更新 更多