首页 > 解决方案 > 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

它不关心扫描的包是否包含私有、包私有或公共类。

标签: javajava-9java-module

解决方案


推荐阅读