如何在maven插件中处理项目源

时间:2012-05-22 07:53:26

标签: java maven maven-plugin

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

  1. 处理项目的所有类别
  2. 创建描述部分源代码的文件
  3. 将该文件添加到构建的jar中(作为MANIFEST的附加内容或META-INF目录中的新文件)
  4. 因为我刚刚创建maven插件的第一步是我的(可能是愚蠢的)问题:

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

    到目前为止,我唯一的方法是使用类似

    的方式获取项目的来源
    // assuming the project exists (to exclude instance checks etc.)
    MavenProject project = (MavenProject) getPluginContext().get("project");
    String projectSource = project.getSourceDirectory();
    

    然后使用文件操作处理此目录的内容。但这对我来说似乎太难看了,我确信存在一个更好的解决方案(我只是不能用google,maven页面和stackoverflow找到它。)

3 个答案:

答案 0 :(得分:6)

您知道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,您可以深入了解。

答案 1 :(得分: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>

然后管理我不确定的源文件,但似乎首选答案是针对MavenProject.getSourceDirectory()使用文件系统API。我不知道你会期望核心专家告诉你除此之外的来源。当然,其他插件 - 比如编译java - 可能会为某些类型的项目提供更复杂的域模型。

答案 2 :(得分: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);
    }