关于 jar包中MANIFEST.MF 写法

2023-11-05

 

例如我们打包的jar为 Test.jar

Manifest-Version: 1.0
Main-Class: windows.VideoWindow
Class-Path: lib\org.eclipse.swt_3.3.0.v3346.jar lib\org.eclipse.swt.win32.win32.x86_3.3.0.v3346.jar

上面为打包为jar中的包说明文件. 下面这个报错一直出现.
could not find main class. Program will exit
这个错误提示其实不是没有发现main class. 而是jar如果有错误执行不了,就会出现这个错误. 打包完成后, 要先运行 cmd -> java -jar your.jar 确认没有问题即可执行jar. 使用-jar参数后, 系统的Classpath 变量不再起作用. 虚拟机将去MANIFEST.MF中的Class-Path 下找相关的包.
然后才能成功的从: windows.VideoWindow 的main方法进入. 否则没有相关连接包,则会提示找不到main class. 而大家可能还迷糊的找不到北. 明明有main class吗.

如果这个写的不对. 则就会一直报错.
看看上面这个Class-Path: 后面的写法. 空格分开. 绝对不能有分号.切记.

最后必须有换行. 这个也是要注意的. 否则依然提示没有mainclass.

不要因为这个小事情耽误了时间. 其中 lib/ 表示这个jar必须在打包Test.jar所在目录的一个lib子目录中.

运行jar需要命令: java -jar Test.jar
双击也可以, 则使用 javaw 打开.

关于java -classpath a.jar;b.jar; class test.Test 执行时. a.jar;b.jar; 后面都必须有分号. 否则报错. 不要指望不写classpath让系统自己找. 这不是在eclipse里面.必须写上你要使用的类. 否则总会提示您编译出错.

2、MANIFEST.MF 文件中奇怪的分行和空格要求

工作中发现的一个非常奇怪也很有趣事情,有关MANIFEST.MF文件中的分行和空格的格式要求,分享给大家。

    对于通常的MANIFEST.MF文件,一般格式是:

Class-Path: lib/a.jar lib/b.jar lib/c.jar lib/d.jar lib/e.jar lib/f.jar
    在一行之内将所有的jar包路径写上,空格分隔即可。

    但是对于一些大型的项目,因为依赖包众多,比如大于30个,那么如果还写在一行内,就会出现一个长度惊人的行。程序运行倒不会有任何问题,但是对于版本控制就很不友好,如增加或者减少一个依赖包,这行就会被改写。以后compare不同版本时,只能知道这行被修改了确无法直接知道是做了什么修改,必须通过其他方式才能对比出来。

    同样的问题发生在code merge时,如果两个分支都修改了这个文件,就必须通过手工来进行merge,而且要对照出来彼此到底改了什么,很困难而且容易出错。

    因此一个改进就是将这个文件中的依赖按照一行一个依赖的方式重写,这样以后修改时只会修改改依赖所在的行,很容易就对比出来具体做了哪些感动,code merge时版本控制软件一般也很容易直接自动merge成功。

    修改后的文件类似如下:

Class-Path: lib/a.jar
    lib/b.jar
    lib/c.jar
    lib/d.jar
    lib/e.jar
    lib/f.jar

    但是在实际操作时发生了意料之外的问题,会出现异常或者类无法找到,经检查发现问题出现在MANIFEST.MF的格式上,MANIFEST.MF对于分行和空格是有特殊要求的:

1. 每行的最后一个jar的名称后不容许有空格
    即"    lib/b.jar"在b.jar后必须回车结束本行,不能有空格,一个都不能

2. 每行的开头必须有不少于2个空格
    即"    lib/b.jar"在b.jar前必须有不下两个空格

3.最后一行要回车换行,但不能有空格

    以上三个条件有一个不满足都会出现问题,有点古怪。

4、严格的MANIFEST.MF格式
今天才发现这个文件的格式要求比较严格,因为使用的包比较多,所以那个Class-path的内容就比较多,我全部放在了一行,结果服务器启动读取那个文件的时候报错,错误信息是行太长,把它们切成多行,结果又是无效的头字段(java.io.IOException: invalid header field),和工程里面的其它文件比较了下,发现换行后要在前面加一个空格,后来又发现明明包含了一个包,但是找不到类,又在每行的后面加了一个空格,这下才完全搞定。

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

关于 jar包中MANIFEST.MF 写法 的相关文章

