如何使用 —patch-module java 选项

问题描述

This SO question 询问如何使用 —patch-module javac 选项让 Eclipse 编译

但是,我没有发现让 Eclipse 使用相同配置运行编译的修补代码的明显且简单的方法

即在运行/调试时也使用上述问题中描述的构建路径/模块依赖项配置。

经过多次无果而终,我求助于将 "—patch-module xxxx" 添加到 Launch “Debug Configurations / Arguments / VM Arguments” 以指向文件夹包含由 Eclipse 编译的类。例如

--patch-module java.security.jgss=/Users/xxx/svn/jgssDebug/bin

那行得通,但有点蛮力!有没有我错过的更简单的方法

编辑1

可以使用项目jgssDebug中的Java Build Path / Module Dependencies / Show JPMS Options获取正确的命令行语法,并手动粘贴到项目启动配置的虚拟机参数jgssDebug-Test。 (...只是不要忘记将路径末尾的“src”更改为“bin”...)。第一次我自己使用语法。

结束编辑1

我正在运行 Eclipse 版本:2021-03 (4.19.0) 构建 ID:20210312-0638

背景:

为了解决 SPNEGO SSO 的问题,我们希望通过额外的日志输出来丰富 JRE 模块中的类java.security.jgss

我创建了两个 Eclipse 项目:

  1. jgssDebug 该项目包含我们将使用日志输出修补的 java.security.jgss 类。 .classpath 文件包含:

    <attribute name="patch-module" value="java.security.jgss=/jgssDebug"/>'
    
  2. jgssDebug-Test 该项目将调用 java.security.jgss 中的代码包括 jgssDebug 中的修补代码。这取决于 jgssDebug:

    <classpathentry combineaccessrules="false" kind="src" path="/jgssDebug"/>
    

我能找到的使 jgssDebug-Test 运行修补代码的唯一方法是通过上述“VM 参数”。

两个项目都没有 module-info.java 文件

我们使用 Azul OpenJDK 11.0.11 来编译和运行。

解决方法

它不适用于依赖项目。每个项目都有自己专属的项目>属性:Java构建路径>模块依赖设置。

当前版本的 Eclipse 似乎存在问题:在 Module Dependencies 选项卡中,当点击 Show JPMS Options... 按钮时,正确的 { {1}} 将显示,但在启动配置中缺少这些 JPMS 选项。请确保,这已报告给 Eclipse JDT。

作为替代或解决方法,为避免在每个启动配置中指定 --patch-module java.security.jgss=...,请将其作为默认 VM 参数添加到 JRE/JDK:

  1. 首选项Java >已安装的JRE中选择您的项目中使用的JRE/JDK,然后点击编辑...
  2. 作为默认虚拟机参数,输入以下内容:
    --patch-module java.security.jgss=...