我收到错误:尝试打开文件hola.jar时发生意外错误

时间:2015-10-29 01:24:17

标签: java jar

我正在使用Linux ubuntu并且我创建了一个名为hola.java的java程序,它是以下程序代码,这个程序运行正常

import javax.swing.*;
import java.awt.*;

public class hola extends JFrame {

JButton b1 = new JButton("presionar");

 hola(){

  super("Botones");
  setSize(250,250);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  FlowLayout flo=new FlowLayout();
  setLayout(flo);
  add(b1);
  setVisible(true);

  }

  public static void main(String[] args)
 {


    hola bt = new hola();
   }

}

这个java程序在运行时运行良好 现在我使用命令行创建了这个程序的jar文件:

  

jar cf hola.jar hola.class

这将创建一个名为hola.jar

的Jar文件

我甚至在manifest.mf文件中写了Main-Class:hola。

当我尝试通过以下方式运行时:

  

java -jar hola.jar

我收到错误:An unexpected error occurred while trying to open file hola.jar

请告诉我如何运行jar文件以便我得到一个输出:'(,这可能是我无法将此程序作为jar文件运行的原因,即使程序使用&#完美运行34; java hola.java"

3 个答案:

答案 0 :(得分:2)

此错误主要表示无效的MANIFEST.MF文件。也许是长行,缺少最后一行终止符,中间是偶然的空行,...许多事情可能出错。使用-cp可以解决问题,但不能解决根本原因。

答案 1 :(得分:1)

要在jar文件中运行java文件,您无需打开它。您只需要确保您的类路径具有给定的jar文件

如果班级在一个包中,那么你可以使用

运行
java -cp hola.jar package.hola

如果课程不在课程中,则只需使用

java -cp hola.jar hola

如果您不在hola.jar所在的目录中,则可以尝试以下操作:

  • 如果是包

    java -cp /locationOfJar/hola.jar package.hola

  • 或不包装

    的情况

    java -cp /locationOfJar/hola.jar hola

答案 2 :(得分:0)

在某些操作系统上的.jar中,> 65535个文件也可能发生错误

我尝试通过-jar遇到相同的错误消息:

$ java -jar app.jar
Error: An unexpected error occurred while trying to open file: app.jar

根本原因是我的sbt-assembly输出.jar文件包含超过65535个条目。

$ zipinfo app.jar |wc -l
65543

解决方案:短期解决方案是删除较旧的依赖项,以将组合的.class文件的数量减少到16位文件数限制以下。

长期解决方案将涉及在目标OS上测试Zip64 jvm支持。不确定为什么不会自动进行zip64自动协商。

在MacOSX 10.15.7上使用sbt-assembly 15.0,openjdk版本“ 11.0.8”可以重现此问题。

代码审查的开始:

package java.util.zip;
...
public
class ZipOutputStream extends DeflaterOutputStream implements ZipConstants {

    /**
     * Whether to use ZIP64 for zip files with more than 64k entries.
     * Until ZIP64 support in zip implementations is ubiquitous, this
     * system property allows the creation of zip files which can be
     * read by legacy zip implementations which tolerate "incorrect"
     * total entry count fields, such as the ones in jdk6, and even
     * some in jdk7.
     */
    private static final boolean inhibitZip64 =
        Boolean.parseBoolean(
            GetPropertyAction.privilegedGetProperty("jdk.util.zip.inhibitZip64"));