Java 无法执行jar文件
使用命令行编译Java jar文件时遇到一些技术问题 我在同一个目录中有这两个.java文件 //Source.javaJava 无法执行jar文件,java,jar,executable-jar,Java,Jar,Executable Jar,使用命令行编译Java jar文件时遇到一些技术问题 我在同一个目录中有这两个.java文件 //Source.java package home; public class Source { public Source(){ System.out.println("This is the source."); } public static void main(String[] s){ System.out.println("this is England
package home;
public class Source {
public Source(){
System.out.println("This is the source.");
}
public static void main(String[] s){
System.out.println("this is England.");
System.out.println("ok 1 - Input file close");
new Source();
new Other();
System.exit(3);
}
}
//Other.java
package home;
public class Other {
public Other(){
System.out.println("More source here.");
}
}
我将这两个文件编译成一个.jar文件,如下所示:
#!/usr/bin/env bash
javac $(dirname "$0")/*.java
jar cmf MyJar.jar Manifest.txt *.class
Manifest.txt文件仅包含以下三行:
Manifest-Version: 1.0
Created-By: <Your info>
Main-Class: home.Source
我得到这个错误:
Error: Could not find or load main class home.Source
我不知道现在该怎么办。有人知道怎么了吗?也许我使用了错误的命令来生成.jar文件
作为检查,我运行jar tf
:
bash-3.2$ jar tf MyJar.jar
META-INF/
META-INF/MANIFEST.MF
Other.class
Source.class
问题是,您的类在一个包中,jar文件中应该在一个目录中-这在错误消息中编码:注意“class home.Source”-java将在名为home的目录中查找源类,无论是本机目录还是jar中的目录(所有这些都必须在类路径上——可执行jar的内容会自动添加) 使用javac时,建议使用
-d
标志指定目标输出目录,因为这样做将为类所在的任何包创建目录结构
例如:
-C
标志将目录更改为包含输出包结构的bin/
目录,*
包含所有内容(当然,您可以在此处使用home/*.class
或任何其他将返回从新CWD到目标类文件的完整相对路径的内容)
或者,您可以自己将类移动到相关的目录,或者在那里编译它们,但通常最好让javac根据源代码中的包声明来完成
最后,考虑使用Gealle、Maven或Ant构建你的项目,因为它们都是为了避免这种问题而设计的。
你可以执行<代码> jar TF Myjar?jar >代码>并确认清单是否确实在JAR中并在正确的路径中?我在这里读到的可能的副本,可能需要在M之后添加空行。anifest文件,否则将无法对其进行分析correctly@Japu_D_Cret谢谢,我运行了检查,看起来还可以,我更新了问题jar-cvmf,而不是jar-cvmf-这些是sameThanks,试图用手机回答并输入了typo.np!谢谢,我做了更改,现在我得到了模糊的错误:java.io.IOException:invalid header字段at java.util.jar.Attributes.read(Attributes.java:410)at java.util.jar.Manifest.read(Manifest.java:199)at java.util.jar.Manifest.(Manifest.java:69)at sun.tools.jar.Main.run(Main.java:176)at sun.tools.jar.Main.Main(Main.java:1288)重写了真实原因的答案bash-3.2$ jar tf MyJar.jar
META-INF/
META-INF/MANIFEST.MF
Other.class
Source.class
javac -d bin/ $(dirname "$0")/*.java
jar cmf MyJar.jar Manifest.txt -C bin/ *