向现有Java应用程序添加web界面(SpringMVC)

向现有Java应用程序添加web界面(SpringMVC),java,spring,spring-mvc,netty,Java,Spring,Spring Mvc,Netty,我有一个现有的Java应用程序(基于Spring),它目前没有web接口,也没有在web容器中运行。它很好地打包了一个启动程序,并且可以正常工作 我需要做的是为一些管理类型的事情添加一个管理web界面,检索实时指标,也许还有一些图形,让用户知道一切都在工作,从而产生一种温暖的模糊感觉。由于我们是一家Spring商店,而且我们的一些web应用程序已经使用Spring MVC,这对我们来说才有意义,但是,我不满意Spring内部人员对我应该如何处理的建议 什么是连接此web界面的理想方式 将我的应

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

我需要做的是为一些管理类型的事情添加一个管理web界面,检索实时指标,也许还有一些图形,让用户知道一切都在工作,从而产生一种温暖的模糊感觉。由于我们是一家Spring商店,而且我们的一些web应用程序已经使用Spring MVC,这对我们来说才有意义,但是,我不满意Spring内部人员对我应该如何处理的建议

什么是连接此web界面的理想方式

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

同样值得注意的是,我当前的jar包含一些shell脚本启动的实用程序应用程序。走一条纯粹的WAR路线会让这变得不那么容易,因为我不能在WAR文件中突出java并选择要执行的类


谢谢。

如果web确实只是应用程序的一个小补充,那么将其迁移到WAR并部署在servlet容器中可能是一种过分的做法。嵌入web服务器/servlet容器看起来简单得多,尽管它不必是Jetty或Tomcat。您可以使用内置在JDK中的web服务器,也可以在原始套接字上编写web服务器。但这是一个地狱维持

阅读时,我想到了另一个解决方法:

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

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

这种方法有几个优点:

  • 监视API是通用的,您可以免费获得它

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

  • 最后,对原始应用程序的更改是最小的。请查看此概念证明:


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

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

如果这不容易做到,那么我建议的下一个选择就是将您的Spring应用程序转换为Spring MVC应用程序。我已经开发了另一个应用程序。使用Maven,可以指定构建可以创建war文件或jar文件(或两者兼有)。因此,它可以部署为webapp(通过war)或普通app(通过jar)。是的,jar版本有点膨胀,但这是一个值得的折衷方案


通过war文件嵌入Jetty或使用Tomcat的问题是一个完全独立的问题,有其优缺点。它不应该影响您在设计web应用程序时首先采用的方法。

关于JMX的观点非常好。我会进一步研究。我开始认为我需要重新思考我制作Spring应用程序的方式。从一开始就采用webapp方法。。以防万一我以后需要插接web界面。。这种情况经常发生,即使我们需要为我们的支持人员提供数据提取接口。