2017-06-27 23 views
0

首先:對不起,但我真的不知道如何清除問題。Maven + Spring:使用彈簧自動裝配模塊的資源

我有一個maven項目中有幾個模塊。 所有模塊都非常簡單,因爲它們爲主Web-App模塊提供了一些特殊的邏輯類。 這些邏輯類是在春季運行時注入的。

以下是我的Maven設置(抽象爲簡單起見)

  • 芯模塊(提供用於所有模塊的接口和基本類)
  • 算法模塊(其提供特殊的算法模塊,實現一個代碼 - 模塊接口)
  • web應用程序模塊(彈簧Web應用程序,它使用它們自己註冊爲@Component算法,依賴於核心和算法模塊)

現在的問題: 算法模塊有一個資源 - 在這種情況下是一個python腳本 - 我想要在系統Python解釋器上執行。 (資源/ pythonscript.py)

所有可用的算法類(實現公制接口)是由春到網絡應用程序控制器注入:

@Autowired 
List<Metric> metrics; 

之後,用戶選擇他想要執行的算法:

metric.performCalculations(dataset); 

此執行,後來嘗試運行從模塊的資源目錄的python腳本邏輯:

URL url = NXBetweennessCentrality.class.getResource("bc/betweenness_centrality.py"); 
logger.debug("URL: {}", url); //=> null 

我試圖sevaral組合:

class.getResourceAsStream(resourcePath) 
class.getClassLoader().getResources("") 

基本上一切從How do I load a file from resource folder?但我不能加載該資源。

當我嘗試訪問maven dependencys項目的資源時(Use a dependency's resources?),我聽說有問題,但在我的情況下,我從擁有該資源的包中執行類 - 所以應該沒有問題,至少這就是我思想。

有人可以指出我的錯誤嗎?沒有一些棘手的解決方法,這是不可能的?

回答

0

如果您運行類獨立,那麼它應該工作。否則,如果你使用war作爲webapp運行,那麼你的資源也應該被捆綁在你的戰爭中。由於您有多個模塊,因此您可能會將包含python資源的模塊打包爲JAR,並且可能已將該依賴添加到webapp模塊。此時,呈現JAR模塊的資源不會被捆綁在戰爭中。

+0

那麼唯一的解決方案是在構建過程中將資源從依賴項重新打包到web-app模塊中? (喜歡在我鏈接到的線程?) – bigbasti

+0

是的。要麼嘗試使用一些彙編插件。否則將Python腳本保存在Web應用程序運行的服務器中的公共位置,並通過在VM參數中傳入Python腳本的位置來加載它運行時 – codespawner

0

例如:

a.b.c.NXBetweennessCentrality.class.getResource("");

這意味着NXBetweennessCentrality裝箱率
WEB-INF /班/ A/B/C

在你的代碼的網址

是空

URL url =a.b.c.NXBetweennessCentrality.class.getResource("bc/betweenness_centrality.py");

意味着
WEB-INF /班/ A/B/C/BC/betweenness_centrality.py

如果下資源的PY文件

你可以嘗試根「/在Web應用程序「路徑

getResource("/bc/betweenness_centrality.py");

糾正我,如果我錯了,thx。

+0

根路徑不會查看包內部,而是位於您的hdd根目錄中(但我無論如何測試它) 該腳本像你在target \ classes \ bc中提到的那樣(但不是在web模塊中,所以不是在WEB-INF中) – bigbasti

0

所以我設法使其使用maven的腳本https://stackoverflow.com/a/6448530/760952

現在從所有子模塊的所有資源都複製到web應用程序資源目錄包裝戰前工作。

這對我來說是好的,因爲所有模塊都可以保留自己的資源,並且在添加新資源或新模塊時不需要進行任何配置。