我有一个中等大小的项目,我计划创建一个 uber-jar。我使用 Intellij 对其进行编译,并构建了一个工件,其中“来自库的 JAR 文件”设置为“提取到目标 JAR”。
结果如下:
java -cp MyJar.jar com.package.MainClass
Error: Could not find or load main class com.package.MainClass
java -Xdiag -cp MyJar.jar com.package.MainClass
Error: Could not find or load main class com.package.MainClass
Caused by: java.lang.ClassNotFoundException: com.package.MainClass
java.lang.ClassNotFoundException: com.package.MainClass
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:415)
at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:770)
at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:655)
如果我列出 jar 的内容,则该类就在那里。 如果我提取 jar 并从文件系统运行该类,它就会起作用:
jar xf MyJar.jar
java com.package.MainClass <-- it works
如果在 IntelliJ 中,我将“库中的 JAR 文件”设置为“复制输出并通过 list 链接”,则 jar 确实可以工作,但我会在目标目录中得到一堆较小的 jar 文件。
有谁知道可能会出现什么问题以及我应该如何调试它?
最佳答案
经过多次试验,似乎包含一些 JAR 会导致问题:power-mock、objenesis 和mockito。
关于Java 无法在 JAR 中找到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56762309/