解决运行jar包出错:ClassNotFoundException问题

目录
  • Java命令运行jar 报错
    • 方式二
  • jar包运行报错:Invalid or corrupt jarfile
    • MANIFEST.MF格式要求

Java命令运行jar 报错

运行jar命令

java -jar xxx.jar

报错:

Caused by: java.lang.ClassNotFoundException:

原因:要运行的jar缺少依赖包

执行jar正确命令:

java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopenapi/lib/snakeyaml.jar -jar xxx.jar

解释:

  • -Xbootclasspath:完全取代系统Java classpath.最好不用。
  • -Xbootclasspath/a: 在系统class加载后加载。一般用这个。
  • -Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了.
win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar
unix java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar

win32系统每个jar用分号隔开,unix系统下用冒号隔开

方式二

AppClassloader来加载

这样就不需要classpath参数了

我们在MANIFEST.MF中添加如下代码:

Class-Path: lib/some.jar

lib是和test.jar同目录的一个子目录,test.jar要引用的some.jar包就在这里面。

(这里我刚开始理解成了把lib文件夹也打包进test.jar中,实践后没有成功,实际情况是lib和test.jar,是同一个目录一个层次级别的)然后测试运行,一切正常!

如果有多个jar包需要引用的情况:

Class-Path: lib/some.jar lib/some2.jar

每个单独的jar用空格隔开就可以了。注意使用相对路径。

另:如果META-INF

