编写java后,一般都是通过打包生成jar、war包提供使用,一般在打包后都会在jar包中生成MANIFEST.MF文件

编写一个简单的java文件。

package cn.kanyun;public class Hello {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("Hello World");}}

然后使用命令进行打包:

#1.编译源文件
javac Hello.java
#2.打包
jar -cvf hello.jar Hello.class

此时在当前目录下生成了hello.jar文件。

我们运行一下这个jar文件试试看!

java -jar hello.jar

发现报错了.提示主清单没有相应属性。那么什么是主清单呢?

我们把hello.jar使用解压软件进行解压。

通过目录的层级关系,我们找到了MANIFEST.MF文件,这就是我们要找的主清单文件,我们使用文本编辑器打开它,看里面都有什么内容吧。

打开之后里面只有一行内容,那么就说明,刚才使用 jar -cvf hello.jar Hello.class 命令时。创建了 MANIFEST.MF文件,并向其中写入了 该行内容。

那么这个文件是否可以写入其他内容呢?答案是可以的。

以下使用eclipse进行打包!

我们使用eclipse打可运行的jar包!链接

然后打开它的MANIFEST.MF文件,并查看其中的内容

发现它的内容变化了,此时我直接使用 java -jar hello.jar 命令也可以运行了。

那么MANIFEST.MF文件中还有哪些内容呢?我是否可以自定义里面的内容呢?

答案是可以的:

首先我们自定义一个MANIFEST.MF 文件 ,并存放在META-INF文件夹下

此时打jar包的命令如下

#该命令表示用第一个文件当做MENIFEST.MF文件,hello.jar作为名称,将Hello.class打成jar包。其中多了一个参数m,表示要定义MANIFEST.MF文件
jar -cvfm hello.jar META-INF\MANIFEST.MF Hello.class

结果打包出错了

可以看到错误信息。自定义的MANIFEST.MF文件有问题。

重新编辑

再次打包,发现成功了!

那么为什么刚才打包不成功呢?因为刚才自定的MANIFEST.MF文件中key和value中间没有空格,所以打包失败了。这一点一定要注意!

然后我们解压打好的jar包看看里面MANIFEST.MF的内容是不是我们自定义的内容.。

发现比我们定义的内容多了两条,那么可以知道我们自定义清单文件是可以的。

目前看起来是完美的,但是实际情况上我们在实际工作中,并不会只写一个简单的类,然后打包,运行!通常要写很多的类,这个时候光是打包就很费劲了,所以通过会借助一些构建工具比如Maven、Gradle、Ant。

Maven的打包命令是

mvn clean package -Dmaven.test.skip=true

我们看一个最简单的maven打包的例子,pom.xml 什么配置都不加!

<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>cn.kanyun</groupId><artifactId>maven_test</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>maven_test</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies></dependencies>
</project>

打包完成后,我们查看一下生成的jar包中的MANIFEST.MF文件。

我们发现其实在使用maven打包的过程中maven也会夹带私货,比如文件中的Created-By 表示打包的maven版本等等。

那么maven打包是否可以在MANIFEST.MF中添加其他内容呢?当然是可以了,其主要是在pom.xml中进行配置。链接

上面的链接提到了使用Maven打包MANIFEST.MF中的其他内容,但是还是不能自定义,那么怎么才能自定义呢?

pom.xml

<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>cn.kanyun</groupId><artifactId>maven_test</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>maven_test</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><my.name>kanyun</my.name><my.age>30</my.age><my.sex>man</my.sex></properties><dependencies></dependencies><build><plugins><plugin><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><addDefaultImplementationEntries>true</addDefaultImplementationEntries><addDefaultSpecificationEntries>true</addDefaultSpecificationEntries></manifest><manifestEntries><Name>${my.name}</Name><Age>${my.age}</Age><Sex>${my.sex}</Sex></manifestEntries></archive></configuration></plugin></plugins></build></project>

运行打包命令,并解压打好的jar包查看其中的MANIFEST.MF文件。

发现自定义的内容出现在了清单文件中!

那么自定义MANIFEST.MF文件有什么用呢?

其实是有利于做模块化。通过读取Jar下的MANIFEST.MF文件可以知道这个jar包否是我们需要的jar包,以及可以读取到一些自定义的配置信息等!

