我正在写一个基本上应该执行以下操作的maven插件:
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找到它。)
答案 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;
答案 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);
}