Maven常用打包方式
Maven常用打包方式
1、maven-assembly-plugin插件打包
作用:将项目中的代码、资源、所有依赖包打成一个jar包。
<build>
<!--自定义打包方式-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>org.apache.HelloWorld</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
# 打包
# 生成hello-maven-1.0-SNAPSHOT-jar-with-dependencies.jar和hello-maven-1.0-SNAPSHOT.jar
$ mvn package
打包后会在 target 目录下生成一个 xxx-jar-with-dependencies.jar
文件,这个文件不但包含了自己项目中的
代码和资源,还包含了所有依赖包的内容。所以可以直接通过 java -jar 来运行。
$ java -jar hello-maven-1.0-SNAPSHOT-jar-with-dependencies.jar
Hello Maven
2、maven-shade-plugin插件打包
作用:和maven-assembly-plugin插件的作用一样,将自己项目的代码资源以及依赖第三方的资源一起打成一个
jar包,不过如果项目中用到 Framework,用maven-assembly-plugin这种方式打出来的包运行时会出错,使用
maven-shade-plugin插件可以处理这个问题。
<build>
<!--自定义打包方式-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.apache.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
# 打包
# 生成original-hello-maven-1.0-SNAPSHOT.jar和hello-maven-1.0-SNAPSHOT.jar
$ mvn package
执行打包后在 target 目录下会生成两个 jar 包,注意不是 original-xxx.jar 文件,而是另外一个。和 maven-
assembly-plugin 一样,生成的 jar 文件包含了所有依赖,所以可以直接运行。
# 执行
$ java -jar hello-maven-1.0-SNAPSHOT.jar
Hello Maven
3、maven-jar-plugin和maven-dependency-plugin插件打包
作用:将执行jar包和依赖包分开(依赖包放在lib目录下),且位于同一级目录。
3.3.1 插件功能介绍
maven-jar-plugin 用于生成 META-INF/MANIFEST.MF 文件的部分内容:
-
<mainClass>org.apache.HelloWorld</mainClass>
:指定MANIFEST.MF中的Main-Class。 -
<addClasspath>true</addClasspath>
:会在MANIFEST.MF加上Class-Path项并配置依赖包。 -
<classpathPrefix>lib</classpathPrefix>
:指定依赖包所在目录。
maven-dependency-plugin插件:maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,只是生
成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到
<outputDirectory>${project.build.directory}/lib</outputDirectory>
指定的位置,即lib目录下。
3.3.2 pom文件的配置
<build>
<!--自定义打包方式-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>org.apache.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</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>
</plugins>
</build>
注意:${project.build.directory}/lib
这个配置不需要修改,拿来即用。这个地方是配置依赖包存储的位
置。
# 打包
# 生成hello-maven-1.0-SNAPSHOT.jar
$ mvn package
执行jar包后的结构,执行jar包后会在target目录下生成jar包,并将依赖包拷贝到target/lib目录下。
指定了Main-Class,有了依赖包,那么就可以直接通过java -jar xxx.jar运行jar包。
# 执行
$ java -jar hello-maven-1.0-SNAPSHOT.jar
Hello Maven
4、appassembler-maven-plugin插件打包
作用:实现自动打包成可运行的脚本,还可以跨平台(Windows/linux)。
<build>
<plugins>
<!-- 支持java1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- -使用UTF-8编码处理资源文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>2.0.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
<configuration>
<repositoryLayout>flat</repositoryLayout>
<configurationDirectory>conf</configurationDirectory>
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<assembleDirectory>${project.build.directory}/${project.name}</assembleDirectory>
<extraJvmArguments>-Xms256m -Xmx1024m -Xss1024k -XX:PermSize=128M
-XX:MaxNewSize=256m -XX:MaxPermSize=128m
</extraJvmArguments>
<binFileExtensions>
<unix>.sh</unix>
</binFileExtensions>
<platforms>
<platform>windows</platform>
<platform>unix</platform>
</platforms>
<repositoryName>lib</repositoryName>
<programs>
<program>
<mainClass>org.apache.HelloWorld</mainClass>
<name>startup</name>
</program>
</programs>
</configuration>
</plugin>
</plugins>
</build>
# 打包
$ mvn package
查看打包结果:
进入bin目录下:
Windows 下执行startup.bat,linux下执行startup.sh。
$ startup.bat
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
Hello Maven
5、SpringBoot+Maven:spring-boot-maven-plugin
针对springboot和maven集成的项目,打成jar包,则需要使用springboot和maven集成好的打包插件:spring-
boot-maven-plugin,例如特别是含有@SpringBootApplication注解的入口启动程序。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.5.RELEASE</version>
<configuration>
<mainClass>org.apache.HelloWorld</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
# 打包
# 生成hello-maven-1.0-SNAPSHOT.jar
$ mvn package
# 执行
$ java -jar hello-maven-1.0-SNAPSHOT.jar
Hello Maven
该插件也可以通过 mvn spring-boot:run
命令进行运行。