打包插件
maven打包插件很多,最常见的如下:
-
maven-jar-plugin:最常见 -
maven-assembly-plugin:可以打包含依赖包和不包含依赖包 -
maven-shade-plugin:和maven-assembly-plugin差不多 -
spring-boot-maven-plugin:SpringBoot打可执行包
这里主要介绍一下maven-assembly-plugin,因为它不仅可以打包含依赖的包,也可以打不包含依赖的包。
很多时候我们要把jar包上传到远程服务器,但是依赖的jar包很多,可能有几百MB,上传可能会比较慢。
这时,我们就需要打不包含依赖包的jar,依赖的jar包我们传一次就好,某个依赖jar版本更新了再传某个jar。
一个简单的例子:
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>vip.meeet</groupId>
<artifactId>pkg</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>
vip.meet.Start
</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>alimaven</id>
<name>Maven Aliyun Mirror</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
maven-assembly-plugin本身也是可以拷贝依赖lib的,但是要单独配置assembly.xml文件:
<dependencySets>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
这里我们使用的是pache.maven.plugins插件来执行拷贝。
执行打包命令:
mvn package
执行命令:
java -jar pkg-1.0.0-jar-with-dependencies.jar
java -cp pkg-1.0.0.jar;./lib/* vip.meet.Start
需要注意的是不带依赖的jar包执行,
首先,不带依赖的jar包的主属性清单MANIFEST.MF中是没有Main-Class: vip.meet.Start的,所以得通过指定主类执行。
如果在主属性清单MANIFEST.MF中加上Main-Class: vip.meet.Start能不能执行呢?
答案是:不能
因为java命令加上了-jar参数之后,指定classpath的-cp参数就不生效了。
不信邪的朋友可以自己动手试一下。
注意:-cp依赖,Windows 使用;分割,Linux使用:分割
|