带有模块的 Java 11 Gradle

Posted

技术标签:

【中文标题】带有模块的 Java 11 Gradle【英文标题】:Gradle for Java 11 with Modules 【发布时间】:2019-04-08 11:32:20 【问题描述】:

我正在尝试在 Mac OS 上运行示例 JavaFX 应用程序。

build.gradle

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

repositories 
    mavenCentral()



dependencies 
    compile "org.openjfx:javafx-base:11"
    compile "org.openjfx:javafx-graphics:11"
    compile "org.openjfx:javafx-controls:11"


compileJava 
    doFirst 
        println "CLASSPATH IS $classpath.asPath"
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.graphics'
        ]
        classpath = files()
    

Java 类

package com.test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;


public class HelloFX extends Application 

    @Override
    public void start(Stage stage) 
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(l, 640, 480);
        stage.setScene(scene);
        stage.show();
    

    public static void main(String[] args) 
        launch();
    


我使用 Gradle 4.10.2

执行任务 'gradle compileJava' 我收到此错误:

> Task :compileJava FAILED
CLASSPATH IS /Users/dragos.pruteanu/.gradle/caches/modules-2/files-2.1/org.openjfx/javafx-controls/11/58d961774262ec972bf304e16c154a8e18c2050b/javafx-controls-11.jar:/Users/dragos.pruteanu/.gradle/caches/modules-2/files-2.1/org.openjfx/javafx-graphics/11/a736dd079047ec0b72b8c4970842a5c5e0c19f2f/javafx-graphics-11.jar:/Users/dragos.pruteanu/.gradle/caches/modules-2/files-2.1/org.openjfx/javafx-base/11/9fcd3e8e3227ec97bf503f7991fad1f3b14d005/javafx-base-11.jar
error: module not found: javafx.graphics
1 error

怎么了?由于某种原因,JavaFX 库未正确加载。可能是 MacOS 或 OpenJFX 的错误?

【问题讨论】:

由于您使用的是 Gradle,因此您需要查看专门针对 Gradle 的 Getting Started with JavaFX 11 文章。在dependencies中添加JavaFX模块时必须做一些特殊的事情。 【参考方案1】:

它失败的原因主要是 自动模块 从你使用的 jar 中派生出来的名称不是强> javafx.graphics。尝试使用命令行获取详细信息,我可以观察到以下内容:

jar --file=.../org/openjfx/javafx-graphics/11/javafx-graphics-11.jar --describe-module
No module descriptor found. Derived automatic module.

javafx.graphicsEmpty@11 automatic
requires java.base mandated

并且由于解析的模块名称与您在命令行--add-modules javafx.graphics 中指定的名称不同,因此您将面临上述错误。


此外,from Run HelloWorld using JavaFX 11 的注释之一是:

不需要添加javafx.graphics 模块,因为它是 传递 javafx.controls 模块需要


从 cmets 编辑:- 使用 JavaFX 在Run HelloWorld using Gradle 定义的步骤将是寻找使用 gradle 构建的适当步骤的更好地方。

正如它所说(编辑我的),需要在依赖项中指定平台,例如

compile "org.openjfx:javafx-graphics:11:$platform"

...解析传递时不考虑分类器 Gradle 中的依赖项。因此,我们需要指定... 以平台为分类器的模块

您可能还需要示例中使用的构建脚本来将平台/操作系统指定为分类器。

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
    


apply plugin: 'application'
apply plugin: 'com.google.osdetector'

ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os

【讨论】:

谢谢。但是现在如果我删除 javafx.graphics 我得到:错误:找不到模块:javafx.controls。可能它有同样的问题,自动模块。如何编译我的代码?这个自动模块不会给 javafx 带来混乱吗?还有一个关于 HelloWorld 文章的问题:他们为什么使用操作系统特定的 jars ?每个操作系统真的有不同的分布吗? 您可能想提及Run HelloWorld using Gradle 中所说的内容。在 Gradle 中声明 JavaFX 依赖项时必须包含平台分类器。不幸的是,这也意味着传递依赖没有解决(尽管这不会影响--add-modules 命令)。 @dprutean 存在特定于操作系统的发行版,因为每个操作系统的本机代码都是唯一的。 @Slaw Ya,Gradle 的链接当然可以分享。我只是想指出依赖子句,一般来说,是为了让 OP 知道--add-modules 命令的正确用法。 我为最后一个问题创建了一个单独的线程:***.com/questions/53164973/…

以上是关于带有模块的 Java 11 Gradle的主要内容,如果未能解决你的问题,请参考以下文章

带有 IE 11 后备的 css 模块、postcss + webpack

带有 java 模块的 GAE 通道

模块解析失败:带有 Storybook 6.1.11、Webpack 5.11.0、React 17.0.1 的意外字符“@”(1:0)

如何解决java9中的模块读取包错误

是否可以使用带有 Arduino 的 HM-10 或 HM-11 BLE 模块与 iOS 设备 (ANCS) 进行通信?

使用带有反应的css模块?