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:关于资源和模块的混乱规则的主要内容,如果未能解决你的问题,请参考以下文章