随机推荐

  • win11安装gcc,g++,配置c++的编译环境

    MinGW Minimalist GNU for Windows download SourceForge net 下载并安装MinGW 可以直接鼠标点击操作 简单的很 选定gcc g 为待安装环境 然后开始安装就可以了 环境变量 右键计算
  • Java笔记-I/O流之比较器接口对象数组排序

    对象数组排序 内容介绍 1 对象数组直接调用sort 方法报错的原因 是因为没有定义比较的规则 需要自己定义 2 如何定义规则 看报错信息 ClassCastException demoCompare Person cannot be ca
  • 算法复杂度

    时间复杂度和空间复杂度 N 1个操作 O n O n O n O n N 2 1个操作 1 2 O n O n 2个单位的内存空间 O 1 常数的时间复杂度 两层循环O n 2 归并排序 T n 2 T n 2 n O n log n Ma
  • 10讲学会C语言之第四讲:循环结构

    文章目录 前言 一 求pi的近似值 二 统计整数的位数 三 判断素数 四 求阶乘和 五 循环结构编程 六 作业 前言 大家好 我是卷卷 本节课讲循环结构 for while和do while 主要包括六个部分 求pi的近似值 统计整数的位数
  • 1658 页的《Java 面试突击核心讲》在牛客网火了,完整版 PDF 开放下载!

    前言 我们都知道 在程序员的职业生涯中 有多个发展方向 不过就数据表明 近年来选择架构师方向的开发人员也越来越多 对于架构师的发展前途 我相信是已经没有争议的 但这个 概念 对于很多开发人员来说 并没有太清晰的认识 怎样才能成为架构师 是很
  • IDEA安装使用 VisualVM 及VisualVM 远程监视

    1 VisualVM是什么 按照VisualVM官网 http visualvm github io 上的介绍 VisualVM是一个集成命令行JDK工具和轻量级分析功能的可视化工具 专为开发和生产时间使用而设计 我们在jdk安装包中也可以
  • nmon的安装与使用

    author skate time 2011 08 06 nmon的安装与使用 1 下载 nmon http nmon sourceforge net pmwiki php n Site Download nmonanalyser http
  • Spring之循环依赖底层源码解析

    目录 一 循环依赖 二 解决循环依赖的思路 1 举例 AServiec依赖BService BService依赖AService 2 循环依赖的打破 三 三级缓存解析 1 三级缓存的通常叫法 2 三级缓存详情 一 循环依赖 1 循环依赖 很
  • ArcGIS Server 10.1 装配记录

    ArcGIS Server 10 1 安装记录 拿到了ArcGIS Server 10 1 的安装包 今天有时间上手安装试着用一下 记录过程如下 1 基础环境 在虚拟机下安装的 使用的是win2008 Server r2sp1系统 由于10
  • Verilog实现无源蜂鸣器发声

    要求 顺序循环发声 Do Re Mi Fa 时间间隔为0 5s 若输入为262Hz的方波 则蜂鸣器发Do的声音 以此类推 那如何向蜂鸣器输入262Hz的方波 假设系统时钟周期为50MHz 50MHz对应的一个周期为20ns 若占空比为50
  • CSS高级技巧

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 CSS高级技巧 元素的显示与隐藏 类似网站广告 当我们点击关闭就不见了 但是我们重
  • 区块链平台架构分析

    区块链平台架构分析 数据层 网络层 账本层 共识层 合约层 应用层 一般说来 一个标准的区块链项目应该由数据层 网络层 共识层 激励层 合约层和应用层组成 每一层的具体介绍如下 数据层 数据层是区块链最底层的技术 主要的功能为数据存储 账户
  • C语言文件操作总结

    目录 字符方式读入文件 数据块方式读写文件 文件定位与随机读写 文件中数据的修改 字符方式读入文件 1 向文件中写入 输入字符 用 fputc 函数或 puts 函数可以把一个字符写到磁盘文件中去 int fputc int ch FILE
  • ------chrome游览器解决跨域问题

    在chrome游览器中为了安全性 是不正常跨域的 找到chrome的快捷方式 右键打开属性 快捷方式 找到目标 目标输入框里面有地址 在地址后面输入 user data dir C Mychromeuserdata user data di
  • Linux基础命令-ps查看进程状态

    Linux基础命令 sort内容排序 Linux基础命令 chattr更改文件隐藏属性 文章目录 前言 一 命令的介绍 二 语法及参数 2 1 通过help和man查看命令的语法 2 2 命令参数 2 3 常用参数 三 参数使用与内容含义
  • c++ opencv4.5.5 实现硬币计数

    效果图 实现思路 先将图像进行灰度化再进行二值化处理 消除噪声 膨胀使物体变大消除硬币内部噪声 开操作消除部分高亮区域 据距离变换的性质 经过简单的运算 即可用于细化字符的轮廓和查找物体质心 中心 轮廓查找 代码 include
  • 保护大模型应用安全,现在不需要拿性能做代价了

    编者按 大模型的爆火 也对隐私和安全发起了挑战 1 可信执行环境是什么 大语言模型为什么需要它 OpenAI 的 GPT 系列大语言模型 Large Language Mode 以下缩写为 LLM 的兴起与应用 也带来了诸如数据泄露 数据滥
  • 数据分析之运营篇

    文章目录 1 指标体系定目标 1 1根据运营的目的 选取不同的指标类型 1 2 北极星指标 1 3 用户留存指标 2 数据分析找问题 2 1 描述分析 2 2多维分析 2 3 相关性分析 2 4 方差分析 2 5 样本检验 2 6 预测分析
  • 基于QNX的Testbed单元测试环境配置过程

    锋影 e mail 174176320 qq com 1 本机安装QNX系统 A安装VMware Workstation v exe B在VMware打开QNX虚拟机 vmware Qnx Other vmx 2 打开Virtual Box
  • 关于 jar包中MANIFEST.MF 写法

    例如我们打包的jar为 Test jar Manifest Version 1 0 Main Class windows VideoWindow Class Path lib org eclipse swt 3 3 0 v3346 jar