使用mvn exec:java从另一个maven模块加载资源;行不通

使用mvn exec:java从另一个maven模块加载资源;行不通,java,maven,Java,Maven,我有一个maven项目,其结构如下: parent -----module1 --------src ------------main -----------------java ----------------------Loader.java -----------------resources -------------------------file1.txt -----module2 --------src ------------main -----------------java

我有一个maven项目,其结构如下:

parent
-----module1
--------src
------------main
-----------------java
----------------------Loader.java
-----------------resources
-------------------------file1.txt
-----module2
--------src
------------main
-----------------java
-------------------------CallLoader.java
所以
Loader.java
,加载
files1.txt
。我从module2的
CallLoader.java
调用这个类。这是我使用的代码

Loader.java

private static File getResourceFile(String fileName){
        try {
            URL resource = GraphUtil.class.getClassLoader().getResource(fileName);
            return new File(resource.getPath());
        } catch (Throwable e) {
            throw new RuntimeException("Couldn't load resource: "+fileName, e);
        }
}
其中
fileName=“file1.txt”

我收到一个错误,因为文件绝对路径如下所示:

file:/home/moha/.m2/repository/my/package/name/%7Bproject.version%7D/base-%7Bproject.version%7D.jar!/file1.txt

我到底做错了什么?

将文件内容改为流,以便能够从jar文件中读取资源,而jar文件是问题的根本原因。换句话说,使用
getResourceAsStream
而不是
getResource

您还可以返回
URL
而不是
文件
,然后在需要时调用
openStream()

NB1:
URL的类型为
jar:file/…
,不能由类
file


NB2:
要将
URL
转换为
文件
,正确的代码是
新文件(resource.toURI())

如果您需要在模块2中加载资源,为什么不将资源移动到模块2中,因为它听起来像是属于那里的…@khmarbaise module3使用相同的资源。我拒绝提及它,因为它超出了范围。听起来好像有一个建筑部门在那里@khmarbaise,我不确定我是否理解你,但我真的很想知道。请详细说明一下,一个资源应该在一个点上处理。因此,其他模块应该依赖于提供此信息的类,但其他类不应该自己加载资源。听起来像是违反了关注点的分离。因此,在您的示例中,只有一个类将真正加载资源(通过.getResourcesStream()),并在接口中提供它。其他类(模块)将仅使用该接口…否则您将编写代码以加载资源数次(违反DRY)。。。