2012-05-24 74 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'

如果這兩個條件滿足,你的程序應該可以工作。

相關問題