Java Jar - 类路径问题

时间:2016-09-15 02:26:51

标签: java intellij-idea gradle jar

对问题的原因缺乏想法。我有一个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)

3 个答案:

答案 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)

如果您的主类有一个静态初始化块,它会在运行时抛出一些错误,可能会出现这种情况。