标签: java-14

在 Windows 上使用 JPackage 是否可以使 main .exe 不作为控制台运行,但让其他启动程序作为控制台运行?

使用 JPackage,我无法获得 --win-console 选项来为主启动器单独工作,但我希望主启动器不输出到控制台,但有一个可以输出到控制台的调试版本。

即如果我跑

jpackage --add-launcher SongKongDebug=jpackage.properties @jpackage.txt 
Run Code Online (Sandbox Code Playgroud)

jpackage.txt

-i C:\Code\jthink\SongKong\target\songkong-6.10
--runtime-image C:\code\jthink\songkong\JVM64
--main-class com.jthink.songkong.cmdline.SongKong
--name SongKong
--win-dir-chooser
--main-jar lib\SongKong-6.10.jar
--app-version 6.10
--install-dir Jthink\SongKong
--copyright "Copyright 2020 JThink Ltd, United Kingdom"
--license-file C:\Code\jthink\SongKong\src\main\scripts\license.txt
--java-options "-Dhttps.protocols=TLSv1.1,TLSv1.2"
--java-options "--add-opens java.base/java.lang=ALL-UNNAMED"
--java-options "-XX:MaxRAMPercentage=75.0"
--java-options "-XX:MetaspaceSize=45 "
--java-options "-Dcom.mchange.v2.log.MLog=com.mchange.v2.log.jdk14logging.Jdk14MLog"
--java-options "-Dorg.jboss.logging.provider=jdk"
--java-options "-Djava.util.logging.config.class=com.jthink.songkong.logging.StandardLogging"
--vendor JThink
--win-menu
--win-shortcut
--win-menu-group Jthink
Run Code Online (Sandbox Code Playgroud)

jpackage.properties

win-console=--win-console
Run Code Online (Sandbox Code Playgroud)

然后 SongKong 和 SongKongDebug 都在没有控制台的情况下运行

我还尝试修改 jpackage.properties (这意味着名称/值对)以

--win-console
Run Code Online (Sandbox Code Playgroud)

但还是没用

而如果我添加

--win-console 
Run Code Online (Sandbox Code Playgroud)

到 jpackage.txt 和

win-console 
Run Code Online (Sandbox Code Playgroud)

到 jpackage.properties

那么SongKong将作为控制台运行,而SongKongDebug …

java java-14 jpackage

5
推荐指数
1
解决办法
2994
查看次数

列出依赖项时未找到 JDEPS 模块异常

我一直在使用 JLink 为各种 Spring Boot 应用程序创建最小的 JRE。通过反复试验找出所需的模块,我已经成功地手动完成了这项工作。成功执行此操作后,我一直在尝试使用 JDeps 自动执行此过程。

第一次尝试是为我的应用程序扫描构建的 Jar。我正在使用 Java 14 jdeps 来分析 Java 11 代码库。

jdeps --class-path BOOT-INF/classes --module-path BOOT-INF/lib/,${JAVA_HOME}/jmods --add-modules=ALL-MODULE-PATH --list-deps target/camel-account-sapi-0.0.2-SNAPSHOT.jar

这会导致几个未找到的依赖项。

Error: Missing dependencies: classes not found from the module path and classpath.
To suppress this error, use --ignore-missing-deps to continue.

camel-account-sapi-0.0.2-SNAPSHOT.jar
   com.ms3.camelaccountsapi.CamelAccountSapiApplication -> org.springframework.boot.SpringApplication         not found
   com.ms3.camelaccountsapi.CamelAccountSapiApplication -> org.springframework.boot.autoconfigure.SpringBootApplication not found
   com.ms3.camelaccountsapi.CamelAccountSapiApplication -> org.springframework.context.ConfigurableApplicationContext not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.apache.camel.builder.RouteBuilder              not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.apache.camel.model.rest.RestDefinition         not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.apache.camel.model.rest.RestOperationParamDefinition not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> …
Run Code Online (Sandbox Code Playgroud)

java jar jdeps java-11 java-14

5
推荐指数
1
解决办法
771
查看次数

Java 记录是否支持“with”语法?

Java 14 带来了记录,这是许多函数式语言中的一个很好的补充:

爪哇:

public record Vehicle(String brand, String licensePlate) {}
Run Code Online (Sandbox Code Playgroud)

毫升:

type Vehicle = 
  {
    Brand : string
    LicensePlate : string
  }
Run Code Online (Sandbox Code Playgroud)

