java查找jar中具有给定serialVersionUID的类
当我得到一个java。木卫一。InvalidClassException,它给我它想要的SerialVersionId,以及它得到的SerialVersionId。有没有一种简单的方法来判断我的几十个罐子中哪些使用了错误的serialVersionUID
更新:我应该提到,我们的目的是同时更新所有内容,但我正在尝试调试构建和部署过程中的一个问题
你可以在下面搜索框中键入要查询的问题!
当我得到一个java。木卫一。InvalidClassException,它给我它想要的SerialVersionId,以及它得到的SerialVersionId。有没有一种简单的方法来判断我的几十个罐子中哪些使用了错误的serialVersionUID
更新:我应该提到,我们的目的是同时更新所有内容,但我正在尝试调试构建和部署过程中的一个问题
# 1 楼答案
请记住,不同的JVM/容器/类加载器组合对应该从bootclasspath加载哪些类与从应用程序/webapp类路径加载哪些类有不同的看法
serialver总是首先从bootclasspath加载,这使得情况变得复杂,因此您可能需要使用-J-Xbootclasspath,如下所示,以模拟不同的行为:
另一种方法是使用javap,例如:
# 2 楼答案
处理此类问题的最佳方法是同时更新服务器端和客户端上的JAR。这将保证两侧的类版本相同,并且在序列化/反序列化时不会出现问题。每次出现此问题时跟踪串行UID并不能解决任何问题,只会浪费大量的时间和资源。最好花点时间实施适当的部署/打包策略
如果您真的没有其他选择,您可以编写一个工具,从每个jar加载一个类(使用URLClassLoader),然后使用
java.io.ObjectStreamClass.getSerialVersionUID()
获得所需的信息# 3 楼答案
基于SO中的一些答案,我提出了一个实用程序来执行此操作。这是我的课
# 4 楼答案
笨拙但有效
我会使用逆向工程工具
1) 打开罐子的拉链
2) 例如,在类文件树上运行jad
3) 在这个新的源代码树上运行grep或任何其他查找工具来查找串行版本uid
# 5 楼答案
对jar中的每个类使用sunjdk中的serialver工具
# 6 楼答案
我在Linux上使用此命令检查当前目录中的所有JAR:
请记住,serialVersionUID可能不会在类中显式声明。在这种情况下,serialVersionUID将在运行时计算,无法使用上面的find命令进行搜索