2016-11-14 61 views
1

我正在開發一個Maven插件,以自動在服務器上安裝JAR。對我來說,第一步應該是找到已編譯的JAR並將其移至服務器,但是如何找到我的JAR?查找Maven插件中主要工件的路徑

我第一次嘗試是:

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的構建位置?

回答

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-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階段之後運行;否則沒有文件給神器。

+0

謝謝,那就是我一直在尋找的東西。正如你在評論中所說的那樣,我不想使用固定目錄,因爲outputDirectory可以很容易地以不同方式定義 –

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); 
     ... 
    } 
} 
+0

這只是解決方案的一部分;工件的最終名稱及其包裝仍需要檢索。 – Tunaki

+0

它實際上並不適用於所有情況,因爲用戶可以設置自定義['outputDirectory'](http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html#outputDirectory )到JAR插件,不同於構建目錄。 – Tunaki

+1

最後需要注意的是,插件參數的Javadoc註釋是舊的Maven 2的做法。 Java註釋首選Maven 3(及以上)。 – Tunaki