java - java 9模块列出jar的所有文件
问题描述
我想在 java 9 的一个模块中列出给定包的所有文件。
我正在使用此代码来完成任务(我还尝试了不同的方法来获取类加载器):
String packageName= io.packageToBeScanned.AnyClass.class.getPackageName();
String packageNameToUri= packageToUri(packageName);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//ClassLoader classLoader = ClassLoader.getPlatformClassLoader();
//ClassLoader classLoader = ClassLoader.getSystemClassLoader();
//ClassLoader classLoader = getClass().getClassLoader();
//ClassLoader classLoader = getClass().getModule().getClassLoader();
Enumeration<URL> resources = classLoader.getResources(packageNameToUri);
while(resources.hasMoreElements()){
URL resource = resources.nextElement();
File f = new File(resource.getFile());
...
}
一切都很好,但是当我添加模块信息文件时,没有任何效果。
当我运行 junit 测试(在 src/test/jata 中)时,它仅在模块信息不存在时正确扫描 src/main/java/io/packageToBeScanned 下的包。
我试图打开模块,但没有成功。我也试过打开包裹:没有成功。或者打开包来moduleName
:没有成功。
module moduleName {
exports io.packageToBeScanned;
}
我知道模块被认为是一种从外部隐藏包的方法,但我想扫描的是库本身!我没主意了...
谢谢你。
- 更新 -
我看到如果我运行一个junit,
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.2</version>
</dependency>
然后发生错误。相反,如果我在 a 中运行代码,public static void main(String[] args)
则不会发生错误...
没有模块信息的打印resource.getFile()
会导致
/target/test-classes/io/packageToBeScanned
/target/classes/io/packageToBeScanned
相反,使用模块信息,
/target/test-classes/io/packageToBeScanned/
/target/test-classes/io/packageToBeScanned
它不关心扫描的包是否包含私有、包私有或公共类。
解决方案
推荐阅读
- java - 使用 Gson Response.body() 进行改造不起作用
- laravel - 查询最近的关系,创建帐户的时间
- java - 如何在 Java 中解析 DialogFlow 日期(@sys.time-period)
- domain-driven-design - 创建过程复杂的 DDD 实体
- jquery - Laravel - JQuery 下拉显示未按预期工作
- node.js - 谷歌(Firebase)函数响应为 static.js
- css - 封面图像在不同屏幕尺寸上调整大小 - 一个问题
- swift - 带圆角的 CALayer 显示黑色或外来内容
- c# - C# bruteforce 应用程序在调试时不打印任何内容,并在密码长度超过 1 个字母时终止
- sparql - SPARQL:将带有命名图的 CONSTRUCT 查询转换为 SELECT 查询