在 ML 语言中,可以通过创建一个更改了一些值的副本来“更新”记录:

let u = 
  {
    Brand = "Subaru"
    LicensePlate = "ABC-DEFG"
  }

let v =
  {
    u with 
      LicensePlate = "LMN-OPQR"
  }

// Same as: 
let v = 
  {
    Brand = u.Brand
    LicensePlate = "LMN-OPQR"
  }
Run Code Online (Sandbox Code Playgroud)

这在 Java 14 中可能吗?

java java-14 java-record

5
推荐指数
1
解决办法
167
查看次数

配置 IntelliJ 以使用 Java 14 和记录

我试图让 IntelliJ 与 SDK-14 一起工作,但我显然在让记录工作时遇到了问题。由于发布日期是在 3 月,我认为 Jetbrains 的好人已经接近拥有一个适用于 SDK-14 的版本。我需要使用 --enable-preview 运行 SDK 14。我在谷歌上搜索了几天没有任何运气。

我在 Sublime 上有一些运气,但我错过了代码完成。如果还有其他选择,请随时提及。

java editor intellij-idea java-14

4
推荐指数
1
解决办法
1741
查看次数

JPackage 仅返回 Java 14 上的 SDK 版本号

我最近将 Java 11 应用程序移植到新发布的 Java 14 (ZuluJDK)。当尝试通过命令行使用新的 JPackage 打包我们的应用程序时,无论我使用哪个 jpackage 命令,唯一发生的事情是以下输出:

WARNING: Using incubator modules: jdk.incubator.jpackage
14
Run Code Online (Sandbox Code Playgroud)

一个示例命令(审查了一些内容,由 < > 占位符表示...):

jpackage --type app-image --verbose --input <path> --main-class <class> --main-jar ./<name>.jar --output runtime-image --name "<name>" --version 2.0.0 --vendor "<company>" --icon <icon-path>.ico
Run Code Online (Sandbox Code Playgroud)

有人可以帮我看看这是什么原因造成的吗?sdk版本的Output并没有提供太多帮助。

java deployment command-line java-14 jpackage

4
推荐指数
1
解决办法
299
查看次数

将 Java 14 记录用于仅具有最终字段的泛型(非数据)类

给定一个带有 final 字段的简单类,例如 a String(参见下面的示例)或 Spring 依赖项,使用 Java 14 记录使其更简洁并可能删除 Lombok 等注释处理器是个好主意吗?

根据JEP描述记录,“记录使语义声明成为其数据的简单、透明的持有者”。

显然,只有 final 字段的泛型类并不是其数据的透明持有者,并且在使用记录时,其final变量是公开的,这可能是不可取的。但是,在许多情况下,这可能不是主要问题。

因此,这是否“足以”将其视为对该语言功能的“滥用”?或者还有其他不那么明显的缺点吗?

@RequiredArgsConstructor // or an explicit constructor when not using lombok
class AudienceValidator implements OAuth2TokenValidator<Jwt> {
    private final String audience;

    public OAuth2TokenValidatorResult validate(Jwt jwt) {
        // validate
    }
}


record AudienceValidator(String audience) implements OAuth2TokenValidator<Jwt> {

    public OAuth2TokenValidatorResult validate(Jwt jwt) {
        // validate
    }
}
Run Code Online (Sandbox Code Playgroud)

java java-14 java-record

4
推荐指数
1
解决办法
585
查看次数

在 jpackage 之后运行 JavaFX 应用程序

我有一些非常菜鸟的问题。我尝试在 OpenJDK 14 中使用 jpackage 为我的测试应用程序创建安装。这是我所做的:

首先,创建自定义 JRE

jlink --module-path "C:\Java\javafx-sdk-14\lib" --add-modules javafx.controls,javafx.fxml --output hello\myjre
Run Code Online (Sandbox Code Playgroud)

那是成功的。我从运行配置中从我的 Eclipse 中复制了参数。之后使用 jpackage 进行安装

jpackage --name HelloFX --input hello --main-jar HelloFX.jar --runtime-image hello\myjre
Run Code Online (Sandbox Code Playgroud)

创建了 .msi 文件,我运行它并在我的 Win10 应用程序中创建了条目。当然,我不知道如何在 windows 菜单中找到它,但它放在我的 C:\Program Files\HelloFX 中。我找到了带有 Duke 图像的图标和应用程序文件,当我尝试运行应用程序时,会弹出“无法启动 JVM”消息。

