maven打包的各种方式和如何在使用maven-assembly-plugin打包时去掉assembly id

先简单介绍下maven打包的几种方式,如果你只是想知道如何使用assembly插件打包的时候去掉assembly id可以直接跳到下面

Maven打包的几种方式

1. 使用maven-jar-plugin打包

使用默认的maven-jar-plugin 打包

在使用idea的时候,如果不引入任何maven打包插件,在执行mvn clean package的时候会使用默认的maven-jar-plugin进行打包,得到一个artifactId-version.jar的包
在这里插入图片描述
这个包里不包含我们引入的maven依赖,并且没有指定MainClass,所以不是一个可执行jar,往往是用于在多模块项目中进行引用的
在这里插入图片描述

使用maven-jar-plugin和maven-dependency-plugin插件打包

如果想要打包一个可以直接通过java -jar命令运行的jar包,就需要

  1. 指定Main-Class,以便确定程序的入口
  2. 要能加载到引入的依赖包
public class App {
    
    

    public static void main(String[] args) {
    
    
        System.out.println(JSON.parse("{\"name\":\"chenpp\"}"));
        System.out.println("Project start success!");
    }
}

pom.xml

 <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>
                            <!--在MANIFEST.MF加上Class-Path项并配置依赖包(如果有的话)-->
                            <addClasspath>true</addClasspath>
                            <!--指定依赖包所在目录-->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--指定MANIFEST.MF中的Main-Class-->
                            <mainClass>com.chenpp.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!--复制依赖包到如下目录下,以便在maven-jar-plugin里指定。就是项目target目录下的lib目录-->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

可以看到打包后的目录结构如下:
在这里插入图片描述
其jar包的MANIFEST.MF内容如下:
在这里插入图片描述
试下执行该jar包, 这样一个可执行jar就打包好了
在这里插入图片描述

2. 使用maven-assembly-plugin插件打包

打包一个可执行jar

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.chenpp.App</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <!--表示在执行package打包时,执行assembly:single,所以可以直接使用mvn package打包-->
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

打包后会得到两个jar包,一个是通过maven-jar-plugin:2.4:jar 打包得到的maven-package-1.0.jar(非可执行jar),一个是由maven-assembly-plugin打包得到的maven-package-1.0-jar-with-dependencies.jar,是一个可执行jar包,MANIFEST.MF里指定了Main-Class,而依赖jar是通过把所有依赖jar的代码也拷贝到jar包里来实现的,所以该jar明显比默认的jar包大很多
在这里插入图片描述
在这里插入图片描述

打包zip等不同类型的压缩包

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!--   这个是assembly的配置文件所在位置  -->
                    <descriptor>build.xml</descriptor>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

有一个重要的配置文件build.xml,其各参数见官网如下: http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <!--是否你打的包会包含你当前项目的Base目录,这里就是会包含一个maven-package-1.0目录,默认为true-->
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <!--表示是否需要引入当前项目的jar包到dependencySet,默认为true-->
            <useProjectArtifact>true</useProjectArtifact>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <!--复制resources下的文件到jar包的conf目录-->
            <directory>src/main/resources</directory>
            <outputDirectory>conf</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

打包后的目录结构如下所示:
在这里插入图片描述
需要注意这样打包出来的是artifactId-version-id.formats包(这里就是maven-package-1.0-bin.zip),而不是可执行jar
在这里插入图片描述

3. 使用maven-shade-plugin插件打包

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.chenpp.App</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

在这里插入图片描述
打包出来的是三个包,maven-package-1.0.jar和shade插件打包出来的maven-package-1.0-shaded.jar都是可执行jar,而original…jar 里只包含了project自己的 class 文件
在这里插入图片描述

maven-assembly-plugin打包如何去掉assembly id

最近在部署项目的时候遇到一个问题,发布平台在创建镜像的时候会去找artifactId-version.zip文件,于是我只能选择maven-assembly-plugin插件来打包,但是这样一来得到的包会带有assembly id的后缀,如何去掉呢?

查阅资料后发现有配置属性<appendAssemblyId>false</appendAssemblyId>,只要将其加入就行

```xml
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptor>build.xml</descriptor>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

`这样就可以得到不含assembly id的zip压缩包了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35448165/article/details/111717625