当前位置:   article > 正文

maven浅谈之常用的插件_maven transformers

maven transformers
1. maven-compiler-plugin

maven-compiler-plugin编译插件有两个目标compile:compilecompile:test-compile分别默认绑定到compiletest-compile阶段
一般这个插件不需要显示声明,即使是最常用的配置编译版本,都是可以直接在pom中配置。

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
  • 1
  • 2
  • 3
  • 4

当然也可以显示声明在插件中标注编译版本

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
2. maven-surefire-plugin

简介:用于执行测试用例,其插件目标是surefire:test,例如执行mvn test命令或者执行更高的生命阶段,该插件是内置的,不需要显示配置,如果我们想自定义一些测试参数的时候,就需要显示配置了。
第一个问题:这个插件怎么和junit联系的,其实是这个插件依赖surefire-junit的,你不用显示这个依赖,他会根据maven-surefire-plugin的版本找对应的版本,会找src/test/java目录下所有以Test结尾的java类执行。
常用的功能:1.跳过测试用例
跳过测试用例:工程中发布的时候,是不需要测试用例的,所以可以把测试用例跳过。
第一种方式:在插件的配置中

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

第二种:在pom的properties

<properties>
    <maven.test.skip>true</maven.test.skip>
</properties>
  • 1
  • 2
  • 3

或者

<properties>
    <skipTests>true</skipTests>
</properties>
  • 1
  • 2
  • 3

第三种:在执行的命令行中

mvn clean test -DskipTests
  • 1

或者

mvn test -Dmaven.test.skip
  • 1

第四种:我们知道profile几乎可以覆盖pom定义的属性,当然profile也是可以的。

常用的功能2:执行特定的测试用例
MainTest是一个测试类
mvn test -Dtest=MainTest
MainTest测试类下的testAdd函数
mvn test -Dtest=MainTest#testAdd
当然上面的用法也是可以在pom文件中的(其实不常用,比如不测试就删掉,为什么要增加pom的长度呢)

<configuration>
    <includes>
        <include>**/AppTest.java</include>
    </includes>
    <excludes>
        <exclude>**/App2Test.java</exclude>
    </excludes>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

功能3:测试重试机制

<rerunFailingTestsCount>2</rerunFailingTestsCount>
  • 1

功能4:当出现失败N个测试用例后,跳过其他的测试用例

<skipAfterFailureCount>1</skipAfterFailureCount>
  • 1

功能5:调试测试用例mvn -Dmaven.surefire.debug test过程比较复杂而且一般不需要,所以等需要debug的时候,在查资料看看

功能6:多线程测试(任务过多)

 <threadCount>10</threadCount>
  • 1

上面用到的所有语法集合:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <configuration>
                <skipTests>true</skipTests>
                <includes>
                    <include>**/AppTest.java</include>
                </includes>
                <excludes>
                    <exclude>**/App2Test.java</exclude>
                </excludes>
                <rerunFailingTestsCount>2</rerunFailingTestsCount>
                <skipAfterFailureCount>1</skipAfterFailureCount>
                <threadCount>10</threadCount>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
3. maven-resource-plugin

功能是把资源文件放入打包的目标中。
3.1 默认也是不用显示配置,会把src/main/resources复制到jar包中的classes下;把src/test/resources复制到jar中的test-classes下。
其实我们在配置经常发现只有下面的配置信息(只配置sources元素)就可以把资源文件放入到classes下了,这是因为maven-resource-plugin就是默认执行这个元素,所以可以不显示配置maven-resource-plugin插件了。

<resources>
    <resource>
        <directory>src/main/env</directory>
    </resource>
</resources>
  • 1
  • 2
  • 3
  • 4
  • 5

3.2 排除或者包含资源文件

<includes>
    <include>2.text</include>
</includes>
<excludes>
    <exclude>1.text</exclude>
</excludes>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.3 自定义放入打包的位置(注意当在build设置该属性,maven-resource-plugin将不会执行默认的src/main/resources复制到jar中的classes)

<outputDirectory>${basedir}/target/classes1</outputDirectory>
  • 1

