无法执行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 来构建您的项目,因为它们都是为了避免此类问题而设计的。
使用命令行编译 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 来构建您的项目,因为它们都是为了避免此类问题而设计的。