(1)名稱解釋(插件的作用)
findbugs:檢測代碼的不明顯的語法錯誤。例如:用了==去比較字符串,定義了沒有用的變量……
checkstyle:檢測代碼的格式規范。例如:方法沒有寫注釋,類的命名不規范,括號的位置……
jacoco:檢測代碼覆蓋率。例如:類中有10個方法,對應的測試類中只測試了8個方法,這里的方法覆蓋率就是80%……
assembly:將需要用得到的腳本文件和jar/war包一起打包到target目錄下,一般只需要用到java項目中……
maven-jar-plugin:執行指定jar包的主類中的主方法
(2)插件的配置
2.1 findbugs-plugin (檢測代碼靜態語法錯誤)
執行插件的命令:mvn findbugs:check,檢測出有bug時會使得 maven項目build失敗,可以通過mvn findbugs:gui命令彈出錯誤詳情頁面
<!-- findbugs插件 :靜態檢查代碼的錯誤--> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>3.0.4</version> <configuration> <!-- 設置分析工作的等級,可以為Min、Default和Max --> <effort>Low</effort> <!-- Low、Medium和High (Low最嚴格) --> <threshold>Medium</threshold> <failOnError>true</failOnError> <includeTests>true</includeTests> <!--findbugs需要忽略的錯誤的配置文件--> <!-- <excludeFilterFile>compile.bat</excludeFilterFile> --> </configuration> <executions> <execution> <id>run-findbugs</id> <!-- 在install 階段觸發執行findbugs檢查,比如執行 mvn clean install,就會執行findbugs:check命令--> <phase>install</phase> <goals> <goal>check</goal> <!--指定執行check命令--> </goals> </execution> </executions> </plugin>
2.2 checkstyle-plugin (檢測代碼樣式規范)
使用該插件需要先配置規則文件,命名為checkstyle.xml 放在項目根目錄下
執行插件的命令 mvn checkstyle:check ,檢測出有樣式錯誤時 會使得maven項目構建失敗,可以打開target目錄下的checkstyle-result.xml文件查看錯誤詳情
<!-- 檢測代碼風格的插件 checkstyle(要在項目根目錄下配置規則文件checkstyle.xml),然后使用mvn checkstyle:check命令驗證--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>validate</id> <phase>validate</phase> <configuration> <encoding>UTF-8</encoding> <consoleOutput>true</consoleOutput> <failsOnError>true</failsOnError> <linkXRef>false</linkXRef> </configuration> <goals> <goal>check</goal> <!--指定執行check命令--> </goals> </execution> </executions> </plugin>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</reporting>
<properties>
<checkstyle.config.location>checkstyle.xml</checkstyle.config.location>
</properties>
規則文件checkstyle.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> <!-- This configuration file was written by the eclipse-cs plugin configuration editor --> <!-- Checkstyle-Configuration: JENKIS Description: none --> <module name="Checker"> <!--<property name="severity" value="warning"/> 這條注釋使得所有的錯誤都變成warning,不影響構建結果--> <module name="TreeWalker"> <module name="JavadocMethod"> <property name="scope" value="public"/> <property name="allowUndeclaredRTE" value="true"/> <property name="allowMissingParamTags" value="true"/> <property name="allowMissingJavadoc" value="false"/> </module> <module name="ConstantName"/> <module name="LocalFinalVariableName"/> <module name="MemberName"/> <module name="MethodName"/> <module name="PackageName"/> <module name="StaticVariableName"/> <module name="TypeName"/> <module name="AvoidStarImport"/> <module name="IllegalImport"/> <module name="RedundantImport"/> <module name="UnusedImports"/> <module name="LineLength"/> <module name="MethodLength"/> <module name="ParameterNumber"> <property name="tokens" value="METHOD_DEF"/> </module> <module name="EmptyForIteratorPad"/> <module name="GenericWhitespace"/> <module name="MethodParamPad"/> <module name="NoWhitespaceAfter"/> <module name="NoWhitespaceBefore"/> <module name="OperatorWrap"/> <module name="ParenPad"/> <module name="TypecastParenPad"/> <module name="WhitespaceAfter"/> <module name="WhitespaceAround"/> <module name="ModifierOrder"/> <module name="RedundantModifier"/> <module name="AvoidNestedBlocks"/> <module name="EmptyBlock"/> <module name="NeedBraces"> <property name="tokens" value="LITERAL_DO,LITERAL_ELSE,LITERAL_FOR,LITERAL_IF,LITERAL_WHILE"/> </module> <module name="AvoidInlineConditionals"/> <module name="EmptyStatement"/> <module name="EqualsHashCode"/> <module name="HiddenField"> <property name="tokens" value="VARIABLE_DEF"/> <property name="ignoreConstructorParameter" value="true"/> <property name="ignoreSetter" value="true"/> <property name="setterCanReturnItsClass" value="true"/> <property name="ignoreAbstractMethods" value="true"/> </module> <module name="IllegalInstantiation"/> <module name="InnerAssignment"/> <module name="MagicNumber"> <property name="ignoreHashCodeMethod" value="true"/> <property name="ignoreAnnotation" value="true"/> <property name="ignoreFieldDeclaration" value="true"/> <property name="constantWaiverParentToken" value="DIV,MINUS,UNARY_MINUS,STAR,PLUS,UNARY_PLUS,ASSIGN,ARRAY_INIT,EXPR,ELIST,METHOD_CALL,LITERAL_NEW,TYPECAST"/> </module> <module name="MissingSwitchDefault"/> <module name="SimplifyBooleanExpression"/> <module name="SimplifyBooleanReturn"/> <module name="FinalClass"/> <module name="HideUtilityClassConstructor"/> <module name="InterfaceIsType"/> <module name="VisibilityModifier"/> <module name="ArrayTypeStyle"/> <module name="TodoComment"/> <module name="UpperEll"/> <module name="RightCurly"> <property name="option" value="alone_or_singleline"/> <property name="tokens" value="LITERAL_CATCH,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_IF,LITERAL_TRY"/> </module> <module name="LeftCurly"> <property name="option" value="nl"/> <property name="tokens" value="ANNOTATION_DEF,LITERAL_CATCH,CLASS_DEF,CTOR_DEF,LITERAL_DO,LITERAL_ELSE,ENUM_CONSTANT_DEF,ENUM_DEF,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,INTERFACE_DEF,METHOD_DEF,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE"/> </module> <module name="EmptyLineSeparator"> <property name="tokens" value="CLASS_DEF,CTOR_DEF,ENUM_DEF,IMPORT,INSTANCE_INIT,INTERFACE_DEF,METHOD_DEF,PACKAGE_DEF,STATIC_INIT,VARIABLE_DEF"/> </module> </module> <module name="Translation"/> <module name="FileLength"/> </module>
2.3 jacoco-plugin (檢測代碼覆蓋率)
使用mvn jacoco:check命令執行該插件,在配置該插件時會指定class/method/instraction/line的覆蓋率,如果真是測試結果沒有達到指定的覆蓋率則會構建失敗,可以在target/site/jacoco目錄下的index.html文件查看詳情
<!--檢測代碼覆蓋率的插件 jacoco-->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>check</id>
<goals>
<goal>check</goal> <!--檢測代碼覆蓋率的goal-->
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal> <!--生成報告的goal-->
</goals>
</execution>
</executions>
<!-- Configuration 里面寫配置信息 -->
<configuration>
<!-- rules里面指定覆蓋規則 -->
<rules>
<rule implementation="org.jacoco.maven.RuleConfiguration">
<element>BUNDLE</element>
<limits>
<!-- 指定方法覆蓋到80% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>METHOD</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum> <!--注意:這里的數值都是百分比,只能寫0-1之間的值,例如:0.8-->
</limit>
<!-- 指定指令覆蓋到40% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>INSTRUCTION</counter>
<value>COVEREDRATIO</value>
<minimum>0.40</minimum>
</limit>
<!-- 指定行覆蓋到40% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.40</minimum>
</limit>
<!-- 指定類覆蓋到100%,不能遺失任何類 -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>CLASS</counter>
<value>MISSEDCOUNT</value>
<maximum>0</maximum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</plugin>
2.4 assembly-plugin (將腳本文件和jar、war包一起打包到target目錄下的插件)
執行這個插件直接和maven項目打包命令一樣 mvn package就可以了,這里需要配置三個地方,1、你需要打包的腳本文件 要放到一個文件夾下(文件夾可以直接新建在項目根目錄下,也可以放在src目錄下) 。2、編寫描述文件:你的文件打包規則以及打包好后的存放文件夾名。 3、maven里面的pom.xml中的配置
2.4.1 腳本文件的存放
這里是將腳本文件放在 src/main/resources目錄下的script文件夾中,腳本文件命名為 start.sh (script文件夾是自己新建的)
腳本文件示例:start.sh
#!/bin/sh cd /usr/src/myapp #進入jar包存放的目錄 #得到原來的進程ID pid,kill該進程 pid=`cat /usr/src/myapp/pid` #得到該目錄下 pid文件中的進程id if [ -n "$pid" ] then echo "kill -9 的pid:" $pid kill -9 $pid #kill該進程 fi #執行jar,並將進程掛起,保存進程ID到 pid文件 echo "Execute shell Finish" #執行項目jar包,將進程掛起,然后將進程id寫入當前目錄下的pid文件中 BUILD_ID=dontKillMe nohup java -jar /usr/src/myapp/JavademoIn7.jar & echo "$!" > pid
2.4.2 描述文件 script.xml (同樣放在src/main/resource目錄下)
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>script</id> <formats><!--打包的文件格式 zip,這里也可以是別的格式 比如 dir--> <format>zip</format> </formats> <fileSets> <fileSet> <directory>src/main/resources/script</directory><!--需要打包的目錄 也就是腳本文件存放的位置--> <outputDirectory>/</outputDirectory> <!-- 打包后輸出的路徑 輸出到arget目錄下,會自動命名為 項目名-script.zip --> </fileSet> </fileSets> </assembly>
2.4.3 在pom.xml中的配置
<!-- 將執行項目的腳本文件一起打包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4.1</version> <executions> <execution> <id>${project.version}</id><!--名字任意 --> <phase>package</phase> <!-- 綁定到package生命周期階段上 --> <goals> <goal>single</goal> <!-- 只運行一次 --> </goals> <configuration> <descriptors> <!--描述文件路徑--> <descriptor>src/main/resources/script.xml</descriptor> </descriptors> <!--這樣配置后,mvn deploy不會把assembly打的zip包上傳到nexus--> <attach>false</attach> </configuration> </execution> </executions> </plugin>
2.5 maven-jar-plugin (執行項目的主類中的主方法)
這個也沒有執行命令,直接使用mvn package 或者 mvn install命令就會執行
<!-- 指定執行的主類(main方法所在的類)-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<!-- 添加index則不從mainfest中讀取classpath,而是從Index.list中讀取 -->
<!-- <index>true</index> -->
<manifest>
<mainClass>cn.demo.JavademoIn7.application.ApplicationMain</mainClass> <!--這是主類的路徑-->
</manifest>
</archive>
</configuration>
</plugin>
(3)完整的pom.xml配置示例
<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>cn.demo</groupId> <artifactId>JavademoIn7</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <!-- 打包成jar包 --> <name>JavademoIn7</name> <url>http://maven.apache.org</url> <build> <finalName>JavademoIn7</finalName> <plugins> <plugin> <inherited>true</inherited> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${compiler.source}</source> <target>${compiler.target}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <!-- 檢測代碼風格的插件 checkstyle(要在項目根目錄下配置規則文件checkstyle.xml),然后使用mvn checkstyle::check命令驗證--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>validate</id> <phase>validate</phase> <configuration> <encoding>UTF-8</encoding> <consoleOutput>true</consoleOutput> <failsOnError>true</failsOnError> <linkXRef>false</linkXRef> </configuration> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> <!-- 指定執行的主類(main方法所在的類)--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> <archive> <!-- 添加index則不從mainfest中讀取classpath,而是從Index.list中讀取 --> <!-- <index>true</index> --> <manifest> <mainClass>cn.demo.JavademoIn7.application.ApplicationMain</mainClass> </manifest> </archive> </configuration> </plugin> <!-- 將執行項目的腳本文件一起打包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4.1</version> <executions> <execution> <id>${project.version}</id><!--名字任意 --> <phase>package</phase> <!-- 綁定到package生命周期階段上 --> <goals> <goal>single</goal> <!-- 只運行一次 --> </goals> <configuration> <descriptors> <!--描述文件路徑--> <descriptor>src/main/resources/script.xml</descriptor> </descriptors> <!--這樣配置后,mvn deploy不會把assembly打的zip包上傳到nexus--> <attach>false</attach> </configuration> </execution> </executions> </plugin> <!-- findbugs插件 :靜態檢查代碼的錯誤--> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>3.0.4</version> <configuration> <!-- 設置分析工作的等級,可以為Min、Default和Max --> <effort>Low</effort> <!-- Low、Medium和High (Low最嚴格) --> <threshold>Medium</threshold> <failOnError>true</failOnError> <includeTests>true</includeTests> <!--findbugs需要忽略的錯誤的配置文件--> <!-- <excludeFilterFile>compile.bat</excludeFilterFile> --> </configuration> <executions> <execution> <id>run-findbugs</id> <!-- 在install 階段觸發執行findbugs檢查,比如執行 mvn clean package--> <phase>install</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> <!--檢測代碼覆蓋率的插件 jacoco--> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.8</version> <executions> <execution> <id>prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>check</id> <goals> <goal>check</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> </execution> </executions> <!-- Configuration 里面寫配置信息 --> <configuration> <!-- rules里面指定覆蓋規則 --> <rules> <rule implementation="org.jacoco.maven.RuleConfiguration"> <element>BUNDLE</element> <limits> <!-- 指定方法覆蓋到80% --> <limit implementation="org.jacoco.report.check.Limit"> <counter>METHOD</counter> <value>COVEREDRATIO</value> <minimum>0.50</minimum> </limit> <!-- 指定指令覆蓋到80% --> <limit implementation="org.jacoco.report.check.Limit"> <counter>INSTRUCTION</counter> <value>COVEREDRATIO</value> <minimum>0.40</minimum> </limit> <!-- 指定行覆蓋到80% --> <limit implementation="org.jacoco.report.check.Limit"> <counter>LINE</counter> <value>COVEREDRATIO</value> <minimum>0.40</minimum> </limit> <!-- 指定類覆蓋到100%,不能遺失任何類 --> <limit implementation="org.jacoco.report.check.Limit"> <counter>CLASS</counter> <value>MISSEDCOUNT</value> <maximum>0</maximum> </limit> </limits> </rule> </rules> </configuration> </plugin> </plugins> </build> <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </reporting> <properties> <checkstyle.config.location>checkstyle.xml</checkstyle.config.location> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <compiler.source>1.7</compiler.source> <compiler.target>1.7</compiler.target> <junit.version>4.12</junit.version> </properties> <dependencies> <dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.8</version> </dependency> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </project>