我尝试按照以下位置的说明使用 JavaFX:
https://openjfx.io/openjfx-docs/下的“JavaFX 和 IntelliJ”->“非模块化 Maven”
完成步骤 1 和 2(安装和验证)后,我尝试从 IntelliJ 而不是通过 Maven 插件运行一个非常简单的程序。
TraderWindow.java
public class TraderWindow extends Application {
@SneakyThrows
public static void main(String[] args) {
launch(args);
}
@Override
@SneakyThrows
public void start(Stage primaryStage) {
Scene scene = FXMLLoader.load(getClass().getResource("/TraderWindow.fxml"));
primaryStage.setScene(scene);
primaryStage.show();
}
}
Run Code Online (Sandbox Code Playgroud)
交易窗口.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" …Run Code Online (Sandbox Code Playgroud) 什么是Java 9模块的命名约定?假设我的包名是me.jasonyeo.awesome.project,并且每当我module-info.java在IDEA中创建文件时,它都会建议我命名它awesome.project
这是惯例吗?或者我应该说出来me.jasonyeo.awesome.project吗?
Java 9+工具用于从模块路径上的非模块化jar的名称自动派生模块名称的算法是什么?
我将我的项目使用的SDK升级到Java 10.以下import语句导致错误:
import javax.annotation.PostConstruct;
包'javax.annotation'在模块'java.xml.ws.annotation'中声明,但模块'application'不读取它
点击ALT + ENTER让Intellij修复它,我收到了以下选项:
我选择Add Maven Dependency...了以下依赖项添加到pom.xml中.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
看着新添加的JAR的MANIFEST.MF,我注意到模块的名称是java.annotation.
所以我添加requires java.annotation到module-info.java.
module application {
requires java.annotation;
}
Run Code Online (Sandbox Code Playgroud)
当我按CTRL +点击时requires java.annotation:
Intellij正确导航到JAR:
所以看起来我的模块名称正确并且javax.annotation:javax.annotation-api我的模块可以使用.不幸的是,错误import javax.annotation.PostConstruct并没有消失.为了确认我的模块描述符是否正常工作,我添加了其他指令,并且一切正常.我还添加了指令requires java.xml.ws.annotation,
这导致import语句错误消失但当然,这不是一个令人满意的解决方案,因为java.xml.ws.annotation已被弃用并标记为要删除.
有关如何解决此问题的任何想法?我需要能够将模块java.annotation提供给模块,application并且从我在这里和这里以及此处和此处阅读的方法来实现它是通过向模块路径添加JAR,以及我在这里阅读的新内容必须通过module-info.java中的指令引用添加的模块.
java module intellij-idea java-platform-module-system java-9
我在嵌入窗口中显示网页时遇到问题,但仅在创建独立的 jlinked 包且仅适用于某些 https 站点时。
我按照https://openjfx.io/openjfx-docs/#install-javafx上的说明创建了一个简单的模块化应用程序,并且从命令行运行时效果很好
java --module-path "%PATH_TO_FX%;mods" -m uk.co.comsci.testproj/uk.co.comsci.testproj.Launcher
Run Code Online (Sandbox Code Playgroud)
但在使用命令 jlink 之后
jlink --module-path "%PATH_TO_FX_MODS%;mods" --add-modules uk.co.comsci.testproj --output launch
Run Code Online (Sandbox Code Playgroud)
并与运行
launch\bin\java.exe -m uk.co.comsci.testproj/uk.co.comsci.testproj.Launcher
Run Code Online (Sandbox Code Playgroud)
javaFx 场景打开,但只是一个空白屏幕...我必须使用任务管理器来终止应用程序。
如果我将 URL 更改为其他 https 站点,则显示正常。
我想这取决于某处的安全设置和策略,但我不知道从哪里开始。
我尝试使用 WireShark 进行监控,这表明当从 java 运行并且它可以工作时,它会执行一些 TLSv1.3 操作来建立连接。当作为 jlinked 包运行时,它只执行 TLSv1.2 的操作。也许有线索?
这是我的 SSCE:
模块信息.java
module uk.co.comsci.testproj {
requires javafx.web;
requires javafx.controls;
requires javafx.media;
requires javafx.graphics;
requires javafx.base;
exports uk.co.comsci.testproj;
}
Run Code Online (Sandbox Code Playgroud)
启动器.java
java --module-path "%PATH_TO_FX%;mods" -m uk.co.comsci.testproj/uk.co.comsci.testproj.Launcher
Run Code Online (Sandbox Code Playgroud)
主应用程序.java
jlink --module-path "%PATH_TO_FX_MODS%;mods" --add-modules uk.co.comsci.testproj --output launch
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助。
直到 8 日,才有可能得到一些关于所用 JRE 的供应商的信息,如下所示:
String vendor = Runtime.class.getPackage().getImplementationVendor().
Run Code Online (Sandbox Code Playgroud)
自 Java 9 和 Java Module System 的引入以来,上面的方法调用总是返回 null。
如何获得与当前 Java 平台相同的信息?
我正在探索Project Jigsaw @ JDK 9,几乎所有Java开发人员都在考虑Oracle如何为Java 9带来模块化.
我已经创建了一个示例java项目,代码编译没有任何错误.
下面是生成的字节码文件及其结构
$ tree mods/dictionary.spi/
mods/dictionary.spi/
??? dictionary
? ??? DictionaryService.class
? ??? spi
? ??? Dictionary.class
??? module-info.class
2 directories, 3 files
Run Code Online (Sandbox Code Playgroud)
我尝试为上面的类文件创建jar文件,如下所述.
$ /opt/jigsaw-jdk-9/bin/jar --create --file lib/dictionaryspi.jar --module-version=1.0 mods/dictionary.spi/ .
Run Code Online (Sandbox Code Playgroud)
没有module-info.class的--module-version或--hash-dependencies之一
非常感谢,如果有人为这个错误提供了最佳解决方案.
以下代码(通过JNLP API检索Java Web Start客户端应用程序的基本URL)在Java 8中工作,但在(模块化)Java 9运行时中执行时失败:
Class<?> mclass = Class.forName("javax.jnlp.ServiceManager");
Method lookup = mclass.getMethod("lookup", new Class[]{String.class});
Object basicSvc = lookup.invoke(null, new Object[{"javax.jnlp.BasicService"});
Class<?> sclass = basicSvc.getClass();
Method getCodeBase = sclass.getMethod("getCodeBase", (Class[])null);
URL codebase = (URL)getCodeBase.invoke(basicSvc, (Object[])null); // throws
Run Code Online (Sandbox Code Playgroud)
结果是
java.lang.IllegalAccessException: class app.App cannot access class
com.sun.jnlp.BasicServiceImpl (in module jdk.javaws) because module
jdk.javaws does not export com.sun.jnlp to unnamed module @7202a0fa
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException
at java.base/java.lang.reflect.AccessibleObject.checkAccess
at java.base/java.lang.reflect.Method.invoke
at app.App.init
Run Code Online (Sandbox Code Playgroud)
怎么解决这个问题?
我正在切换到Java 9(用于HTTP/2客户端,以及其他好处),但不打算使用Java 9模块化.
关于无法访问的软件包,我遇到了大量的编译器错误.每个都要求我添加一个额外的--add-exports modulename/packagename=ALL-UNNAMED编译器标志.
是否有一些编译器标志,我可以指定,一次,添加所有导出,而不是再得到编译器错误?
以下是显示问题的示例代码:
package com.prosc.fx;
import com.sun.javafx.stage.WindowHelper;
public class CompilerFlagTest {
public static void main(String[] args) {
WindowHelper.getWindowAccessor();
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息是:
错误:(3,22)java:package com.sun.javafx.stage不可见(包com.sun.javafx.stage在模块javafx.graphics中声明,它不会将其导出到未命名的模块)
我想在我的应用程序中使用Java 9。我的一个依赖项有一个jar名称:
sdk-http-ahc-2_0
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试将其更改为自动模块时,该模块的名称无效。
requires sdk.http.ahc.2_0; // not valid
Run Code Online (Sandbox Code Playgroud)
我在命名模块时缺少什么吗?我在这里还有其他选择吗?
我读过 JPMS 的优点之一是更好的封装(除非明确打开,否则所有内容都受到限制)。
但我有一个问题:是什么阻止了程序员替换module-info.class第三方模块 JAR 并导出所有包,甚至制作open模块,因此所有内容都可以通过反射(包括private成员)访问。
JPMS 是否真的可以帮助隐藏内部代码,或者就像 Java 8 及更早版本一样:所有内容都可以通过反射 API 访问,甚至是private成员(从 Java 9 开始只需要额外的步骤来打开模块)?
java-platform-module-system ×11
java-9 ×9
java ×6
java-module ×3
javafx ×2
module ×2
jar ×1
java-14 ×1
javafx-11 ×1
jlink ×1
jnlp ×1
reflection ×1
ssl ×1
webview ×1