JBoss 上的热部署 - 如何让 JBoss "看到" 更改?

57

我正在开发一个Java EE应用程序,在开发期间我需要在本地的JBoss安装中反复部署应用程序。我想通过热部署将我的应用程序直接部署到[JBOSS]/server/default/deploy/myApp,以加快构建速度。

它似乎可以工作,但是在硬部署之后,JBoss开始使用新类之前会有一些随意的延迟。我对JBoss不是很熟悉,但我假设它缓存类,并且这就是问题的原因。

我是否正确?如果是,则如何使JBoss清除其缓存?


3
Yan Pak的答案非常完美,为什么不接受呢? - Pedro Rolo
17个回答

114

我在我的捆绑包中也遇到了同样的问题:(Eclipse IDE + JBoss服务器适配器)+ JBoss AS 7.0.1(社区项目)。

我的解决方案非常简单-您应该转到JBoss管理面板(默认情况下是localhost:9990),在配置文件设置中打开“Core - Deployment Scanners”。 打开Autodeploy-Exploded(设置为true),并根据需要设置扫描时间(默认为5000 ms)以适合您的需求(我将其设置为2000,以便在进行项目更改时在Eclipse中进行更快速的增量发布)。就这样。现在,JBoss不仅可以对HTML(JSF,XHTML等)文件进行HOT部署,还可以处理POJO类(bean等)文件。


3
太棒了!效果很好,只花了我3分钟,在使用$catalina_home/bin/add-user.sh添加用户后。 - Nicolas Zozol
3
这个设置确实有助于重新部署战争文件,但它会导致我的战争文件重新启动,所有应用程序的会话都被清除。 - Steve Lam
2
在我看来,那不是正确的方式。为什么要清除所有会话,当我只对静态文件(如XHTML和CSS文件)进行更改时。如果我对Java类进行更改,我可以接受这种做法,但不适用于静态文件。 - AdemC
“but also takes care of POJO classes (beans and so on) files.” 这句话的确切含义是什么?我想热部署只适用于静态更改(UI、xhtml等),因为其他需要在Java类中进行的所需更改需要重新构建项目,因为它们都是<code>.class</code>文件,所以无法修改它们。 - teobais
1
你可以在开发环境(仅限)的_standalone.xml_(或完整文件)中添加auto-deploy-exploded="true",请参见这里的最佳答案。 - Bruno L.
显示剩余4条评论

8
很遗憾,这并不容易。在JBoss背后有更复杂的事情(其中大部分与ClassLoader相关),这将阻止您热部署应用程序。
例如,如果某些类的签名发生更改,则无法进行热部署。
到目前为止,使用MyEclipse IDE(Eclipse的付费版本)是我发现的唯一可以成功实现热部署的方法。虽然不是100%准确,但肯定比JBoss Tools、Netbeans或任何其他基于Eclipse的解决方案更好。
我一直在寻找免费工具来完成你刚才描述的事情,通过在StackOverflow上询问人们,如果你想看看的话。

抱歉,我在执行 Maven 目标时遇到了“硬部署”的问题。这让我感到困惑,因为我发现的文档告诉我它很简单(例如:http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Getting_Started/The_JBoss_Server___A_Quick_Tour-Hot-deployment_of_services_in_JBoss.html)。不过,我可以看出这可能会在涉及 EJB 相关内容的更复杂连接方面存在问题。 - Jacob Hansson
3
据我理解,“HOT-DEPLOY”是指在不需要重新部署的情况下即可对当前已部署内容进行修改。我猜RedHat的文档中将“HOT-DEPLOY”称为无需重启应用服务器即可部署任何内容的能力,但也许我错了。您使用Eclipse吗?可以试试MyEclipse,它有30天的试用期,如果您决定购买,价格也很便宜。 - Pablo Santa Cruz
4
这是应用程序服务器的一个功能,与集成开发环境无关。 - Jackie

6
你应该尝试JRebel,它可以很好地完成热部署。价格有点贵,但物有所值。他们有一个试用版。

2
没错,它可以工作。这是我唯一得到的在jboss5上正确运行的产品。如果你使用的是jboss7,你不需要jrebel来进行jsp热部署。只需在standalone.xml中打开jsp-development标志,就可以像使用jboss7tools一样轻松实现。 - Nicholas DiPiazza

4

这只是我的个人看法:

  • Cold deployment(冷部署)是在停止应用程序(或整个服务器)后,安装新版本,最后重新启动应用程序(或整个服务器)的部署方式。它适合官方生产部署,但在开发过程中执行该操作速度非常慢,如果你采用这种方式,就忘记快速开发吧。

  • Auto deployment(自动部署)是服务器定期重新扫描新的EAR/WAR并在幕后自动为您部署它的能力,或者是IDE(Eclipse)在源代码更改时自动部署整个应用程序。JBoss可以做到这一点,但JBoss的营销部门错误地称之为“hot deployment(热部署)”。与冷部署相比,自动部署不太慢,但与热部署相比仍然很慢。

  • Hot deployment(热部署)是能够实现在 "as you type" 的幕后部署能力。当您进行更改时,无需重新部署整个应用程序,只需要部署更改即可。您更改一个Java源代码,Voila!它已经在运行了。您甚至没有注意到它在部署。JBoss无法做到这一点,除非您购买JRebel(或类似产品),但这对我而言太昂贵。

