使用Jbuilder引用外部jar包制作的jar文件,运行时的问题

时间:2021-02-15 09:16:44

我做了一个项目,从外部应用了不少jar包,用Jbuilder 2006运行时正常,但是制作为jar文件以后,运行java -jar xxx.jar命令时候会报如下错误:

Exception in thread "main" java.lang.SecurityException: no manifiest section for
 signature file entry com/sun/java/help/impl/TagProperties.class
        at sun.security.util.SignatureFileVerifier.verifySection(SignatureFileVe
rifier.java:377)
        at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVeri
fier.java:231)
        at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier
.java:176)
        at java.util.jar.JarVerifier.processEntry(JarVerifier.java:234)
        at java.util.jar.JarVerifier.update(JarVerifier.java:188)
        at java.util.jar.JarFile.initializeVerifier(JarFile.java:321)
        at java.util.jar.JarFile.getInputStream(JarFile.java:386)
        at sun.misc.JarIndex.getJarIndex(JarIndex.java:99)
        at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:606)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.misc.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:597)
        at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:581)
        at sun.misc.URLClassPath$3.run(URLClassPath.java:331)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.misc.URLClassPath.getLoader(URLClassPath.java:320)
        at sun.misc.URLClassPath.getLoader(URLClassPath.java:297)
        at sun.misc.URLClassPath.getResource(URLClassPath.java:167)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:192)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

后来上网搜索,发现很多使用Jbuilder从外部引用jar包在制作jar文件时候都有这个问题。大概的原因应该是外部jar包有签名,制作成新的jar文件以后没法通过验证,这似乎是Jbuilder的问题(不确定)。

网上有一些解决办法,比如把要导入的jar包放进JBuilder的jdk库,然后让JBuilder重新扫描一次,不过这个方法我没有成功,估计是MAINFEST.MF文件里面的路径问题吧,总是提示找不到import的东西,我尝试过几次没有解决。

另一个方法是在JBuilder制作jar文件的设置时不选择生成MAINFEST文件,这个方法我也没成功。

最后拼死一搏了,前面不是MAINFEST.MF文件路径不对吗,那我仍然从外部导入jar包,仍然生成MAINFEST文件。生成好以后用WINRAR打开,发现META-INF里面有很多文件文件夹,我也不知道是做啥用的,干脆除了MAINFEST.MF其他文件文件夹都删除。删除完毕以后执行java -jar xxx.jar命令,居然成功了。估计删除的那几个文件可能就是验证用的,但是JBuilder生成的时候不完整,所以验证了,但不成功。现在不用验证了,而且jar包都变成了.class文件和我写的程序在同一级,所以MAINFEST.MF文件不用修改路径也可以直接找到了

 网上似乎不仅仅是Jbuilder2006有这个问题,从9开始往后我见到有不少人都提出这样的问题了