2016-11-14 2 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()); 
      } 
     } 
    } 
} 

Но я не хочу использовать фиксированный каталог «целевой». Есть ли способ узнать, где будет строиться банка?

ответ

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}, которое оценивается по текущему проекту Maven на PluginParameterExpressionEvaluator.

Ваш 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; в противном случае нет файла артефакта.

+0

спасибо, вот что я искал. и, как вы сказали в своем комментарии, я не хотел использовать фиксированный каталог, потому что outputDirectory можно было бы легко определить по-разному –

1

Вы можете использовать значение predefined variablesproject.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); 
     ... 
    } 
} 
+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

Смежные вопросы