You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

错误含义解析

  1. IllegalAccessError本质:这是Java的访问权限异常,说明Clojure代码尝试访问一个它没有权限访问的Java类。
  2. 关于"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:42:48