先简单介绍下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包,就需要
- 指定Main-Class,以便确定程序的入口
- 要能加载到引入的依赖包
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压缩包了