有人可以帮助我,我做错了什么?我真的很想完成这项工作并深入研究 JavaFX。

javafx java-14 jpackage

4
推荐指数
1
解决办法
1914
查看次数

有没有办法通过代码或命令行(JDK 9+)禁用 swing 中的本机 DPI 缩放?

我最近决定从我正在使用的 JDK 切换到更新版本。(特别是从jdk1.8.0_261jdk-14.0.2)。这次升级非常顺利,因为大多数功能都按照我预期的方式工作,并且我能够找到如何调整以适应任何不一样的情况。

然而,如标题所示,我在编写使用 Swing 的特定应用程序时遇到了问题。我的主显示器是 4k 显示器,我已将该显示器的 Windows 系统缩放设置为 200%。虽然每个其他 Swing 应用程序都可以缩放以匹配 DPI 设置,但对于这个特定的应用程序,我想禁用该缩放并按 1:1 绘制像素,尤其是当此应用程序是分布式的时。

有没有办法通过 VM 参数禁用这种自动缩放?或者有没有办法在调用 Swing 库之前在运行时禁用缩放?(类似于必须在对库进行任何其他调用之前对外观进行任何更改。)

以供参考:

这是我用来创建 JFrame 并创建我在其上绘制所有内容的图形对象的代码,这发生在此类和本问题范围之外的定时循环中。

public class ScreenManager {
    private GraphicsDevice device;
    private final JFrame frame;
    
    private static ScreenManager instance;
    
    public ScreenManager() {
        instance = this;
        
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        this.device = env.getDefaultScreenDevice();
        
        this.frame = new JFrame(game.getGame().gameName());
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.frame.setUndecorated(true);
        this.frame.setIgnoreRepaint(true);
        this.frame.setResizable(false);
        
        this.device.setFullScreenWindow(frame);
        this.device.setDisplayMode(device.getDisplayMode());
        
        this.frame.createBufferStrategy(2);
    }

    public Graphics2D getRenderGraphics() {
        Window window = device.getFullScreenWindow();
        if (window …
Run Code Online (Sandbox Code Playgroud)

java swing java-9 java-14

4
推荐指数
1
解决办法
1923
查看次数

javafx 16 WebEngine 异常“SSL 握手失败”

我正在将 Android 应用程序移植到 javaFX 以进行 Windows 部署,我对 javaFX 和桌面部署很陌生,但对 java 来说并不陌生。

该应用程序包含一个 WebView,它加载通过 Json 从服务器获取的 url(因此本质上可以是任何内容)。

openJDK 14、openJfx 16、intellij idea Ultimate 2021.1.3、gradle:插件:org.beryx.jlink 和 org.openjfx.javafxplugin

当我在开发和测试中(在 Windows 10 计算机上)运行该程序时,效果很好,但是当它在 Windows 计算机(到目前为止的任何 Windows 10)上打包和部署时,我得到一个“java.lang.Throwable:SSL 握手”加载页面时出现“失败”异常。

这是堆栈跟踪:

    [ERROR] 2021-07-14 14:13:53.737 [JavaFX Application Thread] MediaElementWeb - WebView Failed: 
java.lang.Throwable: SSL handshake failed
    at javafx.scene.web.WebEngine$LoadWorker.describeError(WebEngine.java:1440) ~[javafx.web:?]
    at javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1379) ~[javafx.web:?]
    at javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1240) ~[javafx.web:?]
    at com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2524) ~[javafx.web:?]
    at com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2369) ~[javafx.web:?]
    at com.sun.webkit.network.URLLoaderBase.twkDidFail(Native Method) ~[javafx.web:?]
    at com.sun.webkit.network.URLLoader.notifyDidFail(URLLoader.java:799) ~[javafx.web:?]
    at com.sun.webkit.network.URLLoader.lambda$didFail$6(URLLoader.java:782) ~[javafx.web:?]
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:447) ~[javafx.graphics:?]
    at java.security.AccessController.doPrivileged(AccessController.java:391) ~[?:?]
    at …
Run Code Online (Sandbox Code Playgroud)

ssl javafx jlink javafx-webengine java-14

4
推荐指数
1
解决办法
999
查看次数

JavaFX 真的可以在非模块化环境中使用吗?

我尝试按照以下位置的说明使用 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 javafx java-platform-module-system javafx-11 java-14

3
推荐指数
1
解决办法
2058
查看次数