6

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

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

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

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

到目前为止,我唯一的方法是获取项目的源代码,例如

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

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

4

3 回答 3

6

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

public class WhatEverMojo extends AbstractMojo {

    /**
     * The Maven project.
     *
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;
}

可能是我误解了你的问题,但我建议阅读插件开发简介

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

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

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

完整的源代码可通过 SVN 获得,您可以在其中深入了解。

于 2012-05-22T08:10:32.673 回答
4

现在注入的语法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>

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

于 2015-08-06T15:55:40.170 回答
1

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

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);
    }
于 2016-09-07T07:38:08.323 回答