2012-05-24 44 views
0

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

比方说ModuleA包含src/main/java/MyAbstractImportClass.javasrc/main/resources/MyImport.csv

我现在想用抽象进口类ModuleB。或者说,我会扩展它,使用abstract-fileimport和一些自定义函数。 Then 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,这意味着找不到文件。

回答

0

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

例如,给定三个类:

超级:

package com.foo; 
public class Super { 
    { System.out.println(getClass().getResourceAsStream("test.properties")); } 
} 

Sub1的,超类的子类:

package com.foo.bar; 
import com.foo.Super; 
public class Sub1 extends Super {} 

分公司2,另一亚类中:

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” 。

您可能希望使用资源的绝对路径而不是相对路径,或者让子类指定相对于自己的路径。这取决于你的设计和你试图达到的抽象类型。

+0

好吧,我的绝对路径是:'de/my/path/to/Super/test.properties'?或开始'/ de/my ...'?如果Super类可以获取包含在其相应资源/路径/到/文件夹中的文件,那么这将是足够的抽象。 – membersound

+1

可能是以“/ resource”开头的/或相对路径的完整路径 – maximdim

+0

是的,绝对类路径路径以“/”开头。如果你想使用Super的相对路径,只要确保使用'Super.class.getResourceAsStream()'而不是'getClass()。getResourceAsStream()'。后者是多态的,前者不是。 –

0

这并不完全清楚你的代码是干什么的。你能否提供你如何阅读资源的范例?如果你做得很好 - 通过从类路径中的资源文件获取InputStream,应该没有问题。你可以先检查ModuleA.jar是否有你的资源文件。

+0

更新以上用一些pseude代码。我也认为这不应该有问题,但是有obv。我甚至不知道我是否可以这样做。 – membersound

+0

可能是以/ resource开头的绝对路径,或者是以“resourceClass”的位置开始的相对路径。 – maximdim

0

您应该检查:

  1. 模块B依赖于模块A在pom.xml中
  2. 在“文件名”参数的传递开始于一个“/”,也就是说,在“文件名”参数是'/path/to/test.txt'而不是'path/to/test.txt'

如果这两个条件满足,你的程序应该可以工作。

相关问题