在使用
java命令启动应用程序时,如下所示:-
java -p target/classes:target/dependency -m framework.core/com.framework.Main
您使用选项
-p
aternate 指定了模块路径,该选项--module-path
将查找模块的 目标/类 和 目标/依赖性 。另外,使用
-m
alternate for--module
指定 要 使用名称 解析 的 初始模块,framework.core
并使用主要类构造模块图以明确显示为com.framework.Main
。
现在,这里的问题似乎是模块
framework.core不
requires读取
playground.api模块,因此模块图不包括由实际资源组成的所需模块
config.yml。
如@Alan所建议的,在启动过程中列出模块分辨率输出的一个好方法是使用该
--show-module-resolution选项。
// to scan the module pathClassLoader.getSystemResources(resourceName)// if you know a class where the resource isClass.forName(className).getResourceAsStream(resourceName)// if you know the module containing the resourceModuleLayer.boot().findModule(moduleName).getResourceAsStream(resourceName)
请参阅下面的工作示例。
鉴于:
.├── frameworkCore│ └── src│ └── frameworkCore│├── com││ └── framework││ └── Main.java│└── module-info.java└── PlaygroundApi └── src └── PlaygroundApi ├── com │ └── playground │ └── api │ └── App.java ├── config.yml └── module-info.java
Main.java 可能
package com.framework;import java.io.*;import java.net.URL;import java.util.Optional;import java.util.stream.Collectors;public class Main { public static void main( String[] args ) { // load from anywhere in the modulepath try { URL url = ClassLoader.getSystemResources("config.yml").nextElement(); InputStream is = url.openStream(); Main.read(is); } catch (IOException e) { throw new RuntimeException(e); } // load from the the module where a given class is try { InputStream is = Class.forName("com.playground.api.App").getResourceAsStream("/config.yml"); Main.read(is); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } // load from a specific module Optional<Module> specificModule = ModuleLayer.boot().findModule("PlaygroundApi"); specificModule.ifPresent(module -> { try { InputStream is = module.getResourceAsStream("config.yml"); Main.read(is); } catch (Exception e) { throw new RuntimeException(e); } }); } private static void read(InputStream is) { String s = new BufferedReader(new InputStreamReader(is)).lines().collect(Collectors.joining("n")); System.out.println("config.yml: " + s); }}
然后您将启动
java --module-path ./frameworkCore/target/classes:./PlaygroundApi/target/classes --add-modules frameworkCore,PlaygroundApi com.framework.Main
要克隆此示例: git clone https://github.com/j4n0/SO-46861589.git
我只是天真地尝试打开src / main / resources,不编译ofc
由于模块中的资源位于根级别,因此
不会被封装 ,也不需要打开或导出到任何其他模块。
在您的情况下,您只需要确保模块
playground.api结束在模块图中即可,然后应用程序即可访问该资源。要指定除初始模块之外的要解析的根模块,您可以使用该
--add-modules选项。
因此,为您工作并进行一些调试的总体解决方案是:
java --module-path target/classes:target/dependency --module framework.core/com.framework.Main --add-modules playground.api --show-module-resolution
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)