OpenJDK 在 jar 中找不到主类,而 OracleJDK 可以

Posted

技术标签:

【中文标题】OpenJDK 在 jar 中找不到主类,而 OracleJDK 可以【英文标题】:OpenJDK cannot find main class in jar while OracleJDK can 【发布时间】:2017-03-09 02:32:10 【问题描述】:

我有一个问题,我根本无法使用 OpenJDK 运行任何 jar,而使用普通的 OracleJDK 没有问题。

OpenJDK # java -version

openjdk version "1.8.0_101"
OpenJDK Runtime Environment (IcedTea 3.1.0) (suse-14.3-x86_64)
OpenJDK 64-Bit Server VM (build 25.101-b13, mixed mode)

当我用这个 JDK 运行一个 jar 时,它永远找不到主类,即使它在清单中很困难。


OracleJDK # java -version

java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

当我用这个 JDK 启动一个 jar 时,这没问题。

我是否需要在 OpenJDK 中配置一些东西,以便它可以从清单中找到主类,或者 OpenJDK 没有这样做的原因是什么?

编辑:

源文件结构:

-- ui  
---- Main.java  

Gradle 构建脚本:

group 'some.group'
version '0.1'

apply plugin: 'java'
apply plugin: 'application'

mainClassName = "ui.Main"

sourceCompatibility = 1.8

repositories 
    mavenCentral()


dependencies 
    compile group: 'org.zeromq', name: 'jeromq', version: '0.3.5'
    compile group: 'org.controlsfx', name: 'controlsfx', version: '8.40.12'

    testCompile group: 'junit', name: 'junit', version: '4.11'


jar 
    manifest 
        attributes 'Implementation-Title': 'PlaceholderTitle',
                'Implementation-Version': version,
                'Class-Path': configurations.compile.collect  it.getName() .join(' '),
                'Main-Class': mainClassName
    

使用installDist构建

清单:

Manifest-Version: 1.0
Implementation-Title: PlaceholderTitle
Implementation-Version: 0.1
Class-Path: jeromq-0.3.5.jar controlsfx-8.40.12.jar
Main-Class: ui.Main
//new line here

【问题讨论】:

我的猜测是清单中有一个错误,一个实现忽略而另一个没有。 @Henry 我添加了更多信息 【参考方案1】:

您无需为 jar 配置任何内容即可启动。 OracleJDK 与 OpenJDK 大体相同,主要是增加了几个商业特性。

如果发生了奇怪的事情,最好的方法是用尽可能小的例子重现奇怪的事情。如果你真的不能 laucnh any jar,那么 Gradle 是一种过度杀伤力来重现它。另一方面,用于启动 JVM 的实际命令会有所帮助。

这里是创建带有主类的 jar 并执行它的非常基本的命令 - 它应该在任何 JDK 和任何配置下都可以正常运行。

$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime enter code hereEnvironment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
$ echo 'public class HelloWorld  public static void main(String[] args)  System.out.println("Hello, World!");  ' > HelloWorld.java
$ javac HelloWorld.java
$ jar cfe HelloWorld.jar HelloWorld HelloWorld.class
$ java -jar HelloWorld.jar
Hello, World!

【讨论】:

谢谢。您的回答帮助我找到了问题的根源。【参考方案2】:

好的,我找到了答案。问题是我有一个 JavaFX 应用程序,而安装的 OpenJDK 运行时环境不支持它,我不明白,因为 JavaFX 是 Java 8 标准的一部分。

OpenJDK lib/ext 文件夹:

cldrdata.jar       nashorn.jar
dnsns.jar          sunec.jar
icedtea-sound.jar  sunjce_provider.jar
jaccess.jar        sunpkcs11.jar
localedata.jar     zipfs.jar
meta-index

如您所见,您是否熟悉它jfxrt.jar 不见了。这就解释了为什么它不能加载 Main-Class,因为它继承自 javafx.application.Application

【讨论】:

“JavaFX 是 Java 8 标准的一部分”。实际上,因为它是随 Oracle 的 JDK 一起提供的,所以确实如此。但要学究起来,事实并非如此。 OpenJDK 是参考 Java 实现。而且 OpenJDK 本身不包含 javafx。 JavaFX没有通过 Java 8 JCP 标准化。

以上是关于OpenJDK 在 jar 中找不到主类,而 OracleJDK 可以的主要内容,如果未能解决你的问题,请参考以下文章

Launch4J 插件创建一个 EXE(连同 JAR),但 EXE 在 Spring boot 中找不到主类

找不到或无法加载主类!

找不到或无法加载主类“的问题分析

java中找不到主类是啥问题

java 主启动类找不到

如何解决Eclipse下“找不到或无法加载主类”的错误