对问题的原因缺乏想法。我有一个java jar(如果重要的话,在intellij下使用gradle构建)。
Jar有一个清单。
从包含jar的目录中启动java -jar MyJar.jar
给出"无法找到或加载主类companyname.mainclass"
Java正在从清单中读取将jar中的清单文件编辑为mainclass2
将更改错误消息中的名称
清单只包含一行的版本,然后是一行的主类属性,然后是2个空行
所有依赖项都位于相对于jar的/ lib文件夹中,因此没有在清单中指定类路径
在zip文件程序中打开jar会显示文件夹companyname
,其中包含文件mainclass
,因此限定名称会反映在jar结构中。资本化也是正确的。
手动指定类名java -cp MyJar.jar companyname.mainclass
会发现找不到相同的类错误
有问题的类确实有一个main方法,并且在解压缩时在IDE下运行正常。
我错过了什么(除了头上越来越多的头发)?
修改其他详细信息: - 使用Java 8
jar结构:
-META-INF
MANIFEST.MF
-companyname
-module
-interfaces
interface1.class
-commands
baseCommand.class
register.class
specialCommand.class
moduleSpec.class
moduleProcessor.class
mainclass.class
log4j.xml
springconfig1.xml
springconfig2.xml
清单文件:
Manifest-Version: 1.0
Main-Class: companyname.mainclass
(newline char here)
(newline char here)
答案 0 :(得分:2)
首先,确保您正确创建可执行jar。有关使用gradle创建可执行jar的信息,请参阅this answer。
如果您正确地创建并打包了jar,那么它可能无法加载您的主类,因为它具有无法找到的依赖项。你说:
所有依赖项都在相对于jar的/ lib文件夹中,因此在manifest
中没有指定类路径
如果您的意思是lib
文件夹与.jar文件位于文件系统的同一文件夹中,那么您的依赖项将无法找到。该lib文件夹的内容不会自动添加到jar的类路径中。您可以手动将它们添加到java
命令的类路径中,也可以将它们添加到清单中。如果将它们添加到类路径中,则可以使用通配符:
java -cp "MyJar.jar;lib/*" com.mycompany.MyMainClass
如果将它们添加到清单you can't use wildcards,那么您需要在lib目录下指定每个jar依赖项。 (有关详细信息,请参阅Oracle tutorial on adding jars to the classpath。)
如果lib目录在jar中("胖jar"),那么没有可以帮助你的类路径:默认的类加载器不会从可执行jar中加载依赖项。但是,有多个工具允许您创建包含其所有依赖项的胖jar,并将其作为单个可执行jar分发。由于您使用的是gradle,gradle shadow plugin可能对您有用。
答案 1 :(得分:0)
清单将在这里使用。另外,如果你试试
java -jar -verbose:class MyJar | grep mainclass
它会确认您的班级是否正在加载。哦 - 另外,这里有混合的JVM吗?
确保java -version显示Java 8,因为那是你暗示Intellij / Gradle正在构建的内容。
答案 2 :(得分:0)
如果您的主类有一个静态初始化块,它会在运行时抛出一些错误,可能会出现这种情况。