Java 无法执行jar文件

Java 无法执行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

使用命令行编译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.");
     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/ *