到目前为止,直到未模块化的Java,您只需将文件放入src/main/java/resources
以确保它位于类路径中,然后使用
file = getClass().getClassLoader().getResourceAsStream("myfilename");
从classpath的几乎任何地方开始。
现在有了模块,地块变厚了。
我的项目设置如下:
module playground.api {
requires java.base;
requires java.logging;
requires framework.core;
}
配置文件放在里面src/main/resources/config.yml
。
项目运行于
java -p target/classes:target/dependency -m framework.core/com.framework.Main
由于主类不是位于我自己的项目中,而是位于外部框架模块中,因此看不到config.yml
。现在的问题是,是否有办法以某种方式将我的配置文件放入模块或打开它?我是否必须更改框架上游加载文件的方式?
我尝试在module-info中使用“ exports”或“ opens”,但它想要一个程序包名称,而不是文件夹名称。
如何以最佳实践的方式实现此目标,使其在Java 8中正常工作,并且所做的改动尽可能小?
在使用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 path
ClassLoader.getSystemResources(resourceName)
// if you know a class where the resource is
Class.forName(className).getResourceAsStream(resourceName)
// if you know the module containing the resource
ModuleLayer.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
我的项目设置如下: 配置文件放在中。 运行项目时使用 如何以最佳实用的方式实现这一点,使它能够像在Java8中一样工作,并且尽可能少的改动?
ServletContext接口定义了三个方法来访问当前Web应用程序的资源文件,这三个方法如下: l getResourcePaths方法 该方法返回指定Web应用程序目录中的所有子目录和文件,这些返回的目录文件不包括嵌套目录和文件。这些返回的子目录和文件都封装在该方法返回的一个Set对象中。getResourcePaths方法的定义如下: public Set getResourcePaths
我正在尝试实现动态交付类型的APP。首先,我在create模块之后创建新项目,用于此动态步骤 我的crate类和想要访问资源文件夹的使用布局,可绘制文件夹。 在主模块级实现 实现'com.google.android.play:core:1.2.0'和dynamicFeatures=[“:Dynamic_Feature”] 错误:找不到符号变量activity_main 错误:找不到符号变量iv_
Generators 相关文章 The Basics Of ES6 Generators By Kyle Simpson ES6 generators in depth By Axel Rauschmayer redux-saga 相关文章 Redux nowadays : From actions creators to sagas By Riad Benguella Managing Side
全局配置 在 nuxt.config.js 中配置你想引用的资源文件: module.exports = { head: { script: [ { src: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js' } ], link: [ { rel: 'style
问题内容: 我可以像这样使用Javascript访问PHP变量: 但是,如果我想使用外部JS文件怎么办: externaljs.js: 问题答案: 您实际上并没有访问它,而是在为页面提供服务时将其插入到javascript代码中。 但是,如果您的其他JavaScript并非来自外部来源,则可以执行以下操作: 然后在file.js中使用如下颜色: