java 9:关于资源和模块的混乱规则

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 9:关于资源和模块的混乱规则相关的知识,希望对你有一定的参考价值。

在com.thing.withprops模块中,我在com.thing.withprops.UseProps.java中有这个代码:

 URL url =UseProps.class.getResource("config/values.properties") ;

module-info是

module com.thing.withprops { exports com.thing.withprops;}

现在有另一个名为com.thing.withprops.config的模块,其中位于目录com / thing / withprops / config /中的values.properties文件,module-info就是这样的:

module com.thing.withprops.config{}

好吧,当一切都震撼和执行时,所有工作都完美无缺:找到了资源!我感到困惑,因为似乎该文档说不应该找到它,因为它是在另一个未导出或打开的模块中。那有什么不对?我理解doc(我不是母语)或我的代码的方式?

谢谢你的暗示

答案

实际上存在两个问题:一个是关于处理资源而另一个是关于java -jar行为

这里是关于如何处理模块化项目中的资源的建议:

public interface ResourceLoader {
public static Optional<URL> resourceSearch(Class clazz, String name) {
    String fullPath = name ;
    if(! name.startsWith("/")) {
        String packageName = clazz.getPackageName();
        fullPath = '/'+packageName.replace('.','/')+ '/' + name;
    }

    ServiceLoader<ResourceLoader> loader = ServiceLoader.load(ResourceLoader.class);
    for(ResourceLoader resourceLoader: loader) {
        Optional<URL>  anUrl =resourceLoader.getResource(fullPath);
        if(anUrl.isPresent()) {
            return anUrl ;
        }
    }
    return Optional.empty() ;
}

public static Optional<InputStream>  resourceSearchAsStream(Class clazz, String name) throws IOException {
    Optional<URL> anURL = resourceSearch(clazz, name) ;
    if(anURL.isPresent()){
        InputStream is = anURL.get().openStream() ;
        return Optional.of(is) ;
    }
     return Optional.empty() ;
}

public default Optional<URL> getResource(String fullPath) {
    Class localClass = this.getClass() ;
    URL res = localClass.getResource(fullPath) ;
    return Optional.ofNullable(res) ;
}

}

然后可以使用模块信息部署另一个模块,例如:

open module com.thing.withprops.config {
requires com.thing.withprops;
provides com.thing.withprops.utils.ResourceLoader with com.thing.withprops.spi.ResourceLoaderImpl ;

}

还有其他建议吗? (仍然试图找到一种方法来看起来像一个“可点击”的罐子......但可能是没有希望的)

以上是关于java 9:关于资源和模块的混乱规则的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# Java | 关于synchronized相关理解

关于Java 9模块化的10本书,每位Java开发人员必读

关于intellij的Java 9迁移问题与模块系统有关

9 个Java 异常处理的规则!

9款自动化构建打包工具

混乱的jvm