加載jar包下面的resources目錄下的文件


 

  • 背景(如並不關心,可以直接跳至最后一項實現代碼):

現在這個項目會調用一個遠程的webservice叫做NP,但是一直都沒有准備好提供給我們用,我們的web application又需要繼續開發。於是我們使用了dreamhead所寫的moco,為我們模擬遠程的NP。Moco做的事情是啟動一個服務,監聽某已配置端口,接收到一個request后,判斷這個請求然后返回相應的response。

Moco提供了兩種方式來配置。一種是使用Plugin,通過Json文件配置request和response,運行web application前啟動好moco的server,就可以工作了。另一種是內嵌的moco,將moco引入在java代碼中啟動和配置,這種方式不需要運行項目前啟動moco的server。

我們發送的request是xml格式的,期望得到的response也是xml格式的,於是我們定義了許多期望得到的xml文件,配置moco通過判斷request返回對應的response。

問題:moco不是引入在webapp的module下面的,而是一個叫service的module,且這些response的xml都放在service這個目錄下面的resources目錄中。moco有兩個方法可以返回兩種類型,一個是方法是file,需要參數是路徑(相對和絕對都可以);另一個是方法text,需要的參數是string。可以希望能在代碼中加載到用於response的xml的文件。

 

  • 項目目錄結構:
    +---qdem
    |    |
    |    +---qdem-jetty
    |    +---qdem-services
    |    |     |
    |    |     +---src
    | | | |
    | | | +---com.qing | |
    +---resources
    | | |
    | | ---response1.xml |
    +---qdem-webapp | +---qdem-tests

     

  • 打包后的項目結構:

Maven在將webapp打包成war包的時候,將qdem-services打成了一個jar包,提供給webapp使用,由於moco是在這個jar包中被使用,所以只列出qdem-services這個jar包的目錄結構。

qdem-services.jar
|
|---resonces1.xml
|---+---com.qing

 

  • 加載resource目錄下文件的方法:

當在配置Moco的response的時候,使用file方法傳入xml的相對路徑,即resources下文件的路徑,但是單元測試能通過,但在在打完war包后,就找不到response1.xml文件了。所以這個方法是不成功的。

所以我們只有使用text方法,傳入response.xml的string。可以使用class的ClassLoader去加載在resources目錄下的文件。再將加載的文件轉換為string。

我的Moco的配置在類MocoHttpEndPoint

// file("response1.xml"); //does not work

InputStream inputStream = MocoHttpEndPoint.class.getClassLoader().getResourceAsStream("response1.xml"); String value = IOUtils.toString(inputSteam, "UTF-8");
text(value);

 IOUtils是commons-io包的方法,在maven中,添加了如下依賴:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM