【问题标题】:Cannot execute jar file无法执行jar文件
【发布时间】:2017-03-25 22:33:23
【问题描述】:

在使用命令行编译 Java jar 文件时遇到一些技术问题。

我在同一个目录中有这两个 .java 文件

// 源码.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);
  }

}

// 其他.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

但是,当我尝试使用以下命令执行 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

【问题讨论】:

标签: java jar executable-jar


【解决方案1】:

问题是您的类在一个包中,并且 jar 文件应该在一个目录中 - 这在错误消息中进行了编码:注意“class home.Source” - java 将在其中查找 Source 类一个名为 home 的目录,无论是原生目录还是 jar 中的目录(所有这些都必须在类路径上 - 可执行 jar 的内容会自动添加)。

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

例如:

javac -d bin/ $(dirname "$0")/*.java
jar cmf MyJar.jar Manifest.txt -C bin/ *

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

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

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

【讨论】:

  • jar -cvmf 而不是 jar -cvmf - 它们是一样的
  • 谢谢,尝试用手机回答,打错了。
  • np!谢谢,我做了那个改变,现在我得到了一个模糊的错误:java.io.IOException: java.util.jar.Attributes.read(Attributes.java:410) at java.util.jar.Manifest.read 的无效头字段(Manifest.java:199) 在 java.util.jar.Manifest.(Manifest.java:69) 在 sun.tools.jar.Main.run(Main.java:176) 在 sun.tools.jar。 Main.main(Main.java:1288)
  • 真实原因重写答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2016-08-23
  • 1970-01-01
相关资源
最近更新 更多