【问题标题】:Can I package a Node.js App as a Java EAR我可以将 Node.js 应用程序打包为 Java EAR
【发布时间】:2016-09-19 14:13:18
【问题描述】:

假设您的公司要求开发一个实时聊天应用程序,并希望它在几个小时内完成。由于您已经知道使用 Node.js 非常简单,因此您使用 Node.js 开发它,但该公司使用 Java 应用服务器(如 WebSphere、JBoss 或 WebLogic)。

所以服务器管理员希望部署 .EAR 文件。

有没有办法提供一个 .EAR 文件来运行你的 Node.js 应用程序?

【问题讨论】:

  • “在后面运行你的 Node.js 应用程序”。这是什么意思?这个盒子上是否还有一个实际的节点服务器也在运行?谁为入站请求提供服务?应用服务器?我的意思是,想一想,这怎么可能工作
  • 我的建议是,找到 Java websocket 库的几个实时聊天示例之一,并根据您的需要定制实现。
  • 这不是一个真实的场景。我只是想知道我们是否可以做到。
  • 也许我们可以打包 node.js 可执行文件,然后应用程序使用 java 以适当的参数启动 node.js 以运行服务器?
  • 好的,但此时,您实际上只是在运行一个 node.js 服务器。为什么要让 Java 应用服务器参与其中?另外,祝你好运,除非你使用两个完全不同的端口,否则弄清楚如何路由入站请求。

标签: java node.js ear java-server


【解决方案1】:

这太肮脏了,以至于对已发布的 EAR 进行的任何理智检查都会在原地杀死您。话虽如此,是的,这是可能的。你必须先知道一些事情。

  1. 目标 JVM 是否有足够的特权来运行进程或执行权限上的安全性是否足够松以使 JVM 能够使用其 API 方法执行 shell 进程。 (我说的是 Java 安全,而不是操作系统安全)

  2. 您必须直接知道 ear 容器运行在哪种类型的操作系统上。

  3. EAR/WAR 必须“扩展”到操作系统已知的真实文件系统。

  4. 你必须知道ear容器下的凭证是否有足够的权限来执行操作系统命令。

一旦您确切知道这四点,使用 Process java API 执行可执行文件(静态链接和操作系统兼容)方便地到已知位置的 Node.js 进程就不是什么大问题了...

正如 Bruno Grieder 所说,共享端口是不可能的,因此您只需让 Web 应用程序充当在 Node.js 上运行的“真实”应用程序的前端代理,HTTP 或 HTTPS 根本不相关Web 应用程序容器和 Web 应用程序本身之间的最终通信不再加密。

awwww...好可爱... :) 但是,你要知道,在公司环境中使用这种鬼鬼祟祟的方法,并不是一件好事。

【讨论】:

  • 正如我之前提到的,这不是真实世界的场景。我只是想知道是否有办法做到这一点。如果是这样,那么开发人员可以为用 nodejs 和服务器编写的应用程序创建一个容器作为 java 应用程序。顺便说一句,你能为此做任何工作示例吗?
  • 不,我没有时间,我觉得这个问题很有趣,这个解决方案的实施取决于你。无论如何,我没有反对公司的指导方针,它们通常被合理地定义,以避免生产人员缺乏资源来应对可能涉及软件解决方案的生产问题。真正的问题在于您的层次结构没有评估成本或只是想要一个“现在就做”的解决方案。
  • 正如我之前所说,这不是一个真实的场景。没有人要求我做一个聊天应用程序,当然也没有人愿意将 nodejs 应用程序隐藏在 java 耳朵中,包括我。而且我也不是程序员,我是一个对 node.js 感兴趣的 DBA 就是这样。但是,如果以某种方式可以做到的话,它将成为 java 和 nodejs 之间的桥梁,可能会改变很多事情。
  • 好吧,如果你想在 nodejs 和 java 之间“架起”桥梁,你可以使用多种解决方案,比如代理、webservice、消息传递等......你的问题是“如何将 nodejs 打包在一个EAR”,所以这个解决方案是一种“嵌入/打包”的方式,但这并不意味着其他可能性是没有问题的。
【解决方案2】:

没有。

您无法将“预安装”的 nodeJS 正确打包到耳朵内。

NodeJS 安装在 Windows 和 Linux 之间有所不同; EAR 将无法携带。

附带说明,如果服务器管理员得知您正在打包不打算在 EAR 内的 JVM 上运行的可执行文件,我不想站在您的立场上。

(注 1:正如 @mlan 在上面的 cmets 中所指出的,在 JVM 和 nodejs 进程之间共享端口是不可能的 - 假装它需要一个前端反向代理来调度 HTTP 请求,假设所有流量都是 HTTP)

(注意2:不要误会我的意思,您可以将任何内容放入 EAR 中,包括您使用 ProcessBuilder 从 Java 触发的可执行文件,但这是最后的解决方法)

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2017-01-28
    • 2011-10-13
    • 1970-01-01
    • 2016-08-06
    • 2016-11-15
    相关资源
    最近更新 更多