我正在开发一个Maven插件,以便在服务器上自动安装JAR。我的第一步应该是找到已编译的JAR并将其移至服务器,但如何找到我的JAR?
我的第一次尝试是:
public class MyMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
String workingPath = System.getProperty("user.dir");
File targetDir = new File(workingPath + File.separatorChar + "target");
for (File f : targetDir.listFiles()) {
if (f.isFile() && f.getName().endsWith(".jar") {
System.out.println("Found jar " + f.getName());
}
}
}
}
但我不想使用固定目录“target”。有没有办法知道罐子的建造地点?
答案 0 :(得分:2)
是的,执行此操作的简单方法是注入当前正在构建的MavenProject
,并检索与getArtifact()
返回的工件对应的文件。这适用于项目的任何打包(jar
,war
等),或实际生成工件的位置。
@Mojo(name = "foo")
public class MyMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
// this is the main artifact file
File file = project.getArtifact().getFile();
getLog().info(file.toString());
}
}
这声明了名为"foo"
的目标。它被注入值${project}
,由PluginParameterExpressionEvaluator
评估到当前的Maven项目。
您的Maven插件需要依赖maven-plugin-annotations
(针对@Parameter
和@Mojo
注释),maven-core
依赖MavenProject
:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.3.9</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
<scope>provided</scope>
</dependency>
当然,这需要实际构建项目的工件,也就是说插件必须在package
阶段之后运行;否则文件没有文件。
答案 1 :(得分:1)
您可以使用predefined variables project.build.directory
,project.build.finalName
和project.packaging
的值来构建归档的路径,作为默认值插件的参数,如:
public class MyMojo extends AbstractMojo {
/**
* @parameter default-value="${project.build.directory}/${project.build.finalName}.${project.packaging}"
*/
private String archivePath;
public void execute() throws MojoExecutionException {
File archive = new File(archivePath);
...
}
}