$ Maven常用插件配置

https://maven.apache.org/guides/mini/guide-configuring-plugins.html

$ maven-compiler-plugin

$ 传递编译参数

3.3及以下版本:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.0</version>
  <configuration>
    <compilerArgument>-verbose -bootclasspath ${java.home}/lib/rt.jar</compilerArgument>
  </configuration>
</plugin>

或者:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.0</version>
  <configuration>
    <compilerArguments>
      <verbose/>
      <bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
      <Xmaxerrs>1000</Xmaxerrs>
      <Xlint:unchecked/>
    </compilerArguments>
  </configuration>
</plugin>

3.3以上版本:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.9.0</version>
  <configuration>
    <compilerArgs>
      <arg>-verbose</arg>
      <arg>-Xlint:all,-options,-path</arg>
    </compilerArgs>
  </configuration>
</plugin>

参考

3.0-Pass Compiler Arguments (opens new window)

3.9.0-Pass Compiler Arguments (opens new window)

$ maven-source-plugin

创建当前项目源文件的 jar 存档。

从插件的 3.0.0 版本开始,所有可以通过命令行使用的属性都基于以下模式maven.source.*命名。

$ 插件目标

目标 说明
source:jar 将项目主源码打包到一个jar中
source:jar-no-fork 类似于jar,但不fork构建声明,适合附加到构建生命周期。
source:test-jar 将项目测试源码打包到一个jar中
source:test-jar-no-fork 类似于test-jar,但不fork构建,适合附加到构建生命周期。
source:aggregate 聚合所有模块的源码到一个项目中
source:generated-test-jar 将测试源码打包到一个jar中
source:help 展示帮助信息,使用命令mvn source:help -Ddetail=true -Dgoal=<goal-name>展示参数详情

$ 参考

Apache Maven Source Plugin (opens new window)

$ maven-assembly-plugin

$ assembly:assembly

2.x版本中的assembly目标在3.x版本中已删除,新版旧版都可以使用single目标代替。

$ assembly:single

$ 描述文件

描述文件用来指定打包的格式,可以使用自定义的描述文件:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <configuration>
    <finalName>${project.artifactId}</finalName>
    <descriptors>
      <descriptor>${assembly.descriptor}</descriptor>
    </descriptors>
  </configuration>
</plugin>

或者使用maven-assembly-plugin内置描述文件:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <appendAssemblyId>false</appendAssemblyId>
    <archive>
      <manifest>
        <mainClass>my.sample.App</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

配置说明:

