2015-11-05 67 views
1

我正在Eclipse中使用動態Web項目,並且正在計劃使用JavaScript單頁應用程序前端的Java JAX-RS RESTful後端, Angular/Durandal/Aurelia風格的框架。就這一點而言,在Java世界中部署的典型方式是將東西捆綁爲一個WAR文件 - 它本質上是一個JAR文件。麻煩的是,包括node_modules在內的相當大的WAR文件的大小。另一方面,我可以在部署後執行'npm install'。但是,在我經常部署的開發機器上,這需要花費太多時間。我更喜歡我是否可以使用'npm install'模塊在Web服務器上準備安裝目錄,然後在其上部署WAR文件。麻煩的是,看起來WAR文件部署喜歡擦除文件夾,如果它們不包含在WAR文件中的話。帶有一堆npm包的Java War文件部署

我正在使用GlassFish 4.1應用程序服務器。對於我來說,理想的解決方案是通過修改MANIFEST.MF文件在WAR文件中'隱藏'目錄,以便在展開後隱藏的目錄不會被覆蓋。這對我的問題來說是最簡單的解決方案。但是,我知道沒有用於JAR/WAR文件清單的隱藏清單條目。

可能還有創造性的解決方案來使用'npm link'命令。歡迎任何建議。

也許這是由於其他原因,爲什麼一旦人們在客戶端開始使用npm,他們就開始關注節點並在服務器端進行表達。但是,我不相信他們不能一起玩,我想保留所有舊式開源Java庫的選項。

回答

2

如果您正在使用像Grunt這樣的nodejs構建工具(但可能不是),那麼它可能是佔用這麼多空間的devDependencies。如果是這樣,只需將您的運行時依賴關係從node_modules中複製出來即可。

如果不是:你不要來部署一個.war;你也可以部署一個'exploded'目錄。你可以只複製已更改的文件和touch .reload

+0

我會試試這個。問題的一部分是我正在同時從Windows遷移到Linux。 .NET到Java,ASP.NET到Aurelia,Web API到JAX-RS。樂趣。似乎我可以學會編寫一個小型bash腳本,它可以手動複製某些文件並觸摸.reload,並以某種方式將其掛接到Eclipse部署中。我猜的合理嗎? – rayoub

+1

是的,這是最快的('cp -ur target/webapp/path/to/applications/yourapp && touch/path/to/applications/.reload')。如果您使用Eclipse以外的任何構建工具,比如Maven或Ant,那麼這裏有選項。您也可以使用nodejs Grunt來複制文件;無論你最喜歡哪種語言。 – Kenney

1

我知道這個問題差不多兩年了,但也許有人仍然需要一個答案。

簡而言之,你需要綁定你的JavaScript。你應該從來沒有在戰爭中包裝你的node_modules文件夾,或者甚至直接部署到服務器。主要是因爲你遇到的問題。它不是最小的。

在前端開發中,您需要使用像webpack這樣的工具將所有JS文件收集到一個app.js文件中。這個過程只會將您直接使用requireimport的實際文件放在您自己的JavaScript文件(以及那些文件require等文件)中,而剩下的都不包含在內。對於本次討論最重要的是,將所有devDependencies

Webpack還會捆綁js以外的文件。導入你的css文件會告訴webpack也將這些打包起來,在app.js旁邊創建一個app.css文件。

入門是一個相當直接的問題,即向你的項目中添加一個配置文件,添加一個新的devDependency,並弄清如何讓你的基於Java的構建工具來觸發捆綁器。例如,frontend-maven-plugingradle-node-plugin


這些天來,webpack及其之流甚至更聰明。如果您的node_modules包含ES6本地模塊,則捆綁軟件可以對這些文件執行tree-shaking以僅打包實際導入的導出。這更加減小了包裹的大小。

它們還可以將部分包捆綁到一個單獨的文件中,以便創建包含Angular,jQuery等代碼的vendor.js文件。或者您可以告訴捆綁器處理這些導入作爲外部的,這意味着它們被認爲已經包含在網絡應用的其他地方。但是這一切都需要比最初需要的更先進的功能。只要給webpack的getting started指導一下,看看它立即對你的戰爭規模的差異,並從那裏去。