Classloader +模块=测试头疼

问题描述 投票:1回答:2

我该怎么做才能使API中的类对Core中的ClassLoader代码可见?

核心:

module Core { //requires nothing relevant... org.json, commons.math3 exports Core.foo; }

API:

module API { requires Core; exports API.bar; }

API:

module APIs { requires transitive Core; requires transitive API; exports APIs.baz; }

API调用一个Core函数,该函数试图通过Class.forName("API.bar.someClass")从名称中获取类的名称,并立即引发ClassNotFound异常。请注意,API.bar确实已导出。

我已经尝试了很多事情,例如:

    也宣告(已经导出的)软件包对Core也是开放的。
  • 将上面列出的所有模块标记为open module
  • dependencies { testRuntimeOnly project(':API') }添加到Core的build.gradle文件中。
    • 有趣的是,runtime project(':API')引起了循环依赖性。
  • 摘掉一大把头发
  • 任何人都可以解释造成这种混乱的原因吗?显然,这是类路径/模块路径的问题,但我的印象是,传递和导出应处理所有这些问题,并且所有这些jar文件都是运行在具有共享模块路径的同一个java.exe会话中...所以没问题吧?显然不是。

    此混乱的解决方案是什么?

    我有三个模块,可以将它们称为“核心”,“ API”和“ API”。我需要怎么做才能使API中的类对Core中的ClassLoader代码可见?核心:模块核心{//不需要任何相关内容。...
  • java gradle intellij-idea java-module jigsaw
    2个回答
    0
    投票
    如果没有更多详细信息和/或示例代码,很难说出您要面对的确切问题。我已尝试根据问题中的描述创建一个最小的完整示例项目,并且在构建和运行该应用程序时没有任何问题。希望这个示例项目可以帮助您走上正确的轨道。

    0
    投票
    据我所知,依赖性仅在树下:API需要API,需要Core。
    © www.soinside.com 2019 - 2024. All rights reserved.