赞
踩
maven-compiler-plugin
编译插件有两个目标compile:compile
和compile:test-compile
分别默认绑定到compile
和test-compile
阶段
一般这个插件不需要显示声明,即使是最常用的配置编译版本,都是可以直接在pom中配置。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
当然也可以显示声明在插件中标注编译版本
<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>
简介:用于执行测试用例,其插件目标是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>
第二种:在pom的properties中
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
或者
<properties>
<skipTests>true</skipTests>
</properties>
第三种:在执行的命令行中
mvn clean test -DskipTests
或者
mvn test -Dmaven.test.skip
第四种:我们知道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>
功能3:测试重试机制
<rerunFailingTestsCount>2</rerunFailingTestsCount>
功能4:当出现失败N个测试用例后,跳过其他的测试用例
<skipAfterFailureCount>1</skipAfterFailureCount>
功能5:调试测试用例mvn -Dmaven.surefire.debug test
过程比较复杂而且一般不需要,所以等需要debug的时候,在查资料看看
功能6:多线程测试(任务过多)
<threadCount>10</threadCount>
上面用到的所有语法集合:
<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>
功能是把资源文件放入打包的目标中。
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>
3.2 排除或者包含资源文件
<includes>
<include>2.text</include>
</includes>
<excludes>
<exclude>1.text</exclude>
</excludes>
3.3 自定义放入打包的位置(注意当在build设置该属性,maven-resource-plugin将不会执行默认的src/main/resources复制到jar中的classes)
<outputDirectory>${basedir}/target/classes1</outputDirectory>
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>
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>
上面用到的所有语法集合:
<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>
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>
注意事项:
如果我们打包成功,直接运行 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
通过该文件,该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>
我常用的打包插件(可以把依赖打进jar包里),他只有一个插件目标shade:shade
, 通常绑定在package
生命周期阶段。
功能一:过滤jar包(命名方式groupId:artifactId[[:type]:classifier])可以使使用通配符
<artifactSet>
<excludes>
<exclude>junit:junit</exclude>
</excludes>
<includes>
<include>com.alibaba:fastjson</include>
</includes>
</artifactSet>
功能二:过滤一些包特定的资源文件
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
功能三:没用的类直接过滤掉,打出最小的包
<minimizeJar>true</minimizeJar>
功能四:改后缀名
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>helloworld</shadedClassifierName>
功能五:构建可运行的jar包(设置默认主类)
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.sf.Main</mainClass>
</transformer>
</transformers>
上面用到的所有语法集合:
<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>
注意: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
直接运行了。
个性化打包的maven-assembly-plugin插件,该插件只有一个目标assembly:single
,默认不会执行,要自己绑定到生命周期阶段。
官方也介绍了如果想要打成jar,建议使用maven-shade-plugin
。
使用这个插件你要告诉这个插件怎么执行,这个配置就是assembly
的描述符,maven提供了几个assembly
插件预定义的,也可以自定义,同时在配置中,我们可以一次执行多个描述符。
<descriptorRefs>
指定预定义的描述符(就是已经设置了很多参数,告诉插件什么事了)<descriptors>
指定自定义的描述符;描述符的id会作为生成包的命名的一部分。官方预定义的描述符:
下面是官方预定义的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>
自定义的描述符: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>
上面用到的所有语法集合:
<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>
assembly参数很多,可以在官网自行查看,https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。