gpt4 book ai didi

java - Maven 使用其他模块的资源?

转载 作者:行者123 更新时间:2023-12-01 05:18:57 25 4
gpt4 key购买 nike

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

假设ModuleA包含src/main/java/MyAbstractImportClass.javasrc/main/resources/MyImport.csv

我现在想在 ModuleB 中使用抽象导入类。或者更确切地说,我将扩展它,使用抽象文件导入和一些自定义函数。然后 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,这意味着找不到该文件。

最佳答案

我认为你的问题与 Maven 根本无关。 Class.getResourceAsStream()将相对路径解析为相对于您调用它的类对象的路径。因此,如果您在抽象类中使用该方法,则它的每个子类都可能在不同的位置查找资源。

例如,给定三个类:

super :

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”中查找.

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

关于java - Maven 使用其他模块的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10743342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com