无法执行jar文件

时间:2017-03-25 22:33:23

标签: 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.");
     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

但是当我尝试使用:

执行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

1 个答案:

答案 0 :(得分:1)

问题是你的类在一个包中,并且jar文件应该在一个目录中 - 这是在错误消息中编码的:注意&#34;类home.Source&#34; - java将在名为home的目录中查找Source类,无论是本机目录还是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构建项目,因为它们都旨在避免这类问题。