IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> proguard混淆后出现java.lang.VerifyError: Bad return type错误 -> 正文阅读

[Java知识库]proguard混淆后出现java.lang.VerifyError: Bad return type错误

一、问题描述

用proguard混淆jar包之后,启动就报如下错误:

 Exception in thread "main" java.lang.VerifyError: Bad return type
Exception Details:
  Location:
    aaa/bbb/ccc/ddd/eee/e/c.openConnection(Ljava/net/URL;)Ljava/net/URLConnection; @80: areturn
  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/net/URLConnection' (from method signature)
  Current Frame:
    bci: @80
    flags: { }
    locals: { }
    stack: { 'java/lang/Object' }
  Bytecode:
    0x0000000: b200 20bb 0014 59b7 0029 1203 b600 2a2b
    0x0000010: b600 2eb6 002a b600 2cb6 0025 2a2b b700
    0x0000020: 314d 2ab4 001f 2bb6 002e b900 3502 0099
    0x0000030: 0020 2cc1 0016 9900 19bb 0008 592c c000
    0x0000040: 162a b400 1d2a b400 1eb7 0021 a700 042c
    0x0000050: b0                                     
  Stackmap Table:
    full_frame(@79,{Top,Top,Object[#24]},{})
    full_frame(@80,{},{Object[#18]})

	at aaa.bbb.ccc.ddd.eee.e.a.<init>(XxxxClassLoader.java:41)
	at aaa.bbb.ccc.ddd.eee.e.f.createClassLoader(XxxxxLauncher.java:32)
	at org.springframework.boot.loader.Launcher.createClassLoader(Launcher.java:64)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
	at aaa.bbb.ccc.ddd.eee.e.f.a(XxxxLauncher.java:27)
	at aaa.bbb.ccc.ddd.eee.e.f.main(XxxxLauncher.java:23)

这就很尴尬。。。在网上搜了下,java.lang.VerifyError: Bad return type这种错误引起的原因是:

JVM 在加载一个类时,会去校验类的正确性,只有类文件不合法才会报这个Error

找了一圈,没找到相关答案,基本上都是说是版本,jar包重复什么的引起的,问题是我这根本就不存在这两个问题。。在官方issues里搜到了一堆相关的问题,和我的错误都差不多

在这里插入图片描述

搞了一天无果,在晚上的时候找到了解决方法。。

二、解决方法

从错误日志中发现了问题,在如下行异常中:

at aaa.bbb.ccc.ddd.eee.e.a.<init>(XxxxClassLoader.java:41)

用Bytecode-Viewer打开混淆之后的jar,与没混淆的jar包,之间做了下对比,发现了其中的秘密:

aaa/bbb/ccc/ddd/eee/e/c.openConnection(Ljava/net/URL;)Ljava/net/URLConnection; @80:

在这里插入图片描述
对应了异常中的:

  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/net/URLConnection' (from method signature)

需要的是URLConnection,给的却是Object,所以导致了异常,这肯定是混淆引起的,调整proguard配置,以下是我这边调整后能用的:

      <!-- proguard混淆插件-->
      <plugin>
        <groupId>com.github.wvengen</groupId>
        <artifactId>proguard-maven-plugin</artifactId>
        <version>2.5.3</version>
        <executions>
          <execution>
            <!-- 打包的时候开始混淆-->
            <phase>package</phase>
            <goals>
              <goal>proguard</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <injar>${project.build.finalName}.jar</injar>
          <outjar>${project.build.finalName}.jar</outjar>
          <obfuscate>true</obfuscate>
          <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
          <options>
            <option>-target 1.8</option>
            <option>-dontnote</option>
            <option>-dontshrink</option>
            <option>-dontoptimize</option>
            <option>-adaptclassstrings</option>
            <option>-ignorewarnings</option>
            <option>-dontskipnonpubliclibraryclasses</option>
            <option>-dontskipnonpubliclibraryclassmembers</option>
            <option>-dontusemixedcaseclassnames</option>
            <option>-keepdirectories</option>
            <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
            <option>-keepclassmembers enum * { *; }</option>
            <option>-keepparameternames</option>
            <option>-flattenpackagehierarchy aaa.fffff.xxxx.ddd.aaa</option>
            <option>
              -keepclassmembers class *{
                public static void main(java.lang.String[]);
              }
            </option>
          </options>
          <libs>
            <!-- 添加依赖 java8-->
            <lib>${java.home}/lib/rt.jar</lib>
            <lib>${java.home}/lib/jce.jar</lib>
          </libs>
        </configuration>
      </plugin>

用上面的配置打包完成的jar包字节码如下:

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:14:49  更:2022-02-28 15:19:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:01:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码