Leiningen项目集成Java代码报错:IllegalAccessError原因及解决
Java与Clojure跨加载器访问权限问题解析
问题描述
现有Java源文件src/main/java/ModelLoader.java,内容如下:
package main; class ModelLoader { public static void foo() { System.out.println("foo"); } }
在Leiningen的project.clj中配置了:java-source-paths ["src/main"],编译正常,生成了target/classes/main/ModelLoader.class。
在Clojure文件core.clj中导入该类并调用方法:
(ns learnopengl.core (:import [main ModelLoader])) ... (ModelLoader/foo)
运行时抛出错误:
Execution error (IllegalAccessError) at learnopengl.core/eval490 (core.clj:20). failed to access class ModelLoader from class learnopengl.core$eval490 (ModelLoader is in unnamed module of loader 'app'; learnopengl.core$eval490 is in unnamed module of loader clojure.lang.DynamicClassLoader @4228bf58)
错误含义解析
- IllegalAccessError本质:这是Java的访问权限异常,说明Clojure代码尝试访问一个它没有权限访问的Java类。
- 关于"in unnamed module of loader":
Java 9及以后引入了模块系统,没有定义module-info.java的代码会被归类到**未命名模块(unnamed module)**中。
这里的两个类分别属于不同加载器的未命名模块:ModelLoader由名为app的类加载器加载,属于它的未命名模块- Clojure编译生成的
learnopengl.core$eval490由Clojure专属的DynamicClassLoader加载,属于另一个未命名模块
你的ModelLoader类没有添加public修饰符,属于包级访问权限——这种权限仅允许同包内、由同一个类加载器加载的类访问。跨加载器的未命名模块之间,无法访问对方的包级权限类,因此触发了这个异常。
修复方案
只需给ModelLoader类添加public修饰符,将其改为公共类,这样跨模块、跨加载器的代码就能正常访问:
package main; public class ModelLoader { public static void foo() { System.out.println("foo"); } }
修改后重新编译Java代码,再运行Clojure程序即可解决问题。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

