我正在使用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"
答案 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遇到相同的错误消息:
$ 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"));