下包含INDEX.LIST文件的话,可能会使Class-Path配置失效。INDEX.LIST是Jar打包工具打包时生成的索引文件,删除对运行不产生影响。

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行包含了一个空格。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java一些常见的出错异常处理方法总结

    一些平时常见的错误及解决办法,我 是新手,每次遇到的错误都记录了下来. 1. 404错误 description The requested resource (/Struts2_0100_Introduction/hello.action) is not available. 先检查Manager Deployments,使之能打开(出现NullPointerException不能打开),主要是服务器在每次允许前备份,再修改了错误后不能及时更正.(如果是勾选的Backup,要改成delete)

  • java.lang.NoClassDefFoundError错误解决办法

    java.lang.NoClassDefFoundError错误解决办法 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFoundError这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类明明还在,为什么找不到?而且我们很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实上这两个错误是完全不同的.我们往往花费时间去不断尝试一些其他的方法去解决这

  • 使用IDEA启动项目遇见ClassNotFoundException的解决方案

    一. 错误现象 本地开发 SpringBoot 项目的时候,在集成 MyBatis 查询数据库的时候,使用 IDEA 启动项目的时候,有时候会遇见如下的报错: Caused by: java.sql.SQLException: com.mysql.jdbc.Driver  at com.alibaba.druid.util.JdbcUtils.createDriver  ......  Caused by: java.lang.ClassNotFoundException: com.mysql.

  • 解决运行jar包出错:ClassNotFoundException问题

    目录 Java命令运行jar 报错 方式二 jar包运行报错:Invalid or corrupt jarfile MANIFEST.MF格式要求 Java命令运行jar 报错 运行jar命令 java -jar xxx.jar 报错: Caused by: java.lang.ClassNotFoundException: 原因:要运行的jar缺少依赖包 执行jar正确命令: java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopen

  • myeclipse导出可运行jar包简介

    该方式可以简单的导入第三方Jar包 1,右击项目,单击export=>java=>选第三个,Runnable Jar file (可执行的jar文件),Next. 2,选择launch configuration(程序入口配置),Exportdestination(导出目标) Library handing: 选择第一个 引用的jar包会整合到项目中去. 选择第二个 引用的jar包会单独放在项目根目录下(推荐). 选择第三个 引用的jar包会单独放在一个文件夹下,这个文件夹和导出的jar放在同

  • 解决运行django程序出错问题 'str'object has no attribute'_meta'

    如下所示: 报错原因是传入的是类对象,可你传进的参数是字符串,找到传参的位置改过来即可 补充知识:'dict' object has no attribute 'has_key' 解决办法 最近开始学习Python,安装上最新的Python3.6.5 在使用django的时候 出现如下错误 'dict' object has no attribute 'has_key' 保留犯罪现场: 犯罪现场2: 查阅资料发现,Python3以后删除了has_key()方法 解决办法: 修改代码 if dic

  • SpringBoot项目运行jar包启动的步骤流程解析

    SpringBoot项目在开发中,方便快捷,有一点原因就是SpringBoot项目可以打jar包运行:把jar包直接扔服务器上,然后运行jar包就能访问项目接口了.下面介绍SpringBoot项目打jar包运行的步骤流程: 一.我们所熟悉的是在开发环境下,直接用开发工具来运行那个启动类,然后就能启动这个项目: 开发环境下启动项目 二. SpringBoot项目打jar包方法: [1]在cmd界面中,进入项目的本地存储地址 cmd命令下进入项目地址 [2]运行maven的打包命令,mvn clea

  • 解决SpringBoot jar包中的文件读取问题实现

    前言 SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档.导出模版等),本地开发时可以正常读取 ,但是,当我们打成jar包发布到服务器后,再次执行程序时就会抛出找不到文件的异常. 背景 这个问题是在一次使用freemarker模版引擎导出word报告时发现的.大概说一下docx导出java实现思路:导出word的文档格式为docx,事先准备好一个排好版的docx文档作为模版,读取解析该模版,将其中的静态资源

  • 修改及反编译可运行Jar包实现过程详解

    将可运行Jar包,反编译成项目,修改代码,再次编译,打包. 需要工具:jd-gui.myeclipse 具体步骤: 1.使用jd-gui打开原始的Jar包,选择File-->Save All Sources,会生成一个zip压缩包 2.解压这个压缩包,生成一个文件夹,可以看到文件夹里所有的class文件变成了java源码文件.(如果最开始直接解压原始的Jar包,那么解压出来的就是class文件,而不是java源文件) 3.打开myeclipse,新建一个普通的Project项目,将解压后的内容拷

  • docker安装openjdk并运行jar包的操作方法

    下载镜像 docker pull openjdk 创建数据卷 创建一个java_app的数据卷 docker volume create java_app 将jar包上传到/var/lib/docker/volumes/java_app/_data/下,然后启动镜像 启动镜像 docker run --name=javaApp --restart=always --network=host \ -v java_app:/usr/src/myapp openjdk java -jar /usr/s

  • springboot 运行 jar 包读取外部配置文件的问题

    案例:本文主要描述linux系统执行jar包读取jar包同级目录的外部配置文件 方法一:相对路径设置配置文件 (1)在jar包同级目录创建配置文件conf.properties并写入配置数据: confData=data (2)开始写入自动化测试代码 //from www.fhadmin.cn public class Test{ public String getData() throws IOException { //读取配置文件 Properties properties = new P

  • IDEA生成可运行jar包(包含第三方jar包)流程详解

    最近现网需要处理一下数据,来适配一个场景.安排我来编写一个脚本来实现,由于步骤比较多,且需要调用其他服务接口,使用shell脚本来实现比较困难,所以想到了使用shell脚本调用java可执行jar包的方式来实现,期间遇到了很多问题,因此写篇文章记录一下. IDEA创建Java项目 打开IDEA,左上角菜单项依次选择File--->New--->Project--->Java--->Next--->Next--->输入项目名称(test). 新的java项目就创建好了(不

  • 解决外部jar包@Service无法注解无法扫描的问题

    目录 外部jar包@Service无法注解无法扫描问题 在确保spring配置无误的情况下 Service包中的组件无法被扫描到 一般遇到service无法被扫描到有这么几个问题 外部jar包@Service无法注解无法扫描问题 在确保spring配置无误的情况下 如: <context:component-scan base-package="your.can.pakeage"></context:component-scan> 检查待扫描的外部jar包,导出

随机推荐