无法执行jar文件

Cannot execute jar file

使用命令行编译 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 "[=12=]")/*.java
jar cmf MyJar.jar Manifest.txt *.class

Manifest.txt 文件仅包含以下三行:

   Manifest-Version: 1.0
   Created-By: <Your info>
   Main-Class: home.Source

然而,当我尝试执行 jar 文件时:

#!/usr/bin/env bash
java -jar MyJar.jar 

我收到这个错误:

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

问题是您的 classes 在一个包中,并且在 jar 文件中应该在一个目录中 - 这在错误消息中编码:注意 "class home.Source" - java 将在名为 home 的目录中查找 Source class,无论是本机目录还是 jar 中的目录(所有这些都必须位于 classpath - 可执行 jar 的内容会自动添加)。

使用 javac 时,建议使用 -d 标志指定目标输出目录,因为这样做将为 classes 所在的任何包创建目录结构.

例如:

javac -d bin/ $(dirname "[=10=]")/*.java
jar cmf MyJar.jar Manifest.txt -C bin/ *

-C 标志将目录更改为包含输出包结构的 bin/ 目录,* 包含所有内容(当然,您可以使用 home/*.class 此处或任何其他 return 从新 CWD 到目标 class 文件的完整相对路径)。

或者,您可以自己将 classes 移动到相关目录,或者在那里编译它们,但通常最好让 javac 根据源中的包声明来完成.

最后,考虑使用 gradle、maven 甚至 ant 来构建您的项目,因为它们都是为了避免此类问题而设计的。