使用命令行编译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
答案 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构建项目,因为它们都旨在避免这类问题。