3

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

假设ModuleAcontainssrc/main/java/MyAbstractImportClass.javasrc/main/resources/MyImport.csv

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

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

4

3 回答 3

0

You should check:

  1. Module B depend on Module A in pom.xml
  2. The passed in 'filename' parameter starts with a '/', that is to say, the 'filename' parameter is '/path/to/test.txt' other than 'path/to/test.txt'

You program should work if these two conditions is satisfield.

于 2012-05-25T03:28:17.383 回答
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”中查找.

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

于 2012-05-25T03:33:52.267 回答
0

目前尚不清楚您的代码的作用。您能否提供您如何阅读资源的示例?如果你做得正确 - 通过从类路径中的资源文件获取 InputStream 应该没有问题。您可以首先检查 ModuleA.jar 中是否包含您的资源文件。

于 2012-05-24T19:51:50.297 回答