我一直在尝试使用注释处理器修改AST。我尝试扩展Lombok,但这看起来太难了,所以我决定使用com.sun.source。*和com.sun.tools.javac中的东西。*但是,我正在使用java 11,以及我正在学习的文档,"The Hacker's Guide to Javac" http://scg.unibe.ch/archive/projects/Erni08b.pdf,使用Java 6.他们使用的api现在是内部的,我的module无法读取它。

在IntelliJ中,它给了我一些错误,但我点击了建议(其中说"Add --Xxx-xxx to xxx"之类的东西没有注意它们。当我尝试用Maven编译时,它失败了,因为module没有读取jdk.compiler的内部结构。

这些是我的一些importproduct:

    import com.sun.source.util.Trees;
    import com.sun.tools.javac.tree.JCTree;
    import com.sun.tools.javac.tree.TreeMaker;
    import com.sun.tools.javac.tree.TreeTranslator;
    import com.sun.tools.javac.util.Context;

我的module-info文件包含

    requires jdk.compiler;
    requires java.compiler;

我收到了像"[ERROR]package com.sun.tools.javac.util is declared in module jdk.compiler, which does not export it to module OtherAnnot"和"[ERROR] (package com.sun.tools.javac.tree is declared in module jdk.compiler, which does not export it to module OtherAnnot)"这样的消息

分析解答

随着Project Jigsaw的推出,JDK已经模块化,允许用户创建自己的模块。这些模块允许您导出您的软件包,允许需要module(在其module-info.java中)的程序使用导出的软件包。

理想情况下,您将被禁止使用驻留在未导出的包中的类。但是,为了不破坏向后兼容性,引入了VM标志,允许您强制将包(不属于您)导出到module。

给出您的错误消息,要添加的相应VM标志是:

--add-exports jdk.compiler/com.sun.tools.javac.tree=OtherAnnot

这里的模式是:

--add-exports THEIR_MODULE/THEIR_PACKAGE=YOUR_MODULE

如果编译器抱怨未将包导出到未命名的模块,则可以使用以下命令:

--add-exports THEIR_MODULE/THEIR_PACKAGE=ALL-UNNAMED