.
└── src
├── META-INF
│ └── MANIFEST.MF
└── com
└── company
└── Main.java
主.java:
package com.company;
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
}
}
清单.MF:
Manifest-Version: 1.0
Main-Class: com.company.Main
从 src 文件夹执行
javac com/company/Main.java
jar -cvfm out.jar META-INF/MANIFEST.MF com/company/*.class
java -jar out.jar
一切都好
但是如果从上面的级别:
javac src/com/company/Main.java
jar -cvfm out.jar src/META-INF/MANIFEST.MF src/com/company/*.class
java -jar out.jar
我得到:
Error: Could not find or load main class com.company.Main
Caused by: java.lang.ClassNotFoundException: com.company.Main
为什么会这样?
如果你想以
jar这种形式运行,那么你需要package src.com.company;在类和Main-Class: src.com.company.Main清单中添加它。然后一切都会按预期工作。如果您从文件中的内容开始:
当您创建
jar时,包的第一个目录(主要com)必须是存档中的第一个目录,并且您必须高于它(src在我们的例子中,只是在 中),否则以下所有内容都包含在存档中。例如:当您从上面的级别归档时,目录进入归档src,因此,它变成了它的第一级。但是清单说该com/company/Main.java目录将是路径中的第一个,com因此,在主文件中找不到任何内容。顺便一提。
META-INF您不必自己创建文件夹。存档器自己生成它,并MANIFEST.MF通过从您在此处指定的清单中复制数据来创建它。我不是这个主题的专家,但我尽我所能解释了它,我自己理解它。希望对一些问题有所帮助。