2

我一直在尝试使用注释编写一个 Maven 插件。我的插件声明如下所示:

@Mojo(name = "compile", defaultPhase = LifecyclePhase.COMPILE, requiresProject = true,     threadSafe = false)
public class CompileMojo extends AbstractMojo

我在编译插件的 pom 文件中有这个:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <version>3.2</version>
    <configuration>
    <!-- see http://jira.codehaus.org/browse/MNG-5346 -->                          <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
    </configuration>
    <executions>
        <execution>
        <id>mojo-descriptor</id>
        <goals>
            <goal>descriptor</goal>
        </goals>
        </execution>
    </executions>
</plugin>

maven 似乎确认插件已绑定到编译阶段:

mvn help:describe -DartifactId=jvmbasic-maven-plugin -DgroupId=com.khubla.jvmbasic -Dgoal=compile -Ddetail

[INFO] Mojo: 'jvmbasic:compile'
jvmbasic:compile
    Description: jvmBASIC compiler
    Implementation: com.khubla.jvmbasic.jvmbasicmojo.CompileMojo
    Language: java
    Bound to phase: compile

    Available parameters:

    sourceDir
         where to find the sources
    targetDir
         target dir
    verbose
       verbose

当我明确调用 mojo 时,它会起作用:

mvn jvmbasic:compile

如果我在 pom 文件中使用执行部分,它也可以工作。但是,我曾预计 mojo 会自动绑定到编译阶段,所以如果我输入

mvn clean compile

它会自动运行。我错过了一些明显的东西吗?

实际的源代码在这里:

https://github.com/teverett/jvmBASIC/tree/master/jvmbasicmojo

4

3 回答 3

1

我认为您缺少@Execute注释,如Maven Plugin Tool for Annotations中所述:

@Mojo(name="compile", defaultPhase = LifecyclePhase.COMPILE, 
      requiresProject = true, threadSafe = false)
@Execute(goal = "compile", phase = LifecyclePhase.COMPILE)
public class CompileMojo extends AbstractMojo
于 2014-02-04T12:59:09.260 回答
1

您的 pom 对 mojo的依赖性似乎有问题。您应该使用以下内容:

<dependency>
    <groupId>org.apache.maven.plugin-tools</groupId>
    <artifactId>maven-plugin-annotations</artifactId>
    <version>3.2</version>
    <scope>provided</scope>
</dependency>

代替

<dependency>
    <groupId>org.apache.maven.plugin-tools</groupId>
    <artifactId>maven-plugin-tools-annotations</artifactId>
    <version>3.2</version>
    <scope>provided</scope>
</dependency>

此外,使用 maven-plugin-plugin 会更干净,如下所示:

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <configuration>
        <goalPrefix>jvmbasic</goalPrefix>
    </configuration>
    <executions>
        <execution>
            <id>default-descriptor</id>
            <goals>
                <goal>descriptor</goal>
            </goals>
            <phase>process-classes</phase>
        </execution>
        <execution>
            <id>help-descriptor</id>
            <goals>
                <goal>helpmojo</goal>
            </goals>
            <phase>process-classes</phase>
        </execution>
    </executions>
   </plugin>

另一点是在 mojo 区域定义 maven-compiler-plugin 版本,因为您没有为您的项目使用全局父 pom。

于 2013-07-02T20:06:11.100 回答
0

您希望自动绑定到编译阶段的项目的 pom.xml 在哪里?你的项目 pom 在构建部分应该有这样的东西。

<build>
    <plugins>
        <plugin>
        <artifactId>jvmbasic-maven-plugin</artifactId>
        <version>${jvmbasic.version}</version>
        <configuration>
           <sourceDir>${maven.compiler.source}</sourceDir>
           <targetDir>${maven.compiler.target}</targetDir>
        </configuration>

    </plugin>
于 2013-07-02T16:22:31.807 回答