Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Maven插件中找到主工件的路径_Java_Maven_Jar_Maven Plugin - Fatal编程技术网

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

Java 在Maven插件中找到主工件的路径,java,maven,jar,maven-plugin,Java,Maven,Jar,Maven Plugin,我正在开发一个Maven插件,用于在服务器上自动安装JAR。对我来说,第一步应该是找到已编译的JAR并将其移动到服务器,但是如何找到我的JAR呢 我的第一次尝试是: public class MyMojo extends AbstractMojo { @Override public void execute() throws MojoExecutionException, MojoFailureException { String workingPath = S

我正在开发一个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”。有没有办法知道jar将在哪里构建?

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

是的,实现这一点的简单方法是注入当前正在构建的,并检索其工件对应的文件,如返回的。无论项目的包装是什么(
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}
,该值由

您的Maven插件需要依赖于(对于and注释)和
Maven项目的
Maven核心

<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>

org.apache.maven
马文堆芯
3.3.9
org.apache.maven.plugin-tools
maven插件注释
3.5
假如

当然,这需要实际构建项目的工件,也就是说插件必须在
阶段之后运行;否则,工件没有文件。

这只是解决方案的一部分;工件的最终名称及其包装仍然需要检索。而且它实际上并不适用于所有情况,因为用户可以为JAR插件设置自定义,不同于构建目录。最后注意,插件参数的Javadoc注释是Maven 2的老方法。Maven3(及以上版本)更喜欢Java注释。谢谢,这就是我想要的。正如您在评论中所说,我不想使用固定目录,因为outputDirectory可以很容易地以不同的方式定义