Maven工程打jar包的N种方式

2023-10-30

一、IDEA自带打包插件

内容:此种方式可以自己选择制作胖包或者瘦包,但推荐此种方式制作瘦包。
输出:输出目录在out目录下
流程步骤

  1. 第一步: 依次选择 file->projecct structure->artifacts->点击+ (选择jar)->选择 from module with dependencies
    在这里插入图片描述
  2. 第二步:弹出窗口中指定Main Class,是否选择依赖jar包,是否包含测试。(尽量不选依赖包,防止依赖包选择不全)
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  3. 第三步:点击Build–>Build Artifacts–>选择bulid

二、maven插件打包

输出:输出目录在target目录下

2.1 制作瘦包(直接打包,不打包依赖包)

内容:仅打包出项目中的代码到JAR包中。
方式:在pom.xml中添加如下plugin; 随后执行maven install

 <!-- java编译插件 -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>指定版本</version>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
		<encoding>UTF-8</encoding>
	</configuration>
</plugin>

   
   

2.2 制作瘦包和依赖包(相互分离)

内容:将依赖JAR包输出到lib目录方式(打包方式对于JAVA项目是通用的)
将项目中的JAR包的依赖包输出到指定的目录下,修改outputDirectory配置,如下面的${project.build.directory}/lib。
方式

  1. pom.xml的build>plugins中添加如下配置。
  2. 点击maven project(右边栏)->选择Lifecycle->点击package打包
    注意:如果想将打包好的JAR包通过命令直接运行,如java -jar xx.jar。需要制定manifest配置的classpathPrefix与上面配置的相对应。如上面把依赖JAR包输出到了lib,则这里的classpathPrefix也应指定为lib/;同时,并指定出程序的入口类,在配置mainClass节点中配好入口类的全类名。
<plugins>
<!-- java编译插件 -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
		<encoding>UTF-8</encoding>
	</configuration>
</plugin>
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<archive>
			<manifest>
				<addClasspath>true</addClasspath>
				<classpathPrefix>lib/</classpathPrefix>
				<mainClass>com.yourpakagename.mainClassName</mainClass>
			</manifest>
		</archive>
	</configuration>
</plugin>
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-dependency-plugin</artifactId>
	<executions>
		<execution>
			<id>copy</id>
			<phase>install</phase>
			<goals>
				<goal>copy-dependencies</goal>
			</goals>
			<configuration>
				<outputDirectory>${project.build.directory}/lib</outputDirectory>
			</configuration>
		</execution>
	</executions>
</plugin>
</plugins>

   
   

注意:默认的classpath会在jar包内。为了方便,可以在Main方法配置后加上manifestEntries配置,指定classpath。

<plugin>  
	<groupId>org.apache.maven.plugins</groupId>  
	<artifactId>maven-jar-plugin</artifactId>  
	<configuration>  
		<classesDirectory>target/classes/</classesDirectory>  
		<archive>  
			<manifest>  
				<!-- 主函数的入口 -->  
				<mainClass>com.yourpakagename.mainClassName</mainClass>  
				<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->  
				<useUniqueVersions>false</useUniqueVersions>  
				<addClasspath>true</addClasspath>  
				<classpathPrefix>lib/</classpathPrefix>  
			</manifest>  
			<manifestEntries>  
				<Class-Path>.</Class-Path>  
			</manifestEntries>  
		</archive>  
	</configuration>  
</plugin>  

   
   

2.3 制作胖包(项目依赖包和项目打为一个包)

内容:将项目中的依赖包和项目代码都打为一个JAR包
方式

  1. pom.xml的build>plugins中添加如下配置;
  2. 点击maven project(右边栏)->选择Plugins->选择assembly->点击assembly:assembly
    注意:1. 针对传统的JAVA项目打包;
    2. 打包指令为插件的assembly命令,尽量不用package指令。
<plugin>
	<groupId>org.apache.maven.plugins</groupId>  
	<artifactId>maven-assembly-plugin</artifactId>  
	<version>2.5.5</version>  
	<configuration>  
		<archive>  
			<manifest>  
				<mainClass>com.xxg.Main</mainClass>  
			</manifest>  
		</archive>  
		<descriptorRefs>  
			<descriptorRef>jar-with-dependencies</descriptorRef>  
		</descriptorRefs>  
	</configuration>  
</plugin> 

   
   

2.4 制作胖包(transform部分自定义)

