创建 Jar 存档提供 "Could not find or load main class"
Creating Jar archive gives "Could not find or load main class"
$ cat Manifest.txt
Main-Class: org.fenix.llanfair.Llanfair
$ cat org/fenix/llanfair/Llanfair.java | grep main
public static void main(String[] args) {
$ jar cfm Llanfair.jar Manifest.txt org
$ java -jar Llanfair.jar
Error: Could not find or load main class org.fenix.llanfair.Llanfair
$ jar -xf Llanfair.jar
$ cat Llanfair/META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_25 (Oracle Corporation)
Main-Class: org.fenix.llanfair.Llanfair
$ ls Llanfair/org/fenix/llanfair/ | grep Llanfair
Llanfair.class
Llanfair.class
Llanfair$MenuItem.class
Llanfair$RecentMenuItem.class
Llanfair.class
$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
我希望 java -jar Llanfair.jar 启动我的应用程序,所以我不确定我在这里做错了什么。当我正常 运行 java 代码时,我的 lib/ 中确实有几个文件位于我的类路径中,我需要包含这些文件吗?
我的 OS 是 Mac OS 10.11.1,如果重要的话。
似乎Llanfair.jar
中的文件结构是错误的。
根据您的评论jar -xf Llanfair.jar
创建了一个类似于
的结构
Llanfair/META-INF/MANIFEST.MF
Llanfair/org/fenix/llanfair/Llanfair.class
但是jar文件里面的结构必须是
META-INF/MANIFEST.MF
org/fenix/llanfair/Llanfair.class
我缺少 Class-Path: 清单中的值,我不明白为什么它会以这种方式出现。
$ cat Manifest.txt
Class-Path: lib/ui.jar lib/jnativehook-2.0.2.jar
Main-Class: org.fenix.llanfair.Llanfair
$ jar cfm Llanfair.jar Manifest.txt org lib
$ java -jar Llanfair.jar
<normal application output>
^C$ jar -xf Llanfair.jar
$ ls Llanfair
ls: Llanfair: No such file or directory
<manually extracted Llanfair.jar using Archive Utility>
$ cat Llanfair/META-INF/MANIFEST.MF
Manifest-Version: 1.0
Class-Path: lib/ui.jar lib/jnativehook-2.0.2.jar
Created-By: 1.8.0_25 (Oracle Corporation)
Main-Class: org.fenix.llanfair.Llanfair
$
编辑:有点复杂。我试图在 Llanfair.jar 中包含 jar 依赖项。这是不允许的,因为/原因/。上面的工作是因为我是 运行 同一目录中的 jar - 所以 lib/ui.jar 存在是因为我正在使用它来构建。
$ cat Manifest.txt
Main-Class: org.fenix.llanfair.Llanfair
$ cat org/fenix/llanfair/Llanfair.java | grep main
public static void main(String[] args) {
$ jar cfm Llanfair.jar Manifest.txt org
$ java -jar Llanfair.jar
Error: Could not find or load main class org.fenix.llanfair.Llanfair
$ jar -xf Llanfair.jar
$ cat Llanfair/META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_25 (Oracle Corporation)
Main-Class: org.fenix.llanfair.Llanfair
$ ls Llanfair/org/fenix/llanfair/ | grep Llanfair
Llanfair.class
Llanfair.class
Llanfair$MenuItem.class
Llanfair$RecentMenuItem.class
Llanfair.class
$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
我希望 java -jar Llanfair.jar 启动我的应用程序,所以我不确定我在这里做错了什么。当我正常 运行 java 代码时,我的 lib/ 中确实有几个文件位于我的类路径中,我需要包含这些文件吗?
我的 OS 是 Mac OS 10.11.1,如果重要的话。
似乎Llanfair.jar
中的文件结构是错误的。
根据您的评论jar -xf Llanfair.jar
创建了一个类似于
Llanfair/META-INF/MANIFEST.MF
Llanfair/org/fenix/llanfair/Llanfair.class
但是jar文件里面的结构必须是
META-INF/MANIFEST.MF
org/fenix/llanfair/Llanfair.class
我缺少 Class-Path: 清单中的值,我不明白为什么它会以这种方式出现。
$ cat Manifest.txt
Class-Path: lib/ui.jar lib/jnativehook-2.0.2.jar
Main-Class: org.fenix.llanfair.Llanfair
$ jar cfm Llanfair.jar Manifest.txt org lib
$ java -jar Llanfair.jar
<normal application output>
^C$ jar -xf Llanfair.jar
$ ls Llanfair
ls: Llanfair: No such file or directory
<manually extracted Llanfair.jar using Archive Utility>
$ cat Llanfair/META-INF/MANIFEST.MF
Manifest-Version: 1.0
Class-Path: lib/ui.jar lib/jnativehook-2.0.2.jar
Created-By: 1.8.0_25 (Oracle Corporation)
Main-Class: org.fenix.llanfair.Llanfair
$
编辑:有点复杂。我试图在 Llanfair.jar 中包含 jar 依赖项。这是不允许的,因为/原因/。上面的工作是因为我是 运行 同一目录中的 jar - 所以 lib/ui.jar 存在是因为我正在使用它来构建。