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

Jho*_*007 3 java openjdk javafx jar java-8

我有一个问题,就是我完全无法使用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)
Run Code Online (Sandbox Code Playgroud)

当我使用此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)
Run Code Online (Sandbox Code Playgroud)

当我使用此JDK启动jar时,没有问题。

我是否需要在OpenJDK中进行配置,以便它可以从清单中找到主类,或者OpenJDK不能这样做是什么?

编辑:

源文件结构:

-- ui  
---- Main.java  
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

与建立 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
Run Code Online (Sandbox Code Playgroud)

Jho*_*007 5

好的,我找到了答案。问题是我有一个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
Run Code Online (Sandbox Code Playgroud)

如您所见,如果您不熟悉它,jfxrt.jar就会丢失。这说明了为什么它继承自,所以为什么无法加载Main-Class javafx.application.Application

  • “ JavaFX是Java 8标准的一部分”。实际上,由于它是随Oracle JDK一起提供的,所以的确如此。但是要学究,不是。OpenJDK是参考Java实现。而且OpenJDK本身不包含javafx。JavaFX未通过Java 8 JCP进行标准化。 (3认同)