maven插件maven-jar-plugin构建jar文件详细使用

文章目录

  • 前言
  • 一、使用方式
  • 二、常用配置详解
    • 1.classesDirectory
    • 2.outputDirectory
    • 3.excludes
    • 4.includes
    • 5.archive
      • 添加Implementation和Specification属性
      • 添加manifestEntries
      • 添加键值对属性Manifest Sections
      • 自定义manifest配置
        • 设置一个可执行的jar文件
        • 精确设置Classpath
        • 根据目录设置classpath
        • 配置classpath的加载样式
        • 强制使用SNAPSHOT版本的依赖
      • 加载外部的manifest文件
  • 总结


前言

maven-jar-plugin插件时maven中最常用的插件,也是maven构建Java程序执行包或者依赖包的默认插件,大部分情况下我们不需要对其进行配置,但在特殊情况下,我们可以通过配置来定制我们的jar包。


一、使用方式

大部分情况下,我们的配置如下:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version>
</plugin>

而且这里的版本号是可选的,如果不配置版本号,maven会自动去寻找最新的版本。

二、常用配置详解

1.classesDirectory

这个表示class文件的目录,默认值是:${project.build.outputDirectory}也就是target目录下的class目录,当然我们也可以指定其他目录。

2.outputDirectory

表示jar文件的输出目录,默认值是:${project.build.directory},就是target目录,生成的jar文件就输出到这里。

3.excludes

