2015-06-29 7 views
3

Я пытаюсь написать свой собственный плагин maven, и я пытаюсь получить доступ к MavenProject с обычной аннотацией. Однако, когда я выполняю плагин, поле проекта не вводится и остается нулевым. Вот мой пример кода:Инъекция MavenProject не работает

package xyz; 

import org.apache.maven.plugin.*; 
import org.apache.maven.plugins.annotations.*; 
import org.apache.maven.project.*; 

/** 
* @goal develop 
* 
*/ 
public class Experiment extends AbstractMojo { 

    @Parameter(defaultValue = "${project}", readonly = true, required = true) 
    protected MavenProject project; 

    @Override 
    public void execute() throws MojoExecutionException, MojoFailureException { 
     if (project == null) { 
      getLog().error("Variable ${project} is null!"); 
     } else { 
      getLog().info("Variable ${project} is filled!"); 
     } 
    } 
} 

Что бы я ни стараюсь, я не могу заставить его работать, что Maven автоматически впрыскивает поле проекта с соответствующим объектом, я всегда получаю информацию о том, что поле является пустым. Любая идея, что я делаю неправильно?

Файл pom, кажется, не интересная деталь здесь, потому что я получаю такое поведение с большими помпами, которые я использую в течение многих лет в своих сборках. Но я могу воспроизвести его, даже с самой простой возможной файл пом:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>my-app</artifactId> 
    <version>1</version> 
</project> 
+0

Покажите свой полный файл POM! – khmarbaise

+0

Самый простой пример pom-файла будет выполнен, см. Edit. – Thorsten

+0

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

ответ

0

Поскольку нет pom.xml проекта maven-plugin, попробуйте следующие:

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>stackoverflow.maven</groupId> 
    <artifactId>31111852</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>maven-plugin</packaging> 
    <parent> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>mojo-parent</artifactId> 
     <version>34</version> 
    </parent> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.maven.plugin-tools</groupId> 
      <artifactId>maven-plugin-annotations</artifactId> 
      <version>3.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-core</artifactId> 
      <version>3.3.1</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-plugin-plugin</artifactId> 
       <version>3.2</version> 
       <configuration> 
        <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.plexus</groupId> 
       <artifactId>plexus-component-metadata</artifactId> 
       <version>1.5.5</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>generate-metadata</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

В stackoveflow.Experiment.java

package stackoveflow; 

import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.MojoFailureException; 
import org.apache.maven.plugins.annotations.Mojo; 
import org.apache.maven.plugins.annotations.Parameter; 
import org.apache.maven.project.MavenProject; 

@Mojo(name = "develop") 
public class Experiment extends AbstractMojo { 

    @Parameter(property ="project", defaultValue = "${project}", readonly = true, required = true) 
    protected MavenProject project; 


    public void execute() throws MojoExecutionException, MojoFailureException { 
     if (project == null) { 
      getLog().error("Variable ${project} is null!"); 
     } else { 
      getLog().info("Variable ${project} is filled!"); 
     } 
    } 
} 

установить его на месте с maven clean install,

и после этого запустить его mvn stackoverflow.maven:31111852:develop

+0

Предполагается, что вы задали 'property =" project "', но также изменили имя переменной с 'project' на' mavenProject'? В любом случае ничего не помогает ;-) – Thorsten

+0

Просто скопировал код из моего Mojo, который работает. Теперь скопировали ваш код с дополнениями аннотаций Mojo и компонента. попробуйте сейчас –

+0

обновил ответ с полным решением. пожалуйста, проверьте –

0

Инъекция параметр должен выглядеть следующим образом:

@Parameter(defaultValue = "${project}", readonly = true, required = true) 
private MavenProject project; 

Если у вас есть параметр, как только для чтения/требуется и т.д. давая свойство не имеет смысла. Свойство означает, что вы можете изменить его с помощью системных свойств, как это:

mvn -DpropName=value ... 
1

Только в случае, если кто-то падает на этот вопрос: У меня была та же проблема, то MavenProject не был введен с annotaded собственности, как это:

@Parameter(defaultValue = "${project}", required = true, readonly = true) 
private MavenProject project; 

Я - руководствуясь, очевидно предварительно аннотаций образцов Mojo - определил название цели с тегом в Javadoc @goal следующим образом:

/** 
* execute my goal 
* @goal mygoal 
*/ 
public class MyGoal extends AbstractMojo { 
    // goal's code goes here 
} 

все это работало после изменения этого т о использовании аннотаций для класса Mojo следующим образом:

@Mojo(name = "mygoal") 
public class MyGoal extends AbstractMojo { 
    // goal's code goes here 
} 

Мне кажется, как будто специалист смотрит только на аннотации, если харизмы определяются как аннотация. Смешивание анотаций (для полей) с тегами Javadoc не работает корректно (хотя я еще не исследовал это).

0

Чтобы использовать аннотации Java5, вам необходимо включить обработку аннотаций, чтобы ваши цели были включены в файл META-INF/maven/plugin.xml, встроенный в вашу банку.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-plugin-plugin</artifactId> 
      <version>3.4</version> 
      <executions> 
       <execution> 
        <id>default-descriptor</id> 
        <phase>process-classes</phase> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Смотреть https://maven.apache.org/plugin-tools/maven-plugin-plugin/examples/using-annotations.html

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