【问题标题】:Find the path to the main artifact in a Maven plugin在 Maven 插件中找到主要工件的路径
【发布时间】:2017-03-27 20:50:11
【问题描述】:

我正在开发一个 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());
            }
        }
    }
}

但我不想使用固定目录“目标”。有什么方法可以知道 jar 将建在哪里?

【问题讨论】:

    标签: java maven jar maven-plugin


    【解决方案1】:

    您可以使用predefined variablesproject.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);
            ...
        }
    }
    

    【讨论】:

    • 这只是解决方案的一部分;工件的最终名称及其包装仍然需要检索。
    • 它实际上并不适用于所有情况,因为用户可以为 JAR 插件设置一个自定义的outputDirectory,与构建目录不同。
    • 最后一点,插件参数的 Javadoc 注释是旧的 Maven 2 方式。 Maven 3(及更高版本)首选 Java 注释。
    【解决方案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-coreMavenProject

    <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阶段之后运行;否则工件没有文件。

    【讨论】:

    • 谢谢,这就是我想要的。正如您在评论中所说,我不想使用固定目录,因为 outputDirectory 很容易定义不同
    猜你喜欢
    • 2013-10-08
    • 2014-10-22
    • 2012-12-04
    • 1970-01-01
    • 2012-06-13
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多