表示jar文件打包时,需要排除哪些文件,比如我们在开发时有个dev.properties文件,打包时我们就不需要了,可以这样配置:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version><configuration><excludes><exclude>conf/**</exclude><exclude>bin/**</exclude><exclude>cache/**</exclude><exclude>attachment/**</exclude><exclude>dev.properties</exclude></excludes></configuration>
</plugin>

这里我们排除了部分文件夹和开发时用到的文件,在打包时不加入到jar文件中。

4.includes

这个与excludes相反,就是把需要的文件在打包时加入到jar文件中,具体配置可以参照excludes的配置。

5.archive

这个属性配置很多,主要是用于定制化我们的jar包结构以及对Manifest文件的定制化。下面我们用几个实例来演示。

添加Implementation和Specification属性

默认情况下面Manifest文件结构如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}

我们可配置下面属性:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version><configuration><archive><manifest><addDefaultImplementationEntries>true</addDefaultImplementationEntries><addDefaultSpecificationEntries>true</addDefaultSpecificationEntries></manifest></archive></configuration>
</plugin>

这样生成的Manifest如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Specification-Title: ${project.name}
Specification-Version: ${project.artifact.selectedVersion.majorVersion}.${project.artifact.selectedVersion.minorVersion}
Specification-Vendor: ${project.organization.name}
Implementation-Title: ${project.name}
Implementation-Version: ${project.version}
Implementation-Vendor: ${project.organization.name}

添加manifestEntries

这个属性可以添加一下项目信息到jar文件中。常用配置如下:

<configuration><archive><manifestEntries><mode>prod</mode><url>${project.url}</url></manifestEntries></archive>
</configuration>

生成的Manifest如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
mode: prod
url: http://project.url.com

添加键值对属性Manifest Sections

这个功能可以添加多个键值属性,配置如下:

<archive><manifestSections><manifestSection><name>value1</name><manifestEntries><id>key1</id></manifestEntries></manifestSection><manifestSection><name>value2</name><manifestEntries><id>key2</id></manifestEntries></manifestSection></manifestSections>
</archive>

结果如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}Name: value1
id: key1Name: value2
id: key2

自定义manifest配置

可以根据下面的配置来定制化manifest文件的加载机制:

设置一个可执行的jar文件

我们可以发布一个可执行的jar文件,就是可以通过命令行来启动一个jar。也可以把一个jar文件当做依赖库,提供给其他项目来使用。如果要发布一个可执行的jar,配置如下:

<configuration><archive><manifest><mainClass>com.test.Main</mainClass></manifest></archive>
</configuration>

这里com.test.Main必须要有一个main方法

精确设置Classpath

就是将所有的jar文件全部枚举出来,配置如下:

<project><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addClasspath>true</addClasspath></manifest></archive></configuration></plugin></plugins></build><dependencies><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency></dependencies>
</project>

Manifest生成结果如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Class-Path: commons-io-2.11.0.jar commons-lang-2.1.jar

注意这样运行这个jar文件时,需要保证Class-Path的依赖jar在目录中保持平级。

根据目录设置classpath

这里需要用到属性classpathPrefix,配置如下:

<configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest></archive>
</configuration>

Manifest生成结果如下:

Class-Path: lib/commons-io-2.11.0.jar lib/commons-lang-2.1.jar

注意这样运行这个jar文件时,需要保证lib目录和执行jar保持平级。

配置classpath的加载样式

加载样式意思是可以通过特定的配置来配置classpath的路径,配置属性是:classpathLayoutType

自定义加载样式classpathLayoutType=custom

配置如下:

<configuration><archive><manifest><addClasspath>true</addClasspath><classpathLayoutType>custom</classpathLayoutType><customClasspathLayout>lib/$${artifact.groupIdPath}/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout></manifest></archive>
</configuration>

接入如下:

Class-Path: lib/commons-io/commons-io-2.11.0.jar lib/commons-lang/commons-lang-2.1.jar

maven风格加载样式classpathLayoutType=repository

我们也可以设置maven风格的加载样式,如果目标机器上有maven库,我们可以这样设置:

<configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>${user.home}/.m2/repository</classpathPrefix><classpathLayoutType>repository</classpathLayoutType></manifest></archive>
</configuration>

结果如下:

Class-Path: ${user.home}/.m2/repository/commons-io/commons-io-2.11.0.jar ${user.home}/.m2/repository/commons-lang/commons-lang/2.1/commons-lang-2.1.jar

这里的${user.home}会替换成你电脑上的绝对路径

强制使用SNAPSHOT版本的依赖

有时我们依赖的jar包可能是SNAPSHOT版本的,默认情况SNAPSHOT版本的库文件是不会被加载的,这里可以使用useUniqueVersions来启用,配置如下:

<configuration><archive><manifest><useUniqueVersions>false</useUniqueVersions></manifest></archive>
</configuration>

这样SNAPSHOT版本的jar依赖也会被加载。

加载外部的manifest文件

我们也可以将manifest编写好,然后直接使用我们自己编写的文件,配置如下:

<configuration><archive><manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile></archive>
</configuration>

这里就直接加载我们自己编写的MANIFEST文件。


总结

与maven-jar-plugin相同的还有一个maven-war-plugin插件,用于将我们的程序打包成war格式的执行包,也是maven默认的打包工具。这个主要用于web项目。它的用法和maven-jar-plugin完全一样,大家可以参照上面的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法

参考网上大部分方法错误&#xff0c;根本不起作用。正确方法是 C:\Users\你的用户名\AppData\Roaming\NuGet找到NuGet.Config打开&#xff0c;看到类似下面信息&#xff08;可能不一样&#xff09; <?xml version"1.0" encoding"utf-8"?> <co…

FXTM富拓监管变更!2024开年连续3家交易商注销牌照

交易商的监管信息是经常发生变更的&#xff0c;即使第一次投资时查询平台监管牌照&#xff0c;投资者仍需持续关注其监管动态。千万不要以为第一步审核好后就万事大吉了&#xff01; 2024年开年&#xff0c;就有3家交易商的重要信息发生变更&#xff0c;注销其金融监管牌照&…

专业课147总420+福州大学866信号与系统考研经验福大电子信息技术信息与通信

我本人一战双非上岸福大&#xff0c;初试分数420&#xff0c;期中专业课866信号与系统147&#xff08;有点遗憾没有达到信息通信考研Jenny老师辅导班要求的满分&#xff09;。这里想分享一些自己准备初试的过程和一些学习方法&#xff0c;希望能给各位准备报考福州大学866的学弟…

HiveSQL——借助聚合函数与case when行转列

一、条件函数 if 条件函数 if函数是最常用到的条件函数&#xff0c;其写法是if(xn,a,b), xn代表判断条件&#xff0c;如果xn时&#xff0c;那么结果返回a ,否则返回b。 selectif(age < 25 or age is null, 25岁以下, 25岁以上) as age_cnt,count(1) as number from table…

WifiConfigStore初始化读取-Android13

WifiConfigStore初始化读取 1、StoreData创建并注册2、WifiConfigStore读取2.1 文件读取流程2.2 时序图2.3 日志 1、StoreData创建并注册 packages/modules/Wifi/service/java/com/android/server/wifi/WifiConfigManager.java mWifiConfigStore.registerStoreData(mNetworkL…

读千脑智能笔记07_人工智能的未来(中)

1. 机器智能的未来 1.1. 没有任何技术原因阻止我们创造智能机器 1.1.1. 障碍在于我们缺乏对智能的理解&#xff0c;也不知道产生智能所需的机制 1.2. 历史表明&#xff0c;我们无法预测将推动机器智能向前发展的技术进步 1.2.1. …

Android 11 webview webrtc无法使用问题

问题&#xff1a;Android 11 webview 调用webrtc无法使用, 看logcat日志会报如下错误 [ERROR:address_tracker_linux.cc(245)] Could not send NETLINK request: Permission denied (13) 查了下相关的网络权限都有配置了还是不行&#xff0c;还是报这个权限问题 原因&#xff1…

pytorch训练指标记录之tensoboard,wandb

详解Tensorboard及使用教程_tensorboard怎么用-CSDN博客文章浏览阅读5.1w次&#xff0c;点赞109次&#xff0c;收藏456次。目录一、什么是Tensorboard二、配置Tensorboard环境要求安装三、Tensorboard的使用使用各种add方法记录数据单条曲线(scalar)多条曲线(scalars)直方图(hi…

使用frp时遇到的问题connect: connection refuseddial tcp xxxx:7000: connect: connection refused

最近在做的项目需要用到frp来做代理连接本地内网机&#xff0c;卡在最后启动客户端的时候&#xff0c;提示报错&#xff1a;login to server failed: dial tcp xxxx:7000: connect: connection refuseddial tcp xxxx:7000: connect: connection refused&#xff01;&#xff01…

功能强大的国外商业PHP在线教育系统LMS源码,直播课程系统

源码介绍 Proacademy是在线教育一体化的解决方案&#xff0c;用于创建类似于Udemy、Skillshare、Coursera这种在线教育市场。 这个平台提供在线课程&#xff0c;现场课程&#xff0c;测验等等&#xff0c;并有一个基于实际业务需要的高级认证插件&#xff0c;程序基于Laravel…

BeginCTF2024 RE 部分复现

8. arc 上面一托混淆&#xff0c;左边似乎是三个东西相乘 单独取出最左边一托打印&#xff0c;可以得到大数组 接下来要解密&#xff0c;原代码非常混乱&#xff0c;我们先整理一下&#xff0c;简单去混淆 print (all([[data][a][d] e for a, b in enumerate([[int(a) for a …

MOS管防反接电路设计

电子元件大都是使用直流工作&#xff0c;电源线反接就有可能就会烧坏&#xff0c;那电路如何防反接&#xff1f;首当其冲我们想到的就是二极管了&#xff0c;运用其单向导通特性可有效防止电源反接而损坏电路&#xff0c;但是随之而来的问题是二极管存在PN节电压&#xff0c;通…

PyTorch 2.2大更新!集成FlashAttention-2,性能提升2倍

【新智元导读】新的一年&#xff0c;PyTorch也迎来了重大更新&#xff0c;PyTorch 2.2集成了FlashAttention-2和AOTInductor等新特性&#xff0c;计算性能翻倍。 新的一年&#xff0c;PyTorch也迎来了重大更新&#xff01; 继去年十月份的PyTorch大会发布了2.1版本之后&#…

如何获取和查找您的Android设备的序列号

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;&#xff0c;我们经常会在文章中提及到各种各样的Android设备&#xff0c;而其中一个重要的标识就是设备的序列号。设备的序列号在很多情况下被用于唯一标识一个设备&#xff0c;例如在软件开发中进行设备的调试和测试&#xf…

Redis篇之分布式锁

一、为什么要使用分布式锁 1.抢劵场景 &#xff08;1&#xff09;代码及流程图 &#xff08;2&#xff09;抢劵执行的正常流程 就是正好线程1执行完整个操作&#xff0c;线程2再执行。 &#xff08;3&#xff09;抢劵执行的非正常流程 因为线程是交替进行的&#xff0c;所以有…

C 语言学习七:指针

指针 指针与地址指针的声明和初始化指针的解引用指针的比较指针和数组指针数组指针和动态内存分配 指针与函数参数指针作为函数参数二级指针 指向函数的指针 指针与地址 指针的声明和初始化 int variable 42; int *ptr &variable; //间接访问 int value *ptr; // valu…

锐捷设备常用命令

一、命令模式 命令行主要有用户模式、特权模式、全局模式、VLAN模式、接口模式、线程模式 switch> "用户模式"switch# "特权模式"switch(config) "全局模式"switch(conf…

C# 实现微信自定义分享

目录 需求与调整 代码实现 获取令牌 生成合法票据 获取有效签名 客户端准备 客户端实现 小结 需求与调整 在微信中打开网页应用后&#xff0c;可以选择将地址发送给朋友进行分享&#xff0c;如下图&#xff1a; 在实际的应用中&#xff0c;我们可能不是简单的将该网页…

freertos 源码分析六 任务调度二

任务调度由SysTick_Handler和 PendSV_Handler两个中断接管 系统时钟计数器按给定频率倒计时&#xff0c;至0触发SysTick_Handler中断&#xff0c;此中断函数为宏中对xPortSysTickHandler的重命名。 增加计数&#xff0c;置位可挂起中断。 void xPortSysTickHandler( void ) {p…

通过dockerfile 生成自定义nginx镜像

通过dockerfile生成自定义nginx镜像 &#xff01;&#xff01;&#xff01;docker 必须在linux环境下才能进行如果你是window则需要装虚拟机 新建一个文件名字为Dockerfile&#xff0c;无需后缀 文件完整名就是Dockerfile 编写dockerfile FROM nginx RUN echo hello nginx!…