5、常用插件

maven-jar-plugin

默认maven打包的结果没有指定mainClass,所以使用java -jar命令会显示xxx.jar中没有主清单属性,使用此插件可以指定mainClass

注意:这个插件并不会打包依赖进jar,所以如果有依赖的项目,需要使用maven-dependency-pluginmaven-shade-plugin等插件

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!-- 此处为主入口 -->
                        <mainClass>top.ygang.demo.Start</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

maven-dependency-plugin

处理与依赖相关的插件,它有很多可用的goal,大部分是和依赖构建、分析和解决相关的goal,这部分goal可以直接用maven的命令操作,例如:mvn dependency:treemvn dependency:analyze 但是我们最常用到的是 dependency:copydependency:copy-dependenciesdependency:unpackdependency:unpack-dependencies 这四个。

例如有的时候,并不希望依赖打进jar、而是放在jar文件的同级目录中,可以与maven-jar-plugin插件搭配,来实现这种效果

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <!-- 设置classpath的前缀,最终会写在MANIFEST.MF中 -->
                <classpathPrefix>lib/</classpathPrefix>
                <!-- 此处为主入口 -->
                <mainClass>top.ygang.Start</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

purge-local-repository

这个命令会清理pom.xml中的包,并重新下载,但是并不清理不在pom.xml中的依赖包。

mvn dependency:purge-local-repository

#reResolve是否重新解析依赖关系
#actTransitively是否应该对所有传递依赖性起作用。默认值为true。
mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false 

maven-shade-plugin

默认maven打包的结果只包含项目本身的代码,并不包含项目的依赖,maven-shade-plugin插件可以帮助我们将项目的依赖包打进最终jar文件

采用的是合并依赖项的方式,也就是将所有的依赖jar解压后的字节码等文件和项目的字节码等文件全部打进最终jar,以便在单个JAR文件中包含所有的依赖

会生成两个jar,一个含有依赖项的jar,另一个以original-开头的不含依赖的jar

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.3</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>top.yhgh.demo.Start</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

maven-assembly-plugin

Assembly 插件的主要作用是,允许用户将项目输出与它的依赖项、模块、站点文档、和其他文件一起组装成一个可分发的归档文件。说白了就是:结构定制化的打包。

使用Assembly插件需要一个描述符文件(配置文件),该文件指定了打包格式,包含的文件/过滤的文件等信息,可以同时指定多个描述符文件,打包成不同的格式。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.4</version>
  <executions>
    <execution>
      <!-- 绑定到package生命周期阶段上 -->
      <phase>package</phase> 
      <goals>
        <!-- 该打包任务只运行一次 -->
        <goal>single</goal> 
      </goals>
      <configuration>
        <descriptors>
          <!-- 描述文件路径 -->
          <descriptor>src/main/resources/assembly.xml</descriptor> 
        </descriptors>
      </configuration>
    </execution>
  </executions>
</plugin>

描述文件

<?xml version="1.0" encoding="utf-8"?>
<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 标识符,添加到生成文件名称的后缀符。
		如果指定 id 的话(这里指定的是项目的版本),目标文件则是 ${artifactId}-${id}.jar。 
	-->
    <id>full</id>
    
    <!-- 
		指定打包格式。
		支持的打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war
		可以同时指定多个打包格式 
	-->
    <formats>
        <format>jar</format>
    </formats>
    
    <!-- 
		指定打的包是否包含打包层目录(比如finalName是ygang-demo,
		当值为true,所有文件被放在包内的ygang-demo目录下,否则直接放在包的根目录下)
	-->
    <includeBaseDirectory>true</includeBaseDirectory>
    
    <!-- 指定将工程依赖的包打到包里的指定目录下 -->
    <dependencySets>
        <dependencySet>
			<!-- 指定打包时是否包含工程自身生成的jar包 -->
            <useProjectArtifact>true</useProjectArtifact>
            <!-- 指定将这些依赖包打到包里lib目录下 -->
            <outputDirectory>lib</outputDirectory> 
            <!-- 用于管理依赖的部署,runtime表示只在运行时使用 -->
            <scope>runtime</scope> 
        </dependencySet>
    </dependencySets>
    
    <!-- 指定要包含的文件集,可以定义多个fileSet -->
    <fileSets>
        <fileSet>
            <!-- 指定归档文件(要打的jar包)要包含的目录(下的文件及文件夹) -->
            <directory>src/main/script/linux/bin</directory> 
            <!-- 指定要将当前目录(<directory>标签中的目录放在归档文件(要打的jar包)bin目录下) -->
            <outputDirectory>bin</outputDirectory> 
            <!-- 精确控制要包含的文件,<excludes>用于精确控制要排除的文件  -->
            <includes>
                <include>ygang-demo</include> 
                <include>server</include>
            </includes>
            <!-- 设置文件 UNIX 属性,是一种读写权限 -->
            <fileMode>0755</fileMode> 
        </fileSet> 
    </fileSets>
    
</assembly>

javapackager

可以用来将java项目打包为可执行项目,例如exe

GitHub:https://github.com/fvarrui/JavaPackager

<plugin>
    <groupId>io.github.fvarrui</groupId>
    <artifactId>javapackager</artifactId>
    <version>1.7.2</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>package</goal>
            </goals>
            <configuration>
                <!-- 启动类 -->
                <mainClass>top.ygang.Start</mainClass>
                <!-- 是否捆绑一个jre,默认为false -->
                <bundleJre>true</bundleJre>
                <!-- 是否使用精简版jre ,默认为true,可以不写-->
                <customizedJre>true</customizedJre>
                <!-- jre路径,可以不写 -->
                <jrePath>C:\Program Files\Java\jre1.8.0_311</jrePath>
                <!-- jdk路径,可以不写 -->
                <jdkPath>C:\Program Files\Java\jdk1.8.0_311</jdkPath>
                <!-- 是否生成安装包,默认为true,可以不写 -->
                <generateInstaller>true</generateInstaller>
                <!-- 是否使用管理员身份打开应用,默认为false,可以不写 -->
                <administratorRequired>false</administratorRequired>
                <!-- App Name -->
                <name>My Demo</name>
                <displayName>${name}</displayName>
                <!-- 平台,默认为auto,可选windows、mac、linux -->
                <platform>auto</platform>
                <!-- 虚拟机参数 -->
                <vmArgs>
                    <vmArg>--add-opens java.base/java.lang=ALL-UNNAMED</vmArg>
                </vmArgs>
                <!-- windows平台配置 -->
                <winConfig>
                    <icoFile>D:\logo.ico</icoFile>
                </winConfig>
            </configuration>
        </execution>
    </executions>
</plugin>