读取Jar包下的MANIFEST.MF

 public static String readMainClassFromJarFile(final String jarFilePath) {try {JarFile jarFile = new JarFile(jarFilePath);Manifest mf = jarFile.getManifest();Attributes mainAttributes = mf.getMainAttributes();for (Map.Entry<Object, Object> entry : mainAttributes.entrySet()) {String key = entry.getKey().toString();String value = entry.getValue().toString();System.out.println("key: " + key + " value:" + value);}} catch (Exception e) {throw new IllegalStateException(String.format("Find Main-Class Exception %s", e.getMessage()));}return null;}

Maven打包自定义MANIFEST.MF键值对相关推荐

  1. linux的自定义input,linux键值到Android键值的转换与自定义

    首先要确定按键输入设备是对应/dev/input目录下哪个event,根据VID PID匹配对应的kl文件,可通过如下命令 cat /proc/bus/input/devices 查看设备信息 fra ...

  2. php二维数组按照自定义方式对键值排序,PHP 对一个给定的二维数组按照指定的键值进行排序...

    $v){ $keysvalue[$k] = $v[$keys]; } if($type == 'asc'){ asort($keysvalue); }else{ arsort($keysvalue); ...

  3. applet打包的MANIFEST.MF配置

    为什么80%的码农都做不了架构师?>>>    Permissions: all-permissions Codebase: * Manifest-Version: 1.0 Trus ...

  4. unordered_map使用自定义enum作为键值

    首先定义模板作为unordered_map的第三个参数: struct EnumClassHash {template <typename T>std::size_t operator() ...

  5. MANIFEST.MF属性读写

    本案例完整演示项目 https://download.csdn.net/download/cs4380/10835284 一.maven打包写入MANIFEST.MF属性 本案例采用maven写入,可 ...

  6. maven、gradle 设置MANIFEST.MF配置

    maven.gradle 设置MANIFEST.MF配置 一.说明 二.gradle 设置MANIFEST.MF 三.maven 设置MANIFEST.MF 一.说明 在使用maven.gradle对 ...

  7. java原生和SpringBoot读取jar包中MANIFEST.MF的方式

    我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...

  8. idea打包自定义包名称

    idea maven打包自定义jar包名称 只需要在标签中加入标签即可 <build><finalName>自定义包名</finalName><plugins ...

  9. R语言编写自定义函数自定义ggplot图像中的图例(legend)的位置、图例标题、键值、文本字体大小(title、text、key)、颜色标识的大小、点形状pch的大小

    R语言编写自定义函数自定义ggplot图像中的图例(legend)的位置.图例标题.键值.文本字体大小(title.text.key).颜色标识的大小.点形状pch的大小 目录

最新文章

  1. 面试离职理由_面试一个月都没有成功,是种什么样的神奇体验?
  2. 白话详细解读(六)----- BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation
  3. boost::container实现多态双端队列的测试程序
  4. 微服务之:从零搭建ocelot网关和consul集群
  5. OpenCV-CL: OpenCL加速计算机视觉技术
  6. 小程序 webview 分享_新的一周,分享15个好玩的小程序
  7. 怎样实现短信验证功能
  8. python中int占几个字节_小白学python第1问: int 占几个字节?
  9. 模拟电路——基本放大电路
  10. 详解:Java的重载方法与示例
  11. CMD窗口下强制删除文件
  12. 关于推荐算法未来的思考:推荐诗与远方
  13. 联想r480安全模式_thinkpad笔记本如何进入安全模式?
  14. 零基础如何学习JAVA编程开发
  15. 通达信macd接口指标
  16. 在外远程登录公司内网OA系统
  17. HDU杭电OJ经典100题2000-2099_Java版详细题解(持续更新)
  18. -2岁的产品经理学习日记2020/2/15
  19. cshop是什么开发语言_学会了 C 语言真的可以开发出很多东西吗?
  20. Systemtap学习笔记

热门文章

  1. 手机摄影-参数(光圈)
  2. ROS修改小乌龟程序背景颜色
  3. 库克放大招啦!一张照片生成3D头像,新模型击败StyleGAN2!
  4. PN learning
  5. Unbuntu环境编译 Android平台可用ffmpeg(带三方库fdk-aac和lame)
  6. 怎样学习有限元分析才能更快?
  7. 中药复方在治疗慢性盆腔炎上的应用
  8. 【爬虫+数据清洗+可视化分析】用Python分析哔哩哔哩“阳了“的评论数据
  9. 夜神模拟器与Android studio连接
  10. jpi多表联查_使用mybatis进行多表联查