带有一堆 npm 包的 Java War 文件部署

标签 java node.js npm war

我正在 Eclipse 中处理一个动态 Web 项目,我计划使用 Angular/Durandal/Aurelia 风格的框架开发一个 Java JAX-RS RESTful 后端和一个 JavaScript 单页应用程序前端.话虽如此,在 Java 世界中部署的典型方法是将事物捆绑为 WAR 文件——它本质上是一个 JAR 文件。问题是,包括 node_modules 会大大增加 WAR 文件的大小。另一方面,我可以在部署后执行“npm install”。但是,在我不断部署的开发机器上,这会花费太多时间。如果我可以使用“npm install”模块在 Web 服务器上准备安装目录,然后在其上部署 WAR 文件,我会更愿意。问题是,如果 WAR 文件中不包含文件夹,WAR 文件部署似乎喜欢清除文件夹。

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

使用“npm 链接”命令也可能会产生创造性的解决方案。欢迎提出任何建议。

也许这与其他原因一起说明了为什么一旦人们开始在客户端使用 npm,他们就会开始关注服务器端的 node 和 express。但是,我不相信它们不能很好地协同工作,我想保留所有老式开源 Java 库的选项供我使用。

最佳答案

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

简单地说,您需要捆绑您的 JavaScript。你不应该永远在 war 中结束你的 node_modules 文件夹,或者甚至按原样将它部署到服务器。主要是因为您遇到的问题。它……不是最小的。

在前端开发中,您应该使用像webpack 这样的工具。将所有 JS 文件收集到一个 app.js 文件中。此过程只会获取您直接需要导入在您自己的JavaScript中的实际文件(以及那些文件需要等的文件),忽略所有其余部分。对于本次讨论最重要的是,省略所有的 devDependencies!

Webpack 还会打包 js 以外的文件。导入你的 css 文件将告诉 webpack 也将 那些 捆绑起来,在你的 app.js 旁边创建一个 app.css 文件(尽管你需要使用适当的 loader 来告诉 Webpack 它是什么 意味着 import 'main.css')。

入门是一件相当简单的事情,只需将配置文件添加到您的项目,添加一个新的 devDependency,然后弄清楚如何让您的基于 Java 的构建工具触发 bundler 。 frontend-maven-plugin ,例如,或 gradle-node-plugin .


如今,webpack 及其同类产品更加智能。如果您的 node_modules 包含 ES6 原生模块,打包器可以执行 tree-shaking在这些文件上只捆绑实际导入的导出。这进一步减小了包的大小。

他们还可以将 bundle 的一部分提取到一个单独的文件中,以便创建一个包含 Angular、jQuery 等代码的 vendor.js 文件。或者您可以告诉 bundler 将这些导入视为外部,这意味着它们被假定已包含在网络应用程序的其他地方。但这一切都是为了获得比您最初需要的更高级的功能。只要给 webpack 的 getting started引导一个方向,看看它对你的 war 规模的立即影响,然后从那里开始。

关于带有一堆 npm 包的 Java War 文件部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33554053/

相关文章:

java - Sphinx4 实时语音识别只能工作一次

node.js - Nodejs 的依赖管理不仅控制模块的版本,还控制 npm 和 Node 本身的版本

javascript - 链接 react-app 和本地 npm 包的无效 Hook 调用警告

node.js - `npm start` 提示 "missing script: start",没有运行 Node

java - Lombok在Intellij中的注解

java - 使用 Java google apps 目录 API 获取特定电子邮件 ID 的组时出错

java - spring-data-solr java.lang.IllegalArgumentException : Not a managed type

node.js - 在 XLSX 导出期间在工作表的开头插入新行/注释

node.js - 使用 Mongoose 从表单中提取数据并添加到数据库

Node.js 在通过 HTTPS 服务时切断文件