如何使用其他maven模块的资源?我的目标是在特定的maven模块中提供AbstractImportClass
以及要导入的文件。并在扩展此类的其他模块中使用此模块。
我们说ModuleA
包含src/main/java/MyAbstractImportClass.java
和src/main/resources/MyImport.csv
我现在想在ModuleB
中使用抽象导入类。或者更确切地说,我将扩展它,使用abstract-fileimport和一些自定义函数。
然后ModuleC
也使用摘要的导入和一些自定义函数。
问题是:抽象类中的导入与reader
和InputStream
一起使用。当我执行ModuleA时,一切都很好。
但是当我尝试通过maven pom包含模块,然后扩展模块以调用导入时,我会在使用阅读器的行上获得NullPointerException
。
很明显我不能以这种方式使用外部模块资源。
但我怎么能反过来呢?
更新
模块A:
src/main/java/path/to/MyClassA.java
src/main/resources/path/to/test.txt
abstract class MyClassA {
public static String TESTFILE = test.txt;
List<String> doImport(String filename) {
InputStream fileStream = resourceClass.getResourceAsStream(filename);
//some precessing
return list;
}
}
模块B:
src/main/java/path/to/MyClassB.java
class MyClassB implements MyClassA {
List<String> list = doImport(TESTFILE);
}
如果我将MyClassB放在与A相同的目录中,那么一切正常。 如果我在自己的模块中构建B,我会为InputStream获取NullPointer,这意味着找不到该文件。
答案 0 :(得分:0)
您的代码所做的并不完全清楚。你能提供你如何阅读资源的样本吗?如果你正确地做 - 通过从类路径中的资源文件获取InputStream应该没有问题。您可以先检查ModuleA.jar是否包含您的资源文件。
答案 1 :(得分:0)
你应该检查:
如果这两个条件令人满意,你的程序应该有效。
答案 2 :(得分:0)
我认为你的问题根本不与Maven有关。 Class.getResourceAsStream()将相对路径解析为相对于您调用它的类对象。因此,如果在抽象类中使用该方法,则它的每个子类都可以在不同的位置查找资源。
例如,给定三个类:
超级:
package com.foo;
public class Super {
{ System.out.println(getClass().getResourceAsStream("test.properties")); }
}
Sub1,Super的子类:
package com.foo.bar;
import com.foo.Super;
public class Sub1 extends Super {}
Sub2,另一个子类:
package com.foo.bar.baz;
import com.foo.Super;
public class Sub2 extends Super {}
如果您创建一个Super,它将查找类路径资源“/com/foo/test.properties”,因为这是路径“test.properties”相对于类com.foo.Super解析的方式。如果您创建一个Sub1,它将显示在“/com/foo/bar/test.properties”中,而对于Sub2实例,它将查看“/com/foo/bar/baz/test.properties”
您可能希望使用资源的绝对路径而不是相对路径,或者让子类指定相对于自身的路径。这取决于你的设计以及你想要实现的抽象类型。