2014-03-27 31 views
1

我正在使用JBoss編寫應用程序服務器。該應用程序由Maven編譯並打包爲WAR。現在我想要將某些類進行外部化。我創建了另一個Maven項目,它被打包成JAR。將JAR文件添加到web-inf/lib文件夾中,但不將其包含在pom.xml中

我相信JAR具有正確的目錄樹。它包含一個META-INF目錄和作爲目錄的包結構,類文件位於該目錄中。

我在網上閱讀到,我可以將這個JAR添加到應用服務器中,方法是將其放入src\main\webapp\WEB-INF\lib,而不必在應用服務器的pom.xml中進一步提及它(在某些時候,這些JAR應該是插件,因此添加依賴項在pom.xml中不是一個選項)。

當我編譯服務器時,JAR會被正確複製到WEB-INF\lib下的WAR以及其他外部依賴項。但是,當我嘗試在應用程序服務器中使用這個類時(寫一個import這樣的類的聲明就夠了),maven會抱怨它找不到這個類。

我試圖在網上找到信息,但我能找到的就是這是它要完成的方式。

有誰知道我可以進一步尋找線索哪裏出了問題?

回答

3

將jar文件放入src\main\webapp\WEB-INF\lib很麻煩,而且顯然是錯誤的。

代碼不編譯的原因是maven編譯器插件使用定義的源路徑和(提供的和編譯範圍的)依賴關係。

你可以改變這一點,但結果很難理解。此外,你將不得不手動更新你的jar文件(其中,BTW在源代碼中沒有位置)。

這就是什麼依賴管理。

不要對你的工具工作。如果你的項目需要這個jar包的類,它就是一個依賴項。所以這樣宣佈。

+0

這只是有道理。然而,我該如何處理「插件」,即只需放在某個地方的類,而服務器只需要重新部署呢?你的答案是否意味着這樣做沒有「乾淨」的方式? – bobbel

+0

您可以將您的依賴項的範圍更改爲「提供」,以免它被打包到.war中 –

+0

如果我沒有錯,我認爲這是另一個問題。可能我想要一個自定義的ClassLoader,它可以通過自定義添加的jar來執行任何需要的操作。 – bobbel

1

如果你在談論「插件」,那麼你不應該直接在你的代碼中直接導入類。一種常見的方法是定義另一個模塊,其中包含插件將實現的接口,然後讓您的主Web應用程序和插件項目都依賴於此接口模塊。在主應用程序中,您通過反射來加載插件類並將它們投射到相應的接口。這樣,在編譯主機應用程序時,不會直接依賴插件的具體類。

+0

Ui沒關係,所以我首先提出了錯誤的問題,謝謝,這需要我進一步:D – bobbel

相關問題