默认maven打包的结果没有指定mainClass
,所以使用java -jar
命令会显示xxx.jar中没有主清单属性,使用此插件可以指定mainClass
注意:这个插件并不会打包依赖进jar,所以如果有依赖的项目,需要使用maven-dependency-plugin
、maven-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>
处理与依赖相关的插件,它有很多可用的goal,大部分是和依赖构建、分析和解决相关的goal,这部分goal可以直接用maven的命令操作,例如:mvn dependency:tree
、mvn dependency:analyze
但是我们最常用到的是 dependency:copy
、dependency:copy-dependencies
及dependency:unpack
、dependency: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>
这个命令会清理pom.xml中的包,并重新下载,但是并不清理不在pom.xml中的依赖包。
mvn dependency:purge-local-repository
#reResolve是否重新解析依赖关系
#actTransitively是否应该对所有传递依赖性起作用。默认值为true。
mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false
默认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>
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>
可以用来将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>