3.4 过滤资源文件的属性
例如定义公共属性,可以在其他文件引入属性的值(例如password等),需指定两个事:构建配置的filters元素中的属性文件列表,以及一个标记告诉Maven资源目录需要过滤。
下面的例子:定义default.properties为过滤文件(可以理解为其他文件要经过该文档过滤下),src/main/resources中的文件可以使用default.properties定义的属性值
注意设置<filtering>true</filtering>和有没有<filters>没有直接关系,即使没有<filters>文件,<filtering>true</filtering>也是可以获取pom文件或settings.xml,profile中定义的属性。

<build>
    <filters>
        <filter>src/main/filters/default.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.5 自定义资源文件目录
我们知道上面几个例子都是插件目标resources:resources完成,当我们需要更加自由的自定义文件来源和文件来源的时候,这就要用resources:copy-resources插件目标,很明显这个插件的功能就是复制文件。
下面的例子:在generate-resources生命周期调用resources:copy-resources插件目标完成文件的复制工作
注意:resources:copy-resources并不会影响resources:resources,索引默认的资源位置也同样生成。

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <id>copy-file</id>
                <phase>generate-resources</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <!--输出目录-->
                    <outputDirectory>${basedir}/target/classes1</outputDirectory>
                    <resources>
                        <resource>
                            <!--资源-->
                            <directory>${basedir}/src/main/resources</directory>
                            <includes>
                                <include>1.text</include>
                            </includes>
                           <!-- <excludes>
                                <exclude>1.text</exclude>
                            </excludes>-->
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

上面用到的所有语法集合:

<build>
   <!--<resources>
       <resource>
           <directory>src/main/env</directory>
       </resource>
   </resources>
   <outputDirectory>${basedir}/target/classes1</outputDirectory>-->
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-resources-plugin</artifactId>
           <version>3.2.0</version>
           <executions>
               <execution>
                   <id>copy-file</id>
                   <phase>generate-resources</phase>
                   <goals>
                       <goal>copy-resources</goal>
                   </goals>
                   <configuration>
                       <!--输出目录-->
                       <outputDirectory>${basedir}/target/classes1</outputDirectory>
                       <resources>
                           <resource>
                               <!--资源-->
                               <directory>${basedir}/src/main/resources</directory>
                               <includes>
                                   <include>1.text</include>
                               </includes>
                              <!-- <excludes>
                                   <exclude>1.text</exclude>
                               </excludes>-->
                           </resource>
                       </resources>
                   </configuration>
               </execution>
           </executions>
       </plugin>
   </plugins>
</build>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
4. maven-jar-plugin

maven-jar-plugin通常也是不需要显示声明配置的,因为本身就默认绑定到package生命周期上的。功能是把工程打成一个可以运行的jar(注意这个插件不会把依赖打入jar包中)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <archive>
            <manifest>
                <!-- 指定入口函数 -->
                <mainClass>com.sf.Main</mainClass>
                <!-- 是否要把第三方jar放到manifest的classpath中 注意:这个配置不是说把依赖打进配置中,只是说把这个工程需要哪些依赖说明下-->
                <addClasspath>true</addClasspath>
                <!-- 去该目标下去找依赖的jar包 -->
                <classpathPrefix>lib</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

注意事项:
如果我们打包成功,直接运行 java -jar xxx.jar 基本会提示没有依赖包,这是因为并没有把依赖打进来,所以需要你的运行环境提供依赖包,而且依赖包要放在<classpathPrefix>lib</classpathPrefix>这个目录下;
这个包是怎么知道我们运行的主类呢?通过上面的配置,jar中有META-INF/MANIFEST.MF
下面是我这个工程的MANIFEST.MF文件内容

Manifest-Version: 1.0
Built-By: zhangsan
Class-Path: lib/junit-4.12.jar lib/hamcrest-core-1.3.jar lib/fastjson-1.2.58.jar
Created-By: Apache Maven 3.3.3
Build-Jdk: 1.8.0_202
Main-Class: com.sf.Main
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

通过该文件,该jar可以知道去哪里找依赖jar和主类
如果你需要知道这个工程需要哪些jar包,并获取可以使用maven-dependency-plugin插件把依赖的jar包放入一个单独的目录中

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                 <type>jar</type>
                 <includeTypes>jar</includeTypes>
                 <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
5. maven-shade-plugin

