如何在非模块化代码库中覆盖本地类(如java.util.regex.Matcher
)时使用自定义类路径。
基本上我想要做的是在修补类时使用不同的类路径,如--class-path build/custom
。因为修改后的Matcher.java引用了编译为build/custom
的类。
说我已经修改了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
两个课程如下:
java.util.regex.Matcher中:
package java.util.regex;
class Matcher {
com.example.MyClass myClass;
}
com.example.MyClass:
package com.example;
public class MyClass {
}
案例#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
案例#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
导致错误:
src/Matcher.java:4: error: package com.example does not exist
com.example.MyClass myClass;
^
1 error
我创建了一个测试仓库:https://github.com/gayanW/compile-this-1
..如果有人可以花些时间尝试我的命令(复制粘贴会这样做)。它具有与上面相同的目录结构。
如果你能告诉我如何在那里编译这两个类,那就足够了。但是,唯一的要求是MyClass.class
应该放在build/CUSTOM
中,而Matcher.class
应放在build/PATCH
目录中。
注意: