Maven 打包 jar

本文详细介绍了使用Maven进行Java项目打包的各种方法,包括maven-jar-plugin、maven-shade-plugin、maven-assembly-plugin及spring-boot-maven-plugin的配置与使用。深入探讨了如何设置Java版本、指定主类、包含依赖以及处理spring-boot项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Maven创建Java项目

mvn archetype:generate "-DgroupId=<包名>" "-DartifactId=<项目名>" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DinteractiveMode=false"

两种设置java版本的方法,修改pom.xml

  1. 配置properties节点下的maven编译器信息
<properties>
  <maven.compiler.target>15</maven.compiler.target>
  <maven.compiler.source>15</maven.compiler.source>
</properties>
  1. 配置build > plugins > plugins > configuration 节点下的source和target节点值
<plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.0</version>
      <configuration>
        <source>15</source>
        <target>15</target>
      </configuration>
    </plugin>
</plugins>

运行结果如下
在这里插入图片描述

Maven 常用的打包方式

插件功能
maven-jar-pluginmaven 默认打包插件,用来创建 project jar
maven-shade-plugin打可执行包,executable(fat) jar
maven-assembly-plugin支持自定义打包方式
spring-boot-maven-pluginspring boot 定制的打包方式

java 项目打包

maven-jar-plugin(默认打包工具)

该组件虽然是默认添加的,但没有显示指定 MainClass 打包出来的 jar 包依旧无法运行,会提示没有主清单属性。

在这里插入图片描述
修改 pom.xml,添加如下配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass> ${包名.MainClass类名} </mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

在这里插入图片描述

在没有引用任何依赖的情况下,上面的打包方式是可以的(即使不做任何配置,也可以正常运行)。但如果你的项目有引用第三方lib,则需要额外添加插件maven-dependency-plugin。它的 addClasspath 和 classpathPrefix 表明,会把 lib 下的jar作为第三方依赖加入 package 里,去target目录下也可以发现多了个lib目录。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy</id>
            <phase>compile</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

maven-shade-plugin

<project>
	<build>
	   <plugins>
			<!-- maven-shade-plugin -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<transformers>
								<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
								    <mainClass> ${包名.MainClass类名} </mainClass>
								</transformer>
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

maven-assembly-plugin

<!-- Maven Assembly Plugin -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <!-- get all project dependencies -->
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <!-- MainClass in mainfest make a executable jar -->
        <archive>
            <manifest>
                <mainClass> ${包名.MainClass类名} </mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <!-- bind to the packaging phase -->
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

spring boot 项目打包

spring-boot-maven-plugin

设置打包类型

spring 之前基本都是打成 war 类型,现在以 jar 类型为主(若未配置,默认在 target 目录下生成 jar 包),查看 pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<!-- ... -->
	<packaging>jar</packaging>
	<!-- ... -->
</project>

配置插件

创建 spring boot 的时候,自动帮你添加了 spring-boot-maven-plugin,即使不对其进行任何配置操作,也可以直接使用 mvn package 命令将其打包!

对于 spring-boot-starter-parent 的项目, 需要在properties中指定start-class启动类。

  • layout 属性用来指定打成什么类型
类型Main-Class含义
jarorg.springframework.boot.loader.JarLauncher可执行的 jar
warorg.springframework.boot.loader.warLauncher可执行war,需要的servlet容器依赖位于WEB-INF/lib-provided
ziporg.springframework.boot.loader.PropertiesLauncherDIR,类似于JAR
module将所有的依赖库打包(scope为provided的除外),但是不打包Spring Boot的任何Launcher
none将所有的依赖库打包,但是不打包Spring Boot的任何Launcher
  • 构建目标
目标含义
run运行 spring boot 项目
repackage默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin
start / stop在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
build-info生成Actuator使用的构建信息文件build-info.properties
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.2.RELEASE</version>
		<relativePath />
	</parent>
	
	<properties>
		<start-class>  ${包名.MainClass类名}  </start-class>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>14</java.version>
	</properties>
	
	<build>
		<plugins>
			<!-- ... -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<mainClass>${start-class}</mainClass>
					<layout>ZIP</layout>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<!-- ... -->
		</plugins>
	</build>
</project>

打包

执行 mvn package spring-boot:repackage 进行打包,在 target 目录下就会生成打包好的 jar 文件了。使用 nautilus target/ 可以直接打开 target 所在的文件管理器进行操作
在这里插入图片描述打开 jar 中的 /META-INF/MANIFEST.MF 文件,可以看到之前配置的 Main-Class 和 layout 类型对应的 Start-Class

Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Build-Jdk-Spec: 14
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Version: 2.3.2.RELEASE
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx

画蛇添足

spring 默认自带了 spring-boot-maven-plugin 来打包程序,如果又引入 maven-shade-plugin 打包时会报如下错误
在这里插入图片描述

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:3.2.4:shade (default) on project demo: Unable to parse configuration of mojo org.apache.maven.plugins:maven-shade-plugin:3.2.4:shade for parameter resource: Cannot find ‘resource’ in class org.apache.maven.plugins.shade.resource.ManifestResourceTransformer -> [Help 1]

打包失败

执行 mvn package 报如下错误,提示 ApplicationTests 头部没找到 @SpringBootConfiguration 注解。
无稽之谈是不是,spring-boot-starter-test 模块的注解通常都是 @SpringBootTest
在这里插入图片描述
解决办法是:删除pom.xml里的这段话

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>
Maven 是一个非常常用的 Java 项目构建工具,使用 Maven 打包 jar 可以方便地将项目打包一个可执行的 Jar 包,使得项目的发布、部署等工作变得轻松快捷。下面我将详细介绍如何使用 Maven 打包 jar。 首先,需要确保电脑上已经安装了 Maven。在安装好 Maven 之后,可以使用 Maven 的命令行工具进行操作。进入到要打包的项目的根目录下,执行以下命令: ```bash mvn clean package ``` 其中 `clean` 表示删除之前编译的类和 jar 文件,`package` 表示将项目打包一个 jar 文件。 在执行命令之后,Maven 会自动编译项目代码,将编译好的类文件和依赖的库文件打包一个 jar 文件,并将其放置在项目的 `target` 文件夹下。 在这个过程中,如果项目依赖的库没有被安装到本地仓库或中央仓库中,Maven 会自动从中央仓库或其他配置好的仓库下载并安装这些依赖库。 如果需要指定 jar 文件的名称和路径,可以在 `pom.xml` 文件中进行配置。在 `build` 标签中添加以下代码: ```xml <finalName>${project.artifactId}-${project.version}</finalName> <outputDirectory>./target</outputDirectory> ``` 其中 `finalName` 指定了 jar 文件的名称,`${project.artifactId}` 表示项目的名称,`${project.version}` 表示项目的版本号;`outputDirectory` 指定了 jar 文件输出的目录。 除了使用命令行打包 jar,也可以在 Maven 的开发工具中(如 Eclipse、IntelliJ IDEA 等)直接使用打包插件进行操作。 总之,使用 Maven 打包 jar 是一个非常便捷的操作,可以方便地将项目打包一个可执行的 Jar 包,并将其部署到不同的环境中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值