在Maven插件中找到主要工件的路径

时间:2016-11-14 08:59:38

标签: java maven jar maven-plugin

我正在开发一个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”。有没有办法知道罐子的建造地点?

2 个答案:

答案 0 :(得分:2)

是的,执行此操作的简单方法是注入当前正在构建的MavenProject,并检索与getArtifact()返回的工件对应的文件。这适用于项目的任何打包(jarwar等),或实际生成工件的位置。

@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.directoryproject.build.finalNameproject.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);
        ...
    }
}