腐败的jar文件

时间:2011-09-26 17:49:02

标签: java windows eclipse jar

我使用eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它表示无效或损坏的jar文件。谁能告诉我为什么jar文件无效?

12 个答案:

答案 0 :(得分:39)

当您在Windows资源管理器中双击JAR文件时会发生这种情况,但JAR本身实际上不是可执行文件 JAR。一个真正的可执行JAR应该至少有一个带有main()方法的类,并在MANIFEST.MF中引用它。

在Eclispe中,您需要将项目导出为 Runnable JAR文件而不是 JAR文件以获取真正的可执行JAR。

或者,如果你的JAR只是一堆密切相关的类(库)的容器,那么你不应该双击它,而是使用一些ZIP工具打开它。 Windows资源管理器默认情况下将JAR文件与java.exe相关联,这对于那些类型的库JAR不起作用。

答案 1 :(得分:17)

当您更改JAR for ZIP的扩展名,提取zip内容并对文件进行一些修改(例如更改MANIFEST.MF文件这是一种非常常见的情况)时,会经常发生这种情况,很多时候Eclipse不生成我们想要的MANIFEST文件,或者我们想修改它的CLASS-PATH或MAIN-CLASS值。

拉回文件夹时会出现问题。

有效的Runnable / Executable JAR具有下一个结构:

myJAR (Main-Directory)
    |-META-INF (Mandatory)
             |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
    |-com 
         |-MainClass.class (must to implement the main method, mandatory)
    |-properties files (optional)
    |-etc (optional)

如果JAR符合这些规则,那么如果您使用ZIP工具手动生成它然后将扩展更改回.jar

那么它将无关紧要

完成后,尝试使用以下命令在命令行执行:

java -jar myJAR.jar 

当您使用zip工具解压缩,再次更改文件和zip时,通常JAR结构会更改为此结构,这是不正确的,因为在文件系统的顶部添加了另一个目录级别,使其成为损坏的文件,因为如下所示:

**myJAR (Main-Directory)
    |-myJAR (creates another directory making the file corrupted)**
          |-META-INF (Mandatory)
                   |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
          |-com 
              |-MainClass.class (must to implement the main method, mandatory)
          |-properties files (optional)
          |-etc (optional)

:)

答案 2 :(得分:11)

问题可能是您的JAR中有超过65536个文件:Why java complains about jar files with lots of entries?此问题的answer中描述了此修复程序。

答案 3 :(得分:9)

可能是因为MANIFEST.MF的问题。如果您知道主类所在的包,请尝试使用以下命令启动主类。

java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server

答案 4 :(得分:3)

这是错误中“清单”的常见问题?是的,它发生了很多,这是一个链接:http://dev-answers.blogspot.com/2006/07/invalid-or-corrupt-jarfile.html

  

<强>解决方案:

     

使用ant任务即时创建清单文件,可以输入和输入:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_07-b05 (Sun Microsystems Inc.)
Main-Class: com.example.MyMainClass
     

我自己创建清单文件,只需要解决问题:

Manifest-Version: 1.0
Main-Class: com.example.MyMainClass
     

随着更多的调查,我确信我可以使用Ant进行动态元文件创建,就像其他人所做的那样 - 在我的ant版本(1.6.2),java版本的组合中必须有一些特性(1.4.2_07)也许是目前的月相。

     

备注:

     

解析Meta-inf文件已成为一个问题,已经修复,然后再次出现在太阳上。见:Bug Id: 4991229。如果您可以解决如果您的(或我的)Java SE版本中存在此错误,那么您对我有更多的耐心。

答案 5 :(得分:1)

当我刚遇到这个主题时,我想分享我收到“无效或损坏的jarfile”消息的原因和解决方案:

我已经将pom.xml中的“ maven-jar-plugin”版本从2.1更新为3.1.2。 一切仍然正常,并建立了一个jar文件。但是以某种方式,它显然将不再运行。

当我再次将“ maven-jar-plugin”版本设置回2.1时,问题就消失了。

答案 6 :(得分:0)

另外,请确保在运行时使用的java版本与编译期间使用的java等效或更高版本

答案 7 :(得分:0)

它也可能是MANIFEST.MF中的拼写错误,p.ex。包含两个:

的构建日期
  Build-Date:: 2017-03-13 16:07:12

答案 8 :(得分:0)

尝试使用命令jar -xvf fileName.jar,然后将解压缩文件的内容导出到Eclipse中的新Java项目中。

答案 9 :(得分:0)

如果jar文件末尾有任何额外的字节,像7-Zip这样的资源管理器可以打开它,但它会被视为损坏。我使用在线上传系统,自动在每个jar文件的末尾添加一个额外的LF字符(&#39; \ n&#39; 0x0a)。使用此类文件,有多种解决方案可以运行该文件:

  • 使用prayagubd的方法,并在命令提示符下将.jar指定为主类的类路径和名称
  • 删除文件末尾的额外字节(使用十六进制编辑器或类似head -c -1 myjar.jar的命令),然后双击或正常使用java -jar myfile.jar执行jar。
  • 将扩展名从.jar更改为.zip,解压缩文件,然后重新创建.zip文件,确保META-INF文件夹位于顶层。
  • 将.jar扩展名更改为.zip,从.jar中删除未处理的文件,并将扩展名更改回.jar

所有这些解决方案都要求.zip和META-INF文件的结构基本上是正确的。它们只是在拉链结束时用一个额外的字节进行了测试。腐败&#34;它

通过两次应用head -c -1 *.jar > tmp.jar,我陷入了困境。 head在文件的开头插入了ASCII文本==> myjar.jar <==,完全破坏了它。

答案 10 :(得分:0)

也许这只是a幸,但是有一次我遇到这个错误,我只需要杀死所有在后台运行的javaw.exe进程。之后,可执行JAR起作用了。

答案 11 :(得分:0)

当您通过FTP将文件传输到目标计算机时,这可能太愚蠢了,您可以运行.JAR文件,但是它太大了,以至于尚未完成传输:)是的,它发生在我身上..