现在是我的“推销”:D

开发时使用Tomcat怎么样?免费提供完全的hot deployment(热部署)... 我在开发过程中经常使用它,然后在WebSphere、JBoss或Weblogic上进行部署。别误会,这三个用于生产效果很好,但在本地机器上进行快速开发实在太慢了。如果您一整天都使用这三个工具,开发生产力就会受到影响。

根据我的经验,我不再使用WebSphere、JBoss和Weblogic进行快速开发。当然,我仍然在本地环境中安装它们,但只是为了需要运行的偶尔测试。我没有为JRebel付款,同时还获得了快速开发速度。我提到Tomcat与JBoss完全兼容了吗?

Tomcat是免费的,不仅具有自动部署,还支持即时热部署(Java代码、JSP、JSF、XHTML),而且在Eclipse中输入时,即时部署也很方便(没错,你没看错)。MYKong在一个页面上(https://www.mkyong.com/eclipse/how-to-configure-hot-deploy-in-eclipse/)详细介绍了如何设置它。

您喜欢我的推销吗?

干杯!


这并没有真正回答问题。此外,StackOverflow并不适用于专业产品比较、评论或建议。 - trincot
3
但它很有帮助! - Jose Manuel Gomez Alvarez
1
你能链接到MYKong的文章吗?谢谢。 - Jackson Bray

2

热部署仅对应用程序的静态部分(jsf、xhtml等)的更改稳定。

以下是根据 JBoss AS 7.1.1.Final 的一个可行解决方案:

  • 构建您的项目。
  • 导航到 [JBOSS_HOME]/standalone/tmp/vfs。
  • 打开最近修改的文件夹,名称为“deployment[一些字母数字值]”,例如“deployment344b1c870c8edbd”。
  • 导航到要编辑的特定视图(通常包含在打包的.war文件夹中),并使用文本编辑器(例如Notepad++)打开它。
  • 进行所需更改,并保存文件。
  • 刷新浏览器上相应的页面。现在应该可以看到更改了。
  • 完成后,请不要忘记将这些更改复制到实际的开发环境中,重新构建和部署。


    不知道这个(较老的)版本的情况 :-) - teobais

    2

    在使用Eclipse Mars和WildFly 11时这对我很有帮助。双击Servers下的WildFly服务器以打开配置页面。在概述选项卡中-> 发布,选择“当资源更改时自动发布”并将间隔设置为1。接下来,在概述选项卡中-> 应用程序重新加载行为,取消选中使用默认模式并将模式设置为\.jar$|\.class$。在部署选项卡中,取消选中将项目部署为压缩档案。希望这可以帮到您。


    1

    我曾经遇到过同样的问题,但现在我认为我已经控制住了。

    你是使用eclipse还是命令行或其他方式?

    当我使用命令行时,我想我执行了"seam clean"或"seam undeploy",甚至可能是"seam restart",然后再执行"seam explode"。我可能在不同的时间尝试了所有这些操作,从未费心去查找每个操作的含义。

    关键是要从两个位置删除已部署的war文件。

    1. $JBOSS_HOME/server/default/deploy
    2. $PROJECT_HOME/exploded_archives
    

    我相信"seam undeploy"会删除第一个,而"seam clean"则会删除第二个。

    当我使用eclipse(我使用的是免费版)时,我首先关闭"Project/Build Automatically"。然后当我准备部署时,我会执行Project/Build Project或Project/Build All,具体取决于我所做的更改。当我更改xhtml时,Build Project就足够了。当我更改java源代码时,Build All就可以了。可能这些操作是相同的,只是我自己想象出了不同之处,但是这些操作的某种组合方式一定适用于您。

    但是您必须注意输出。有时应用程序没有被清理或卸载。这将导致您看不到更改。有时我会先关闭服务器,然后重新构建/清理/部署项目。

    希望这可以帮助您。

    TDR


    1

    我在链接上找到了解决方案:

    步骤如下:

    1. 配置 exploded war artifact 为 .war 扩展名
    2. 将 exploded artifact 部署到 WildFly 或 Jboss
    3. 配置 IntelliJ 在更新操作时更新资源

    当我修改一个页面(网页)后,我进行更新并刷新网页浏览器:我的修改都会出现。我已经配置了 Jboss 进行自动扫描(不确定是否有帮助)。


    1
    我正在使用 JBoss AS 7.1.1.Final。在我的 web.xml 中添加以下代码片段可以帮助我实现动态更改 jsp 文件:
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>development</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
    

    希望这有所帮助。!!

    0
    在 jboss-5.2.0-eap\server\default\deploy\hdscanner-jboss-beans.xml 文件中。
        <property name="scanPeriod">2000</property>
    

    然后,在你的web.xml文件中:

    <context-param> 
        <param-name>facelets.DEVELOPMENT</param-name> 
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.REFRESH_PERIOD</param-name>
        <param-value>0</param-value>
    </context-param>    
    <context-param>
        <param-name>org.jboss.seam.core.init.debug</param-name>
        <param-value>true</param-value>
    </context-param>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接