Maven使用其他模块的资源?

时间:2012-05-24 18:36:08

标签: java maven

如何使用其他maven模块的资源?我的目标是在特定的maven模块中提供AbstractImportClass以及要导入的文件。并在扩展此类的其他模块中使用此模块。

我们说ModuleA包含src/main/java/MyAbstractImportClass.javasrc/main/resources/MyImport.csv

我现在想在ModuleB中使用抽象导入类。或者更确切地说,我将扩展它,使用abstract-fileimport和一些自定义函数。 然后ModuleC也使用摘要的导入和一些自定义函数。

问题是:抽象类中的导入与readerInputStream一起使用。当我执行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,这意味着找不到该文件。

3 个答案:

答案 0 :(得分:0)

您的代码所做的并不完全清楚。你能提供你如何阅读资源的样本吗?如果你正确地做 - 通过从类路径中的资源文件获取InputStream应该没有问题。您可以先检查ModuleA.jar是否包含您的资源文件。

答案 1 :(得分:0)

你应该检查:

  1. 模块B依赖于pom.xml中的模块A
  2. 传入的'filename'参数以'/'开头,也就是说'filename'参数是'/path/to/test.txt'而不是'path / to / test.txt'< / LI>

    如果这两个条件令人满意,你的程序应该有效。

答案 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”

您可能希望使用资源的绝对路径而不是相对路径,或者让子类指定相对于自身的路径。这取决于你的设计以及你想要实现的抽象类型。