[英]Loading resource file from external module using Class
我在尝试从外部模块的资源文件夹加载资源文件时遇到困难。 我正在使用 IntelliJ,我们的项目是使用 Maven 构建的。
使用模块之前的原始代码是这样的:
getClass().getResourceAsStream(rulesFile)
这现在导致null
结果。
模块的结构如下:
client
- java
- org.example.client
- Controller.java
data
- java
- ...
- resources
- org.example.data.files
- rulesFile
在模块client
:
getClass().getResourceAsStream(rulesFile)
不起作用。
但是,如果我尝试执行ModuleLayer.boot().findModule("data").get().getResourceAsStream(rulesFile)
,那么它工作正常。
我的问题是,是否可以使rulesFile
对client
模块内的Controller.java
可见,以便可以使用普通的类加载器? 我想避免必须明确指定它来自的模块名称,因为在其他地方使用了从data
模块加载文件的类似代码。
我有哪些选项可以避免显式给出模块名称?
我尝试将以下内容添加到data
模块文件中,但没有成功:
opens org.example.data.files to client
谢谢您的帮助!
http://maven.apache.org/pom.html#Resources
在您的客户端模块 pom.xml 中添加:
<project>
...
<build>
...
<resources>
<resource>
<directory>../data/src/main/resources/org/example/data/files</directory>
<includes>
<include>rulesFile</include>
</includes>
</resource>
</resources>
</build>
</project>
模块的结构如下:
client
- java
- org.example.client
- Controller.java
data
- java
- Data.java
- resources
- org.example.data.files
- rulesFile
就目前而言,也许不是最完美的解决方案,但似乎可以从加载data
模块从工作时, Class
里面data
模块。
同样重要的是要注意我也打开了client
模块的data
资源文件夹。
而不是尝试类似的东西:
Controller.class.getResourceAsStream(rulesFile)
如果你这样做:
Data.class.getResourceAsStream(rulesFile)
它有效,这是因为Data.java
位于data
模块内,而rulesFile
驻留在该模块中。
在 Java .ear
类型的包工件中,这也会发生在您需要一个模块的类路径以包含另一个模块的地方。 在这种情况下,将必要的模块标记为“想要”模块中的依赖项应该将其合并到“想要”的类路径中。 具体来说,这发生在需要访问ejbs
in a ear
wars
中。
您只需通过工件名称将模块添加到“想要”模块的pom.xml
的依赖项部分:
<dependencies>
<dependency>
<artifactId>data</artifactId>
</dependency>
</dependencies
工件的其他属性由您在 Maven 中的父 pom 推断,因此您无需提及version
或groupId
。 Scope 可以被引用为runtime
但我认为这可能是默认值。
如果一切顺利,您应该可以只执行getClass().getResourceAsStream(rulesFile)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.