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