3

我有一个现有的 Java 应用程序(基于 Spring),它目前没有 Web 界面,也没有在 Web 容器中运行。它与启动程序很好地打包在一起,并且可以正常工作。

我需要做的是为一些管理类型的东西添加一个管理 Web 界面,检索实时指标,也许还有一些图表,让用户有一种温暖的模糊感觉,知道一切正常。由于我们是一家 Spring 商店,并且我们的一些 Web 应用程序已经使用 Spring MVC,它只对我们有意义,但是,我对内部 Spring 人员关于我应该如何进行的建议并不满意。

使用此 Web 界面的理想方式是什么?

  • 将我的应用程序转换为 Web 应用程序并让 Web 容器启动该应用程序。我不太喜欢这种方法,因为 Web 层实际上是次要应用程序。
  • 创建一个单独的项目,将其打包为战争,将 Jetty 嵌入到我现有的应用程序中并让它加载战争。我想我可以使用上下文加载器侦听器使我的应用程序的根上下文成为 Web 应用程序 spring 上下文的父级。这将涉及将我的 Maven 项目分解为我认为的 2 个项目。我无法使用现有的 Web 技术在 Web 层和主应用程序之间进行通信,因为我的主应用程序没有启用 Web。
  • 嵌入 Jetty 并将 Spring MVC 的东西直接放在我的应用程序中。虽然我以前做过这种方法,但它确实涉及一些丑陋 - 例如将 JSP 标记库爆炸到我的 jar 中。

对这里的一些干净分离有什么想法吗?

另外值得注意的是,我当前的 jar 包含一些实用程序应用程序,一些 shell 脚本会启动这些应用程序。走纯 WAR 路线会使这变得不那么容易,因为我不能将 java 指向我的 war 文件并选择要执行的类。

谢谢。

4

2 回答 2

2

如果 web 确实只是应用程序的一个小添加,那么将其迁移到 WAR 并部署在 servlet 容器中可能是一种矫枉过正的做法。嵌入 Web 服务器/servlet 容器看起来要简单得多,尽管它不必是 Jetty 或 Tomcat。甚至原始套接字之上编写一个。但这是一个地狱般的维护。

阅读时想到的另一种解决方案:

一些管理类型的东西的网络界面,检索实时指标,也许还有一些图表

也许您不需要接口,而是需要监控基础设施?查看 JMX(Spring对 JMX 有很好的支持) - 并编写第二个 Web 应用程序,它通过 JMX 简单地连接到您的独立 Java 应用程序并以奇特的方式显示指标。另一种方法是通过Jolokia公开 JMX ,它将 JMX 转换为 REST 服务。

这种方法有几个优点:

  • 监控API通用,免费获取

  • 您不必使用Web客户端,监控应用程序完全解耦,

  • 最后,对原始应用程序的更改很少。看看这个概念证明:1 , 2

于 2012-10-24T19:40:33.327 回答
0

这实际上取决于您现有 Java/Spring 应用程序的结构以及它提供了多少 API。我已经做了类似的事情,我通过创建一个单独的 Spring MVC 项目来接近它,然后将现有的 Java 应用程序指定为 JAR 依赖项。

这对于 Maven(或 Ivy 等)来说很容易,并且提供了很好的解耦。诀窍是能够在 Spring MVC 应用程序中编写服务类,然后通过一个简单的 DAO 类通过依赖的 Spring 应用程序访问数据。这就是为什么我一开始就说,这取决于您的原始 Java 应用程序的结构。它必须能够为数据访问提供 API,然后您可以将 DAO (impl) 插入其中。

如果这不容易做到,那么我建议的下一个选项就是将您的 Spring 应用程序转换为 Spring MVC 应用程序。我在另一个应用程序上工作过。使用 Maven,可以指定构建可以创建一个 war 文件或一个 jar 文件(或两者)。因此它可以部署为 webapp(通过 war)或普通应用程序(通过 jar)。是的,jar 版本有点臃肿,但值得妥协。

嵌入 Jetty 或通过 war 文件使用 Tomcat 的问题是一个完全独立的问题,各有利弊。它不应该首先影响您在构建 Web 应用程序时采用的方法。

于 2012-10-24T23:22:17.843 回答