闻秋寒 2023-07-21 12:30 采纳率: 0%
浏览 165
已结题

jdk9+由于模块化,导致的开发编译时注解处理器某些类无法使用的问题 cannot access class com.sun.tools.javac

问题概述

正在开发类似lombok的编译时注解处理器程序,但由于jdk9+模块化的问题,某些类未导出给未命名模块,导致出现以下类似问题,在此寻求解决方案。

class com.wenqiuhan.tool.enhanno.application.Application (in unnamed module @0x4190bc8a) 
cannot access class com.sun.tools.javac.api.JavacTrees (in module jdk.compiler) 
because module jdk.compiler does not export com.sun.tools.javac.api to unnamed module @0x4190bc8a

我的环境

jdk17 + gradle(kotlin-dsl)

项目:

  • wen-tool-enhanno-annotation 存放注解

  • wen-tool-enhanno-processor 存放注解处理程序

    img

探索解决之路

首先在没有任何配置时,相关类直接爆红

img

根据IDEA提示结合网上搜索进行如下配置,解决了爆红的问题

img

效果:

img

执行wen-tool-processor模块的build命令,提示以下错误:

img

仍旧是经过一番搜索,得到以下解决方案成功build:

img

本项目中的模块使用

本项目中的模块依赖该注解处理器,成功进行build

img

其他项目使用该注解处理器

将注解处理器和注解模块发布为maven到本地maven仓库后,在其他模块引入,仍旧提示cannot access class com.sun.tools问题

maven项目

img

gradle项目

img

又经过一番搜索,得到如下解决方案

maven项目

img

gradle项目

img

最后

有没有能够在processor项目就能解决这个问题的方案?或是写IDEA插件能否解决?

在引入processor模块时添加一些配置是能解决,但是终归是不太友好的方式,最好是在我这边就能处理而不是让使用者去添加一些额外配置。
(因为编译时注解处理器会在编译时增加字段或方法,所以会写相关的IDEA插件使IDEA识别。如果插件某些功能可以解决这个问题,也可以写插件,但是没有相关思路,有知道的同学可以告诉一下)

  • 写回答

9条回答 默认 最新

  • li.siyuan 2023-07-21 16:19
    关注
    获得1.35元问题酬金

    看得出来你很想解决这个问题,
    我记得maven是可以引入相关jar的,在编译阶段就引用的相关设置,而不需要从IDEA额外配置 java compiler, 反而显得臃肿
    这样的话 就不需要额外的添加配置了,

    至于,tools.jar 文件,我记得好像是1.8中带的,文中使用的jdk 是 17 ,可以考虑更换jdk 为 1.8

    maven配置示例(自行调整为 gradle 配置):

    <dependency>
        <groupId>com.sun</groupId>
        <artifactId>tools</artifactId>
        <version>1.8.0_202</version>
        <scope>system</scope>
        <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
    </dependency>
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 修改了问题 7月21日
  • 赞助了问题酬金15元 7月21日
  • 修改了问题 7月21日
  • 展开全部