maven-plugin的理解与定义

一、plugin的定义与配置


1. 自定义plugin

参考: 官网

  • 基本定义

其中@Mojo.name为goal的名称,@Parameterconfiguraiton中配置的定义

@Mojo( name = "query" ) //定义goal的名称
public class MyQueryMojo
    extends AbstractMojo
{
    @Parameter(property = "query.url", required = true)
    private String url;
 
    @Parameter(property = "timeout", required = false, defaultValue = "50")
    private int timeout;
 
    @Parameter(property = "options")
    private String[] options;
 
    public void execute()
        throws MojoExecutionException
    {
        ...
    }
}

使用插件

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myquery-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <url>http://www.foobar.com/query</url>
          <timeout>10</timeout>
          <options>
            <option>one</option>
            <option>two</option>
            <option>three</option>
          </options>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

  • 定义配置项类型转换

配置值到具体类型配置项的转换

Parameter ClassConversion from String
BooleanBoolean.valueOf(String)
ByteByte.decode(String)
CharacterCharacter.valueOf(char) of the first character in the given string
ClassClass.forName(String)
java.util.DateSimpleDateFormat.parse(String) for the following patterns: yyyy-MM-dd hh:mm:ss.S a, yyyy-MM-dd hh:mm:ssa, yyyy-MM-dd HH:mm:ss.S or yyyy-MM-dd HH:mm:ss
DoubleDouble.valueOf(String)
EnumEnum.valueOf(String)
java.io.Filenew File(String) with the file separators normalized to File.separatorChar. In case the file is relative, is is made absolute by prefixing it with the project’s base directory.
FloatFloat.valueOf(String)
IntegerInteger.decode(String)
LongLong.decode(String)
ShortShort.decode(String)
Stringn/a
StringBuffernew StringBuffer(String)
StringBuildernew StringBuilder(String)
java.net.URInew URI(String)
java.net.URLnew URL(String)

  • 配置项为复杂对象时

通过xml标签的缩进来体现

<project>
...
<configuration>
  <person>
    <firstName>Jason</firstName>
    <lastName>van Zyl</lastName>
  </person>
</configuration>
...
</project>

  • 配置项为接口

具体通过实现类体现

<project>
...
<configuration>
  <person implementation="com.mycompany.mojo.query.SuperPerson">
    <firstName>Jason</firstName>
    <lastName>van Zyl</lastName>
  </person>
</configuration>
...
</project>

  • 配置项为集合
public class MyAnimalMojo
    extends AbstractMojo
{
    @Parameter(property = "animals")
    private List<String> animals;
 
    public void execute()
        throws MojoExecutionException
    {
        ...
    }
}
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myanimal-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <animals>
            <animal>cat</animal>
            <animal>dog</animal>
            <animal>aardvark</animal>
          </animals>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myanimal-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <animals>cat,dog,aardvark</animals>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

  • 配置项为map
...
		@Parameter
    private Map<String,String> myMap;
...
<project>
...
  <configuration>
    <myMap>
      <key1>value1</key1>
      <key2>value2</key2>
    </myMap>
  </configuration>
...
</project>

  • 配置项为properties
...
    @Parameter
    private Properties myProperties;  
...
<project>
...
  <configuration>
    <myProperties>
      <property>
        <name>propertyName1</name>
        <value>propertyValue1</value>
      </property>
      <property>
        <name>propertyName2</name>
        <value>propertyValue2</value>
      </property>
    </myProperties>
  </configuration>
...
</project>

2. 绑定goal到maven执行周期


  • 绑定到单个goal

注意: 第二个goal未绑定(除非定义时有默认的绑定周期)

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myquery-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>execution1</id>
            <phase>test</phase>
            <configuration>
              <url>http://www.foo.com/query</url>
              <timeout>10</timeout>
              <options>
                <option>one</option>
                <option>two</option>
                <option>three</option>
              </options>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
          <execution>
            <id>execution2</id>
            <configuration>
              <url>http://www.bar.com/query</url>
              <timeout>15</timeout>
              <options>
                <option>four</option>
                <option>five</option>
                <option>six</option>
              </options>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

  • 绑定到多个周期
<project>
  ...
  <build>
    <plugins>
      <plugin>
        ...
        <executions>
          <execution>
            <id>execution1</id>
            <phase>test</phase>
            ...
          </execution>
          <execution>
            <id>execution2</id>
            <phase>install</phase>
            <configuration>
              <url>http://www.bar.com/query</url>
              <timeout>15</timeout>
              <options>
                <option>four</option>
                <option>five</option>
                <option>six</option>
              </options>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

3. 定义goal默认的maven周期

@Mojo( name = "query", defaultPhase = LifecyclePhase.PACKAGE )
public class MyBoundQueryMojo
    extends AbstractMojo
{
    @Parameter(property = "query.url", required = true)
    private String url;
 
    @Parameter(property = "timeout", required = false, defaultValue = "50")
    private int timeout;
 
    @Parameter(property = "options")
    private String[] options;
 
    public void execute()
        throws MojoExecutionException
    {
        ...
    }
}

也可以换绑到其他周期,原来的周期不再生效

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myquery-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>execution1</id>
            <phase>install</phase>
            <configuration>
              <url>http://www.bar.com/query</url>
              <timeout>15</timeout>
              <options>
                <option>four</option>
                <option>five</option>
                <option>six</option>
              </options>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

4. 命令执行当前pom定义的execution

mvn myquery:query@execution1

5. plugin运行时采用最新dependencies

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.2</version>
        ...
        <dependencies>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.1</version>
          </dependency>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-launcher</artifactId>
            <version>1.7.1</version>
          </dependency>
         </dependencies>
      </plugin>
    </plugins>
  </build>
  ...
</project>

6. 插件配置不在子pom生效

默认是传播的,设置inherited=false即可

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.2</version>
        <inherited>false</inherited>
        ...
      </plugin>
    </plugins>
  </build>
  ...
</project>

二、扩展


  • 插件使用方式推荐

父pom定义版本管理,子pom直接引用

<project>
  ...
  <build>
    <!-- To define the plugin version in your parent POM -->
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.3.1</version>
        </plugin>
        ...
      </plugins>
    </pluginManagement>
    <!-- To use the plugin goals in your POM or parent POM -->
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

  • maven的默认周期对应的goal
validate
initialize
generate-sources
process-sources
generate-resources
process-resources
compile
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources
test-compile
process-test-classes
test
prepare-package
package
pre-integration-test
integration-test
post-integration-test
verify
install
deploy
  • mvn命令总结
  1. mvn命令带上-U表示强制去远程拉取依赖包(避免拿到的SNAPSHOT包是老的)
  2. 如果module不需要deploy到仓库,可以配置skip为true
 <plugin>
               <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-deploy-plugin</artifactId>
               <configuration>
                   <skip>true</skip>
              </configuration>
</plugin>
  1. 多线程构建
    mvn -T 4 或 mvn -T 1c (c表示机器的cpu核数)
  2. 显示构建详情及异常
    mvn -X -e
  3. 仅构建指定的module
    mvn --pl artifacId1,artifacId2
  4. 指定profile
    mvn -Pdev
  5. offline模式
    mvn -o
  6. 仅构建指定的module及其依赖的mudule
    mvn -am artifacId1,artifacId2
  7. 指定testSource/source等目录
<build>  
   <sourceDirectory>src/java</sourceDirectory>    
   <testSourceDirectory>src/test</testSourceDirectory>  
   <outputDirectory>output/classes</outputDirectory>  
   <testOutputDirectory>output/test-classes</testOutputDirectory>  
   <directory>target/jar</directory>  
   </build>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值