配置项 说明
descriptorRef jar-with-dependencies 连同依赖jar包打成一个uber jar
appendAssemblyId false 去掉文件名中的jar-with-dependencies`后缀
archive.manifest.mainClass my.sample.App 打成以java -jar方式执行的jar

$ 执行

可以使用mvn assembly:single执行,也可以绑定到package阶段执行:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <configuration>
    <!-- ... -->
  </configuration>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
          <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

参考:

$ maven-shade-plugin

$ shade:shade

使用Transformer合并HDFS ServiceLoader的配置文件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <transformers>
            <transformer
                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                <resource>META-INF/services/org.apache.hadoop.fs.FileSystem</resource>
            </transformer>
            <transformer
                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>my.sample.App</mainClass>
            </transformer>
        </transformers>
    </configuration>
</plugin>

指定主类:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <configuration>
        <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>foo.bar.MainClass</mainClass>
            </transformer>
        </transformers>
    </configuration>
 </plugin>

解决报错问题:

java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
    at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284)
    at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238)
    at java.util.jar.JarVerifier.processEntry(JarVerifier.java:316)
    at java.util.jar.JarVerifier.update(JarVerifier.java:228)
    at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
    at java.util.jar.JarFile.getInputStream(JarFile.java:450)
    at sun.misc.JarIndex.getJarIndex(JarIndex.java:137)
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:839)
    at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:831)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:830)
    at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:803)
    at sun.misc.URLClassPath$3.run(URLClassPath.java:530)
    at sun.misc.URLClassPath$3.run(URLClassPath.java:520)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:519)
    at sun.misc.URLClassPath.getLoader(URLClassPath.java:492)
    at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:457)
    at sun.misc.URLClassPath.getResource(URLClassPath.java:211)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:365)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"

解决:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
   <configuration>
     <minimizeJar>true</minimizeJar>
     <filters>
       <filter>
         <artifact>*:*</artifact>
         <excludes>
           <exclude>META-INF/*.SF</exclude>
           <exclude>META-INF/*.DSA</exclude>
           <exclude>META-INF/*.RSA</exclude>
         </excludes>
       </filter>
     </filters>
   </configuration>
</plugin>

参考:

Invalid signature file digest for Manifest main attributes exception while trying to run jar file (opens new window)

$ maven-dependency-plugin

$ dependency:analyze

将依赖分为三类:

  • used and declared
  • used and undeclared
  • unused and declared

此目标总是执行test-compile阶段。

maven-dependency-analyzer (opens new window) 作为默认的分析器,因为工作在字节码层面而非源码层面,所以某些情况检测不到,包括常量、仅保留在源代码的注解和 Javadoc 中的链接。

名称 类型 描述
analyzer String 指定依赖分析器
failOnWarning boolean 发现告警时让构建失败
ignoreNonCompile boolean 对于未使用的依赖分析忽略这些scope:Runtime/Provided/Test/System
ignoreUnusedRuntime boolean 对于未使用的依赖分析忽略这些scope:Runtime
ignoredDependencies String[] 对于“声明但未使用”和“使用但未声明”的列表忽略这些依赖,过滤语法:[groupId]:[artifactId]:[type]:[version],可以使用*通配符。
ignoredUnusedDeclaredDependencies String[] 对于“声明但未使用”的列表忽略这些依赖,过滤语法:[groupId]:[artifactId]:[type]:[version],可以使用*通配符。
ignoredUsedUndeclaredDependencies String[] 对于“使用但未声明”的列表忽略这些依赖,过滤语法:[groupId]:[artifactId]:[type]:[version],可以使用*通配符。
outputXML boolean 输出缺失依赖的xml(使用但未声明)
skip boolean 跳过插件的执行
usedDependencies String[] 强制依赖被使用(覆盖由字节码层面分析造成的不完整结果),依赖格式:groupId:artifactId
Verbose boolean 输出使用到的依赖

$ 参考

Apache Maven Dependency Plugin – dependency:analyze (opens new window)

$ maven-pmd-plugin

$ 简介

是一个静态代码检测工具。它可以用来检查:

  • 潜在的bug:空的try/catch/finally/switch语句
  • 未使用的代码:未使用的局部变量、参数、私有方法等
  • 可选的代码:String/StringBuffer的滥用
  • 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环
  • 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs

$ 默认规则集

Using Rule Sets (opens new window)

$ 自定义规则集

参考:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.p3c</groupId>
            <artifactId>p3c-pmd</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>
    <configuration>
        <rulesets>
            <ruleset>rulesets/java/ali-concurrent.xml</ruleset>
            <ruleset>rulesets/java/ali-exception.xml</ruleset>
            <ruleset>rulesets/java/ali-flowcontrol.xml</ruleset>
            <ruleset>rulesets/java/ali-naming.xml</ruleset>
            <ruleset>rulesets/java/ali-oop.xml</ruleset>
            <ruleset>rulesets/java/ali-orm.xml</ruleset>
            <ruleset>rulesets/java/ali-other.xml</ruleset>
            <ruleset>rulesets/java/ali-set.xml</ruleset>
        </rulesets>
    </configuration>
</plugin>

$ 参考

添加PMD插件扫描潜在的bug (opens new window)

更新时间: 5/14/2022, 1:08:54 AM