IntelliJ 构建错误的 JAR:找不到或无法加载主 class
IntelliJ build wrong JAR: Could not find or load main class
我有一个简单的例子
public class FileSystemReadFile {
public static void main(String[] args) throws IOException {
System.out.println("Reading the file" + args[0]);
}
}
这是在我要构建 JAR 文件的 IntelliJ 中创建的;所以我做了什么:
- 添加了具有依赖性的工件(大概我有一些);
- 确保
MANIFEST.MF
位于 src\main\resources\META-INF\
中,因为它已在网站的某处提及。
- 运行 工件构建在 out 文件夹中给了我 JAR 文件,我 运行 那个说我的 jar 文件 "Could not find or load main class"
java <name>.jar
您可能会看到 main class 已添加到 MANIFEST 中,清单的位置也很好。
当我打开那个创建的 JAR 文件时,我看到相同的 MANIFEST 内容,我看到很多依赖模块,但我没有看到我的 class!
我怀疑这是一个原因。有什么想法吗?
不确定 IntelliJ 发生了什么,但我再次重建了工件,一切正常。
hadoop jar <Jar-name>
java -jar <Jar-name>
一切正常。
如果您在应用程序中包含任何签名的 JAR,然后使用 IntelliJ 构建工件,它会提取 JARS 并将它们与您的编译输出捆绑在一起。
这会导致 JAVA 安全异常。我在已签名的 Eclipse Paho 和 Bouncy Castle 中看到了这一点。
您可以检查您正在使用的库 JAR 是否使用 jarsigner 工具签名。
jarsigner -verify -verbose <path to library JAR>
更改您的 IntelliJ 工件设置,以便将它们捆绑为库而不是被提取。如您所料,提取会使证书无效。
尝试创建一个仅包含 Main 的虚拟项目。一次添加 1 个库 JAR(您正在尝试构建的 JAR)。每次构建一个输出 JAR,直到 Main 中断。我就是这样找到的。
IntelliJ 应该警告你......
我有一个简单的例子
public class FileSystemReadFile {
public static void main(String[] args) throws IOException {
System.out.println("Reading the file" + args[0]);
}
}
这是在我要构建 JAR 文件的 IntelliJ 中创建的;所以我做了什么:
- 添加了具有依赖性的工件(大概我有一些);
- 确保
MANIFEST.MF
位于src\main\resources\META-INF\
中,因为它已在网站的某处提及。 - 运行 工件构建在 out 文件夹中给了我 JAR 文件,我 运行 那个说我的 jar 文件 "Could not find or load main class"
java <name>.jar
您可能会看到 main class 已添加到 MANIFEST 中,清单的位置也很好。
当我打开那个创建的 JAR 文件时,我看到相同的 MANIFEST 内容,我看到很多依赖模块,但我没有看到我的 class!
我怀疑这是一个原因。有什么想法吗?
不确定 IntelliJ 发生了什么,但我再次重建了工件,一切正常。
hadoop jar <Jar-name>
java -jar <Jar-name>
一切正常。
如果您在应用程序中包含任何签名的 JAR,然后使用 IntelliJ 构建工件,它会提取 JARS 并将它们与您的编译输出捆绑在一起。
这会导致 JAVA 安全异常。我在已签名的 Eclipse Paho 和 Bouncy Castle 中看到了这一点。
您可以检查您正在使用的库 JAR 是否使用 jarsigner 工具签名。
jarsigner -verify -verbose <path to library JAR>
更改您的 IntelliJ 工件设置,以便将它们捆绑为库而不是被提取。如您所料,提取会使证书无效。
尝试创建一个仅包含 Main 的虚拟项目。一次添加 1 个库 JAR(您正在尝试构建的 JAR)。每次构建一个输出 JAR,直到 Main 中断。我就是这样找到的。
IntelliJ 应该警告你......