从外部模块访问资源文件

从外部模块访问资源文件,第1张

从外部模块访问资源文件

在使用

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4957800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存