jar包运行报错:Invalid or corrupt jarfile

执行:

java -jar xxx.jar

运行一个jar包时,提示报错:

Invalid or corrupt jarfile

 

该jar之前一直是正常运行的,这次只是增加了一项图片处理功能,引入了opencv-2413.jar。除了class文件的变化之外,唯一的修改就是MANIFEST.MF文件了。分析来看,问题很可能就出在这个文件上,将该文件还原,果然,jar至少能启动了。

 

不就是MANIFEST.MF文件中类路径新添加了一个opencv吗,为什么会这样呢?

MANIFEST.MF是一个非常脆弱的文件,格式要求比较严格,一个空格、一个回车符,都可能会导致该文件失效,从而使得对应的jar包非法:Invalid or corrupt jarfile!

 

MANIFEST.MF格式要求:

1. 文件中的内容以key-value键值对的形式出现,key和value之间采用"英文冒号+空格"进行分隔,注意:冒号后的空格必须有;key必须顶格写,之前不能有空格。

2. 文件开头不能有空行,并且文件总是以Manifest-Version属性开头。

3. 文件必须以一个空行结束,注意:该空行不能有任何字符,包括空格。

4. 每行最长72个字符,如果超过的话,采用续行,换行继续必须以空格开头。

5. 对于Class-Path属性中的存在的路径,使用"/"分隔目录,与平台无关;多个jar包引用以空格分开。

 

针对MANIFEST.MF文件每行不能超过72个字符的说法,还有疑问。因为我的MANIFEST.MF文件中,Class-Path属性的很多行都是超过72个字符的,实际上并没有引起异常。

 

我的jar包之所以报错,就是违背了以上的第3条,文件虽然以空行结束,但该空行隐藏了一个空格,也就是上图中的第14行包含了一个空格。

### 关于 'Error: Invalid or corrupt jarfile MultiplotStudio.jar' 的解决方案 当遇到 `Error: Invalid or corrupt jarfile` 错误时,通常表明目标 `.jar` 文件存在问题。以下是可能的原因以及对应的解决方法: #### 1. **检查文件完整性** 如果下载的 `MultiplotStudio.jar` 文件不完整或者损坏,则可能导致此错误。可以通过重新获取该文件来验证其完整性。 - 使用校验工具(如 MD5 或 SHA-256 校验码)对比原始文件与当前文件的一致性[^1]。 - 若发现文件已损坏或缺失部分数据,请尝试从可信源再次下载。 #### 2. **确认文件来源** 来自不可靠渠道的 `.jar` 文件可能存在篡改风险,甚至被恶意修改。建议仅使用官方发布的版本[^3]。 #### 3. **检查 MANIFEST.MF 配置** `.jar` 文件中的 `META-INF/MANIFEST.MF` 是定义入口类的关键文件。如果其中的内容格式有误(例如所有条目写在同一行),则会引发加载失败[^4]。 ```bash unzip -p MultiplotStudio.jar META-INF/MANIFEST.MF | cat ``` 上述命令用于查看 `MANIFEST.MF` 文件内容。正常情况下,每项属性应单独成行,形如: ``` Main-Class: com.example.MainClass Class-Path: lib/dependency1.jar lib/dependency2.jar ``` 如发现问题可手动修正后再打为新的 `.jar` 文件。 #### 4. **验证 Java 环境兼容性** 运行环境的 JDK 版本需匹配编译时使用的版本。较低版本的 JVM 可能无法解析高版本生成的字节码[^2]。 - 查看 `.class` 文件的目标版本号: ```bash javap -v MultiplotStudio.jar | grep major ``` - 对照结果调整本地安装的 JRE/JDK 至适当水平。 #### 5. **重构建项目** 当怀疑原版 `.jar` 存在内在缺陷时,可以考虑通过源代码自行重建工程。具体操作如下: - 导入项目的全部资源到 IDE 中; - 执行 Maven 或 Gradle 构建流程; - 输出全新的 `.jar` 文档供测试用途。 --- ```python import subprocess def check_jar_integrity(jar_path): try: result = subprocess.run(['java', '-jar', jar_path], capture_output=True, text=True) if "Invalid or corrupt jarfile" in result.stderr: print(f"The file {jar_path} is corrupted.") else: print("The .jar file appears to be valid.") except FileNotFoundError as e: print(e) check_jar_integrity('path/to/MultiplotStudio.jar') ``` 上述脚本能帮助初步判断指定路径下的 `.jar` 是否可用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值