验证Jar内的Java类

时间:2012-07-17 22:53:03

标签: java jar jvm .class-file

jars中的Java类文件可以轻松替换和修改。例如,以下命令可用于替换jar中的已编译类文件:

jar uf JarFile.jar com\something\Class.class

如果类文件被替换为没有依赖项的文件,那么代码仍然可以执行。对于不在jar中的类文件也会发生同样的情况。

有没有办法验证一组类文件(无论是否在jar中),看看它们的所有依赖项是否存在且没有被破坏?

我不想阻止类文件被修改,而是能够验证更改是否有效(关于依赖项)。编译器在编译时执行此检查(依赖项检查),但是一旦编译了类,如何自己验证类文件?

3 个答案:

答案 0 :(得分:0)

您可能会考虑sealingsigning JAR。

更新:

显然,我的第一次猜测错过了这个标记。

如果不是,你打算做什么?如果他们是第三方,我会说你除了向bug数据库报告下载不好之外别无选择。

如果您的意思是“我想确保他们所有的第三方JAR依赖关系都是正确的”,那么您会遇到更大的问题。我所知道的大多数下载(例如Spring)都使用Maven来实现依赖性。这是你能做的最好的事情。

如果您的意思是要检查自己的依赖关系,我会说测试会显示您所犯的任何错误。

答案 1 :(得分:-1)

不,你不能。

至少:不是真的。 问题是java只在需要时才在运行时加载类。所以最终从jar文件中删除一个类可能是正常的,只要没有引用该类的代码被执行,事情就会非常顺利地运行。

考虑这个例子:

class A{ public static void main( String args[] ){ out.println( "hello" ); } }
class B{}

编译它,把它放在一个jar中,从中删除B.class,没有问题:)

现在您可能认为可以浏览每个.class文件,检查它引用的类,并查看文件是否全部存在。这不仅是痛苦的,也是不完整的。你永远不会完全捕获加载了反射的文件,因为它们的类名可能只是在运行时构造的。

我的建议:不要去那里。如果有人删除了一个类文件,那就是他们自己的错。 你可以做的最好的事情是(但只有这真的让你很担心)尝试在运行时捕获ClassNotFoundException(查看thread.setUncaughtExceptionHandler)

答案 2 :(得分:-1)

只需加载课程即可确保。