如何将 --patch-module 与 --class-path 一起使用 | javac

Gay*_*tti 5 java javac java-platform-module-system java-9 java-module

java.util.regex.Matcher在覆盖本机类(例如在非模块化代码库中)时,如何使用自定义类路径。

基本上我想做的是使用不同的类路径,就像--class-path build/custom修补类时一样。因为修改后的 Matcher.java 引用了编译为build/custom.

IE:

假设我已经修改了java.util.regex.Matcher,现在它需要一些其他(非 java)external.jar 才能运行。

那么我怎样才能像这样修补它: javac --patch-module java.base=src,以便它也找到 external.jar 中的类。

原案

目录结构:

+- build  
+- src
     +- PATCH
          +- java
             +- util
                +- regex
                      +- Matcher.java

     +- CUSTOM
          +- com
             +- example
                  +- MyClass.java
Run Code Online (Sandbox Code Playgroud)

两个类如下:

java.util.regex.Matcher:

package java.util.regex;

class Matcher {
        com.example.MyClass myClass;
}
Run Code Online (Sandbox Code Playgroud)

com.example.MyClass:

package com.example;    

public class MyClass {
}
Run Code Online (Sandbox Code Playgroud)

情况1

这有效:

javac -d build src/CUSTOM/com/example/MyClass.java
javac -d build --patch-module java.base=src src/PATCH/java/util/regex/Matcher.java
Run Code Online (Sandbox Code Playgroud)

案例#2

但是如果我将 MyClass 编译到自定义构建路径中,例如 ( -d build/custom)

javac -d build/custom src/CUSTOM/com/example/MyClass.java
javac -d build --class-path build/custom --patch-module java.base=src src/PATCH/java/util/regex/Matcher.java
Run Code Online (Sandbox Code Playgroud)

它会导致错误:

src/Matcher.java:4: error: package com.example does not exist
        com.example.MyClass myClass;
                   ^
1 error
Run Code Online (Sandbox Code Playgroud)

测试仓库

我创建了一个测试仓库:https ://github.com/gayanW/compile-this-1

..以防有人能抽出时间来尝试我的命令(复制粘贴即可)。它的目录结构与上面的相同。

如果你能告诉我如何编译其中的两个类,那就足够了。然而唯一的要求是MyClass.class应该进入 build/CUSTOMMatcher.class应该进入build/PATCH目录。

笔记:

  • 这仅用于测试目的,不会在生产中使用。