<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>
				<filters>
					<filter>
						<artifact>*:*</artifact>
						<excludes>
							<exclude>META-INF/*.SF</exclude>
							<exclude>META-INF/*.DSA</exclude>
							<exclude>META-INF/*.RSA</exclude>
						</excludes>
					</filter>
				</filters>
				<transformers>
					<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
						<resource>META-INF/spring.handlers</resource>
					</transformer>
					<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
						<resource>META-INF/spring.schemas</resource>
					</transformer>
					<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
						<resource>META-INF/spring.tooling</resource>
					</transformer>
					<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
						<mainClass>com.xxx.xxxInvoke</mainClass>
					</transformer>
				</transformers>
				<minimizeJar>true</minimizeJar>
				<shadedArtifactAttached>true</shadedArtifactAttached>
			</configuration>
		</execution>
	</executions>
</plugin>

   
   

三、SpringBoot项目打包

内容:将当前项目里所有依赖包和当前项目的源码都打成一个JAR包,同时还会将没有依赖包的JAR包也打出来,以.original保存
方式

  1. 在pom.xml的build>plugins中加入如下配置
  2. 点击maven project(右边栏)->选择Lifecycle->点击package或install打包
<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

   
   

四、Scala项目打包

方式

  1. 在pom.xml的build>plugins中加入如下配置
  2. 点击maven project(右边栏)->选择Lifecycle->点击package或install打包
<plugin>
	<groupId>org.scala-tools</groupId>
	<artifactId>maven-scala-plugin</artifactId>
	<executions>
		<execution>
			<goals>
				<goal>compile</goal>
					<goal>testCompile</goal>
				</goals>
		</execution>
	</executions>
	<configuration>
		<scalaVersion>${scala.version}</scalaVersion>
		<args>
			<arg>-target:jvm-1.5</arg>
		</args>
	</configuration>
</plugin>

   
   

五、groovy项目打包

方式

  1. 在pom.xml的build>plugins中加入如下配置
  2. 点击maven project(右边栏)->选择Lifecycle->点击package或install打包
<plugin>
	<groupId>org.codehaus.gmavenplus</groupId>
	<artifactId>gmavenplus-plugin</artifactId>
	<version>1.2</version>
	<executions>
		<execution>
			<goals>
				<goal>addSources</goal>
				<goal>addStubSources</goal>
				<goal>compile</goal>
				<goal>execute</goal>
			</goals>
		</execution>
	</executions>
</plugin>

   
   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven工程打jar包的N种方式 的相关文章

  • CompletableFuture 强制重用线程

    我正在批判性地利用 CompletableFuture delayedExecutor 1 TimeUnit MILLISECONDS execute gt 根据我在网上阅读的内容 每次调用都使用一个新线程是很常见的 我想知道是否有办法重用
  • Java:如何将所有 java 日期分组到相应的周中?

    Problem 我有一个很大的日期清单 我需要按周安排它们 问题 如何按以下方式对日期进行分组一年中的一周他们在吗 示例数据集 Date date new SimpleDateFormat parse 04 01 2015 Date dat
  • Java 1.6 和 Desktop.open() 的问题

    我一直在使用 Destop open 在 Windows 计算机 Vista 和 XP 上启动 pdf 查看器 并且大多数都工作得很好 但是 在一台 XP 计算机上 该调用不起作用 只是返回而不抛出任何异常 并且查看器不会启动 据我所知 在
  • 为什么java.util.Collection不直接定义next()、hasNext()呢?

    If 收藏定义有下一个 代替迭代器 hasNext 我们可以更容易地编写循环 while collection hasNext 代替 Iterator it collection iterator While it hasNext 当然 我
  • 在jodatime中计算一个月的周数

    jodatime 可以计算一个月的周数吗 我需要这样的东西 月份 七月 第 27 年的一周 1 7 七月 第 28 年的一周 9 14 七月 第 29 年的一周 16 21 七月 第 30 年的一周 23 31 七月 月份 八月 第 31
  • Spring Boot:将系统属性传递给 Maven

    I tried mvn Dspring profiles active dev spring boot run 但这并不影响我的默认配置 我用谷歌搜索了一下 发现 mvn DargLine Dspring profiles active d
  • 从枚举返回计算值

    我的问题有两个而且很简单 按原样误解枚举 这个想法在我的代码中缺少一些重要的抽象 代码示例 其中oprt calc x y 无法编译 有警告cannot find symbol public enum Operation PLUS publ
  • JOOQ初始化DAO最佳方法

    我想知道初始化 JOOQ 生成 DAO 的最佳实践 现在 我使用以下方法来初始化 JOOQ 生成的 DAO 在以下情况下 Student Dao 是 JOOQ 生成的 public class ExtendedStudentDAO exte
  • java中应用程序的CPU核心数和线程数之间有什么关系?

    我是java新手多线程编程 我想到的问题是 根据我的数量 我可以运行多少个线程CPU核心数 如果我运行的线程超过CPU核心数机器运行应用程序会产生开销吗 例如 当我们有一台服务器计算机 其中有一个运行 2 个线程 主线程 开发人员线程 的服
  • 原子/易失性/同步之间有什么区别?

    原子 易失性 同步内部如何工作 下面的代码块有什么区别 Code 1 private int counter public int getNextUniqueIndex return counter Code 2 private Atomi
  • Scala - InvalidClassException:没有有效的构造函数

    我创建了一个Serializable番石榴的版本ImmutableRangeMap and Builder在 Scala 中以便在我的 Spark 应用程序中使用 我的构造函数中有一个零参数SerializableImmutableRang
  • 信用卡号应该存储为字符串还是整数?

    是啊 只是想想而已 我应该将在我的网站上输入的信用卡号存储为字符串还是整数 我的意思是 它们由数字组成 这让我认为它是一个整数 但我不对它们进行数学运算 所以也许字符串更合适 编辑 所以我必须在加密之前存储在某个时刻输入的数字 我可能应该更
  • 用 Maven 解决 jar 地狱问题?

    我正在使用两个 jars A 和 B B 是一个库 A 的类使用库 B 中的一些旧类 现在 当我将这两个 jars 包含在我的项目类路径中时 这给我带来了一个问题 因为它们的名称相同两个班级 但其中一个班级比另一个班级年长 并且行为方式不同
  • 是否有更现代的面向对象版本的“让我们构建一个编译器”? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有更现代的 也许是面向对象的 相当于 Jack Crenshaw 的 让我们构建一个编译器 http
  • 如何在类图中对自定义异常关联进行建模?

    Reading here http www jguru com faq view jsp EID 62790 似乎使用泛化来建模自定义异常类很常见 它没有提到的是我如何对与可能引发自定义异常的类的关联进行建模 请注意 我并不是在问如何在引发
  • 使用 Maven 时如何在 Tomcat 7.0 中将上下文路径设置为根(“/”)

    我有一个maven项目 pom xml包含tomcat插件
  • Gradle 将多个依赖项提取到不同的目录

    我正在尝试将多个依赖项提取到不同的目录中 我尝试了以下方法 configurations cppDependencies dependencies cppDependencies com group artifact1 1 0 cppDep
  • Guava Splitter/Joiners 每次使用时都应该创建吗?

    Guava 包含用于拆分和连接字符串的实用程序 但它需要实例化 Splitter Joiner 对象才能执行此操作 这些是小对象 通常仅包含要分割 合并的字符 维护对这些对象的引用以便重用它们是一个好主意 还是在需要它们时创建它们并让它们被
  • Java 错误:默认构造函数未定义隐式超级构造函数

    我有一些简单的 Java 代码 其结构与此类似 abstract public class BaseClass String someString public BaseClass String someString this someSt
  • 使用 Appengine 进行多线程处理

    既然Appengine不允许java多线程 那么我们如何将现有的多线程代码迁移到该平台呢 例如我有以下代码 Thread t new Thread public boolean alive true public void run whil

随机推荐

  • YOLOv5导出jit,onnx,engine

    一 YOLOv5导出jit YOLOv5自导出 我们可以直接用它的导出代码 models export py Exports a YOLOv5 pt model to ONNX and TorchScript formats Usage e
  • 微信小程序【获取用户昵称头像和昵称(附源码)】

    获取用户昵称头像和昵称 wx getUserProfile bindgetuserinfo 登录过程 前端源码 https pan baidu com s 1uz2Gm2FMB 8RFVkhlHY3kQ 提取码 zb4w 后端源码 http
  • JS-设置、获取对象的键

    Object defineProperty 设置对象的键 将 name 刘备 phone 17783453234 转化为 刘备 17783453234 handleFamilyNumber let obj this family numbe
  • java将秒化为分钟和秒

    package Second import java util Scanner public class Demo1 将秒化为分钟和秒 author zll public static void main String args Scann
  • RS-485通信协议(ModBus版)

    从机 设备 的通信参数 波特率 2400 115200bps 出厂默认9600bps 数据位 7 9位 出厂默认8位 停止位 1 2位 出厂默认1位 奇偶校验 无校验 奇校验 偶校验 RS485 ModBus通信格式 主机向485总线发送问
  • spring boot整合shiro引用配置文件配置是出现的问题

    Spring boot 整合shiro 使用yml配置文件 最近自己玩一下springBoot配置 然后整合一下常用的框架 遇到一个问题 配置LifecycleBeanPostProcessorBean 的时候总是先于spring 读取ym
  • 力扣724.寻找数组的中心索引——python

    题目要求中心索引左右之和相等 没有的话我们返回 1 重复的返回最左边的 我们可以直接遍历所有 分别进行求和 满足条件我们返回值 否则 1 for i in range len nums if sum nums i sum nums i 1
  • Scanner类中next()与nextLine()的区别

    Scanner类 Scanner是Java5的新特性 我们可以通过Scanner类来从键盘获取用户输入的内容 下面是创建Scanner对象的语法 创建之前需要导入Scanner的包 import java util Scanner Scan
  • 文字的背景划过效果

    文章中的效果模仿的是 CodePen 网站中的效果 传送门 原理 给 h1 的前面添加一个 伪元素 设置他的收缩比例为 0 收缩中心在 右下角 right bottom 在鼠标移上时 设置 收缩中心在 左下角 left bottom 并设置
  • S8-codelab02

    import news cnn model import numpy as np import os import pandas as pd import pickle import shutil import tensorflow as
  • 如何将ajax传过来的数据转为,spring 接收前台ajax传来的参数的几个方法

    知识补充 JSON stringify 将value Object Array String Number 序列化为JSON字符串 JSON parse 将JSON数据解析为js原生值 toJSON 作为JSON stringify中第二个
  • java/php/net/python美容美发店会员管理系统

    本系统带文档lw万字以上 文末可领取本课题的JAVA源码参考 开发环境 开发语言 Java 框架 ssm 技术 JSP JDK版本 JDK1 8 服务器 tomcat7 数据库 mysql 5 7 一定要5 7版本 数据库工具 Navica
  • 【中大加机试之最后的挣扎之“循环移位”】

    题目描述 给出字符串A和B 判断A是否是B的进行循环移位得到的子串 如A ABC B BCDEFA 则是 输入输出格式 输入描述 多组输入 输入两个字符串A和B 输出描述 如果是循环移位子串输出yes 否则输出no 如 ABC BCDEFA
  • spyder python调试查看类信息_Python调试工具-Spyder

    OS Windows 7 关键字 Python IDE Spyder 1 安装工具pip https pip pypa io en latest installing html 运行cmd python get pip py 注 Pytho
  • 软件测试习题附答案

    转载 https blog csdn net qq 23994787 article details 73699212 单项选择题 共20小题 每小题1 分 满分20分 请将答案填入题后括号中 1 在软件生命周期的哪一个阶段 软件缺陷修复费
  • 对某个字段相同的值根据另一个字段排序(Oracle数据库)

    对某个字段相同的值根据另一个字段排序 Oracle数据库 SELECT a id a material code RANK OVER PARTITION BY a material code ORDER BY a id DESC RK FR
  • 华硕电脑光驱位换成固态硬盘

    因为要拆机 不太敢自己动手 找了专业的电脑维修人员给我换的 记录一下换的过程 一共20分钟 看起来也不是很难的样子 把光驱叉掉换成240G的固态硬盘 下次要学会自己换 科普一下 笔记本拆掉光驱换固态硬盘就必须要购买一个重要配件 叫光驱位硬盘
  • ARP协议工作原理

    ARP协议工作原理 每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表 以表示 IP 地址和 MAC 地址之间的对应关系 主机 网络接口 新加入网络时 也可能只是mac地址发生变化 接口重启等 会发送免费ARP报文把自己IP地址与
  • k8s学习笔记二(资源清单和控制)

    资源清单 资源类型 名称空间级别 工作负载型资源 workload Pod Replica Set Deployment Stateful Set Daemon Set Job CronJob Replication Controller在
  • Maven工程打jar包的N种方式

    Maven工程打jar包 一 IDEA自带打包插件 二 maven插件打包 2 1 制作瘦包 直接打包 不打包依赖包 2 2 制作瘦包和依赖包 相互分离 2 3 制作胖包 项目依赖包和项目打为一个包 2 4 制作胖包 transform部分