使用一堆npm包的Java War文件部署

我正在使用Eclipse中的一个dynamicWeb项目,并且正在计划使用Angular / Durandal / Aurelia风格的框架来构build一个JavaScript单页应用程序前端的Java JAX-RS RESTful后端。 有了这个说法,在Java世界中部署的典型方法是将东西捆绑为一个WAR文件 – 这本质上是一个JAR文件。 麻烦的是,包括node_modules相当大的WAR文件的大小。 另一方面,我可以在部署后执行'npm install'。 但是,在我经常部署的开发机器上,这将花费太多时间。 我宁愿如果我可以使用“npm install”模块在Web服务器上准备安装目录,然后在其上部署WAR文件。 麻烦的是,看起来WAR文件部署如果没有包含在WAR文件中,就会消除文件夹。

我正在使用GlassFish 4.1应用程序服务器。 对于我来说,理想的解决scheme是通过修改MANIFEST.MF文件来“隐藏”WAR文件中的目录,这样当扩展隐藏的目录时不会被覆盖。 这将是我的问题最简单的解决scheme。 但是,我知道没有隐藏JAR / WAR文件清单的清单条目。

也可能有创造性的解决scheme来使用'npm link'命令。 任何build议,欢迎。

也许这个原因之一就是为什么一旦人们开始在客户端使用npm,他们就开始看节点,并在服务器端进行expression。 然而,我不相信他们不能一起玩,我想保留所有旧的开源Java库的选项在我的处置。

如果你使用像Grunt这样的nodejs构build工具(但可能不是),那么很可能是devDependencies占用了太多的空间。 如果是这样,只需将您的运行时依赖关系复制出node_modules即可。

如果不是,则不必部署.war; 你也可以部署一个'exploded'目录。 您只能复制已更改的文件并touch .reload

我知道这个问题已经快两年了,但也许有人会需要一个答案。

简而言之,你需要绑定你的JavaScript。 你不应该在战争中包装你的node_modules文件夹,或者直接把它部署到服务器上。 主要是因为你遇到的问题。 这不是最小的

在前端开发中,您需要使用像webpack这样的工具将所有JS文件收集到一个app.js文件中。 这个过程只会把你直接require或者在你自己的JavaScript中import的实际文件(以及这些文件require的文件等)拿走,剩下的就不用了。 最重要的是对于这个讨论,把你所有的devDependenciesdevDependencies

Webpack也会捆绑js以外的文件。 导入你的css文件会告诉webpack将这些文件捆绑起来,在app.js旁边创build一个app.css文件。

入门是一个相当简单的事情,即添加一个configuration文件到你的项目,添加一个新的devDependency,并找出如何让你的基于Java的构build工具来触发捆绑。 例如, 前端maven插件 ,或者gradle-node-plugin 。


这些天,webpack及其stream行更加智能化。 如果您的node_modules包含ES6本机模块,则捆绑器可以对这些文件执行树形抖动 ,以仅绑定实际导入的导出。 这更加减小了包的大小。

他们也可以将部分包分成一个单独的文件,以便创build一个包含Angular,jQuery等代码的vendor.js文件。或者你可以告诉打包者将这些导入视为外部的,意思是他们被认为已经被包含在networking应用程序的其他地方。 但是,这一切都进入更先进的function比你最初需要。 只要给webpack的入门指南一下,看看它立即对你的战争规模的差异,并从那里去。