我常用的打包插件(可以把依赖打进jar包里),他只有一个插件目标shade:shade, 通常绑定在package生命周期阶段。
功能一:过滤jar包(命名方式groupId:artifactId[[:type]:classifier])可以使使用通配符

<artifactSet>
    <excludes>
        <exclude>junit:junit</exclude>
    </excludes>
    <includes>
        <include>com.alibaba:fastjson</include>
    </includes>
</artifactSet>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

功能二:过滤一些包特定的资源文件

<filters>
    <filter>
        <artifact>*:*</artifact>
        <excludes>
            <exclude>META-INF/*.SF</exclude>
            <exclude>META-INF/*.DSA</exclude>
            <exclude>META-INF/*.RSA</exclude>
        </excludes>
    </filter>
</filters>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

功能三:没用的类直接过滤掉,打出最小的包

<minimizeJar>true</minimizeJar>
  • 1

功能四:改后缀名

<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>helloworld</shadedClassifierName>
  • 1
  • 2

功能五:构建可运行的jar包(设置默认主类)

<transformers>
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
        <mainClass>com.sf.Main</mainClass>
    </transformer>
</transformers>
  • 1
  • 2
  • 3
  • 4
  • 5

上面用到的所有语法集合:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <!--<artifactSet>
                    <excludes>
                        <exclude>junit:junit</exclude>
                    </excludes>
                    <includes>
                        <include>com.alibaba:fastjson</include>
                    </includes>
                </artifactSet>-->
                <!--<minimizeJar>true</minimizeJar>-->
                <!--<transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.sf.Main</mainClass>
                    </transformer>
                </transformers>-->
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <shadedClassifierName>shade</shadedClassifierName>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

注意:maven-jar-plugin是打成一个可运行的jar,但是不会把依赖打进去,所以要运行需要一个特定的运行环境
一般java -jar xxx.jar就可以直接运行默认的主类了 (当然也是可以加上主类的 java -jar xxx.jar com.xx.Main)
对于maven-shade-plugin是可以打成一个可运行的jar,也可以不打成一个可运行的主类的。都可以是用java -cp xxx.jar com.xx.Main运行。
如果是一个可运行的jar包 就可以java -jar xxx.jar直接运行了。

6. maven-assembly-plugin

个性化打包的maven-assembly-plugin插件,该插件只有一个目标assembly:single,默认不会执行,要自己绑定到生命周期阶段。
官方也介绍了如果想要打成jar,建议使用maven-shade-plugin
使用这个插件你要告诉这个插件怎么执行,这个配置就是assembly的描述符,maven提供了几个assembly插件预定义的,也可以自定义,同时在配置中,我们可以一次执行多个描述符。

  • <descriptorRefs>指定预定义的描述符(就是已经设置了很多参数,告诉插件什么事了)
  • <descriptors>指定自定义的描述符;描述符的id会作为生成包的命名的一部分。

官方预定义的描述符:

  • bin: 默认将bin目录下文件打入包中
  • jar-with-dependencies : 会将所有依赖都解压打包
  • src:只将源码目录下的文件打包
  • project:将整个project资源打包

下面是官方预定义的jar-with-dependencies描述符。

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
  <!-- TODO: a jarjar format would be better -->
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

自定义的描述符:distribution.xml,定义文件过滤和依赖打包

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <id>distribution</id>
    <formats>
        <format>jar</format>
    </formats>
    <files>
        <file>
            <source>src/main/env/prod.properties</source>
            <outputDirectory></outputDirectory>
            <filtered>true</filtered>
        </file>
        <file>
            <source>src/main/resources/1.txt</source>
            <outputDirectory></outputDirectory>
        </file>
    </files>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

上面用到的所有语法集合:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.3.0</version>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!--<descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>-->
        <filters>
            <filter>src/main/assembly/filter.properties</filter>
        </filters>
        <descriptors>
            <descriptor>src/main/assembly/distribution.xml</descriptor>
        </descriptors>
        <!--打包成可执行的jar包:默认主类 (archive仅仅支持jar和war包)-->
        <archive>
            <manifest>
                <mainClass>com.sf.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

assembly参数很多,可以在官网自行查看,https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/611825
推荐阅读
相关标签
  

闽ICP备14008679号