2014-01-23 63 views
14

在我的一個項目中,我有資源存儲在/src/test/resources(典型的maven目錄結構)中。這些資源正在被存儲在項目中的工具類使用。如何訪問多個項目中的常見資源文件

實用程序類本身正在從其他項目中使用(其他項目依賴於此項)。我將訪問資源這樣的:

final InputStream inputStreamDobs = 
    ClassLoader.class.getResourceAsStream("/dbunit/clear_db.xml"); 

,但因爲我用它來自不同項目的路徑是不正確的 - 它是相對於current project that is being built/tested,而不是一個地方的工具類和資源。

任何想法如何處理這個?

我需要避免絕對路徑 - 想要有一種方法來定義相對於工具類的路徑。

我也不想在多個項目上覆制資源。乾杯。

編輯: 爲了給出一個方面,我有一個需要集成測試(清晰而完整的數據庫架構)之後被清除XML文件表的定義。集成測試位於多個項目中,但清晰腳本和資源文件對於所有這些文件都是相同的,並且位於共同的父項目中。

EDIT2:

獎金的問題:我想訪問常用的DTD文件(姑且稱之爲tables.dtd)需要從多個其他項目的XML文件訪問。 (它將坐在共同的父項目中)。

目前我有它複製到多個項目,我用指令是指從XML:

<!DOCTYPE dataset SYSTEM "src/test/resources/dbunit/dobs.dtd"> 

如何把它指向在不同的項目中的文件?

回答

6

你寫

......但因爲我用它來自不同項目的路徑是不正確的 - 它是相對於正在生成/測試當前的項目,而不是一個地方的工具類和資源是 ...

相對路徑在這裏不是問題。您在示例中使用了絕對路徑,但即使您使用相對路徑,也會引用包或目錄結構。只要類路徑正確,getResourceAsStream就會選擇它們。真正的問題是您在另一個項目中提到測試資源。但是測試資源和類不包含在項目工件中,因此它們不能從包含這個作爲依賴項的模塊訪問。如果您需要這些資源用於多個項目的測試,我建議您使用src/main/resources中包含的這些資源創建一個新項目(讓我們假設爲「projectxyz-testresources」),並將其添加爲相關範圍「test」的相關項。

編輯補充:

如果你不想使用測試資源的一個單獨的項目,你可以創建一個測試-JAR使用目標jar:test-jar含測試類和資源,包括這個作爲測試依賴。您可能需要在您的pom中配置jar插件以在常規構建中執行此目標。

+0

怎麼回事?我使用相對路徑..它是相對於項目根。 (?) – FazoM

+0

getResourceAsStream嘗試從classpath加載資源。這是絕對的,因爲它開始在每個類路徑條目的根目錄搜索。相對路徑不會以斜槓開始,並會相對於當前包進行搜索。所以你的文件系統的路徑並不是絕對的,但在Java意義上是絕對的。 – Drunix

+0

好的。很公平 – FazoM

6

您的運行時類路徑不應引用src/test/resources。 Maven會將所有內容複製到目標中,因此您應該可以通過「/dbunit/clear_db.xml」得到它。

+0

沒錯,我的複製粘貼錯誤。問題仍然有效。 – FazoM

+1

絕對路徑對於類路徑根是「絕對」的。所以如果你把它放在一個jar或者一個爆炸目錄中,它將通過classpath找到,而不是磁盤上的任何特定位置。所以只要你的類路徑是正確的,那麼這個路徑在每個安裝中都是可移植的。 – evanchooly

+0

但是classpath對於不同的項目是不同的,對吧? (我有豐富的Maven模塊層次結構) – FazoM

3

在這種情況下,我會建議爲此任務編寫一個maven插件,以便這樣可變的路徑可以通過屬性進行配置。 您還將從項目對象中受益。

/** 
* Location of the file. 
*/ 
@Parameter(defaultValue = "${basedir}/src/main/java", property = "sourceFolder", required = true) 
private File sourceFolder; 

@Parameter(defaultValue = "${basedir}/src/test/java", property = "testFolder", required = true) 
private File testFolder; 

@Parameter(defaultValue = "${project}", property = "project", readonly = true, required = true) 
private MavenProject project; 
+0

我會嘗試這個(大概在週末之後),並會給你一個更新,但我認爲它可能工作。謝謝! – FazoM

+0

@Hannes - 您的應用程序不應該知道用於構建它的構建工具或該工具所需的文件夾結構。如果你想使用另一個不屬於你的代碼庫的項目的資源,或者不使用Maven的佈局呢? Java的類路徑可以爲您做到這一點,而無需瞭解項目佈局。 – SergeyB

+0

@ike_love請原諒?我無法跟隨你的想法。 – Hannes

2

你可以嘗試使用Maven覆蓋?過去我們遇到了類似的情況,並且使用疊加層解決了很多問題。通常,覆蓋用於跨多個Web應用程序共享公共資源。這些方法的

2

也許有:

或者:你外包的XML文件和需要訪問它們放入一個單獨的庫中,然後可以包括到你的其他幾個項目的Java類(如公用事業類) (方便地作爲maven依賴)。或者:您將這些xml文件放入單獨的VCS樹或存儲庫中,並將其包含在項目樹中(例如,作爲SVN中的「外部」)。所以你可以在你的項目中單獨更新這個引用,但你只需要維護一個源文件。

3

您是否嘗試過使用「classpath:」前綴?如果資源在類路徑中可用,則不必指定資源的完整路徑。例如:

<mvc:resources location="classpath:/META-INF/web-resources/" mapping="/resources/**" /> 

/META-INF /網絡資源/來自Spring MVC的JAR這是該項目的一個依賴項。該項目不需要知道如何直接訪問該資源,而是使用類路徑。

3

我想你可以使用2個以下的插件來達到這個目的。 如果你的項目是web項目,你可以創建2個網絡項目,其中一個包含配置文件和另一個項目是主項目,現在開始,您可以覆蓋項目maven-war-plugin

有很多類型的疊加,就可以訪問此頁面瞭解更多信息 maven-war-plugin overlay

爲jar文件,你可以將它們合併到單一與maven-assembly-plugin

maven-assembly-plugin

3

我們也有類似的情況,其中,我們有一些配置文件用於大型多模塊maven項目中的多個模塊。 因此,我們所做的是將conf文件拆分爲一個單獨的模塊,它只是將配置文件打開。 然後無論哪個模塊需要這些文件都可以聲明對配置文件模塊的依賴關係,只需將jar文件與配置文件一起使用並解壓縮即可使用它們。 你可以爲測試資源做類似的事情。只用資源創建一個模塊,然後將它們放入相關路徑。

相關問題