在 JBoss 上热部署 - 我如何让 JBoss “看到”变化?

Posted

技术标签:

【中文标题】在 JBoss 上热部署 - 我如何让 JBoss “看到”变化?【英文标题】:Hot deploy on JBoss - how do I make JBoss "see" the change? 【发布时间】:2010-11-01 10:35:31 【问题描述】:

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

它似乎可以工作 - 但在硬部署和 JBoss 开始使用新类之间似乎也有一些随意的延迟。我对 JBoss 不是很熟悉,但我认为它会缓存类,这就是导致问题的原因。

我说的对吗,如果是的话,我该如何让 JBoss 刷新它的缓存?

【问题讨论】:

Yan Pak 的答案是完美的。为什么不接受呢? 【参考方案1】:

如果您使用的是 Eclipse IDE,则有一个免费插件 Manik-Hotdeploy。

此插件允许您将 Eclipse 工作区与 Wildfly 部署文件夹连接起来。在 maven 构建后,您的工件(例如 war 或 ear)将自动推送到服务器的部署文件夹中。 Web 内容文件(例如 .xhtml .jsf ...)也将被热部署。

该插件适用于 wildfly、glassfish 和 payara。

阅读JBoss/Wildfly Support 部分了解更多详情。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

将应用部署为已展开(project.war 文件夹),添加到您的 web.xml:

<web-app>
    <context-param>
        <param-name>org.jboss.weld.development</param-name>
        <param-value>true</param-value>
    </context-param>

每次部署时更新 web.xml 时间(追加空行):

set PRJ_HOME=C:\Temp2\MyProject\src\main\webapp
set PRJ_CLSS_HOME=%PRJ_HOME%\WEB-INF\classes\com\myProject

set JBOSS_HOME= C:\Java\jboss-4.2.3.GA-jdk6\server\default\deploy\MyProject.war
set JBOSS_CLSS_HOME= %JBOSS_HOME%\WEB-INF\classes\com\myProject

copy %PRJ_CLSS_HOME%\frontend\actions\profile\ProfileAction.class %JBOSS_CLSS_HOME%\frontend\actions\profile\ProfileAction.class
copy %PRJ_CLSS_HOME%\frontend\actions\profile\AjaxAction.class %JBOSS_CLSS_HOME%\frontend\actions\profile\AjaxAction.class

ECHO.>>%JBOSS_HOME%\WEB-INF\web.xml

【讨论】:

【参考方案4】:

我正在使用 JBoss AS 7.1.1.Final。在我的 web.xml 中添加以下代码 sn-p 帮助我即时更改 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>

希望这会有所帮助。!!

【讨论】:

【参考方案5】:

以调试模式启动服务器,它将跟踪方法内部的变化。其他变化 会要求重启模块。

【讨论】:

【参考方案6】:

Netbeans 8.02 和 8.1 IDE 和 JBOSS EAP 6.4 的解决方案:

    从 Netbeans 的服务选项卡中,将 JBOSS 服务器添加到您的“服务器”节点。

    如果您使用的是 MAVEN,netbeans 会编译文件并将文件复制到 ./target 目录。您需要创建一个从 .\target 到 JBOSS_HOME\standalone\deployments 的符号链接。在 windows 下,一个示例命令是

    cd %JBOSS_HOME%\standalone\deployments mklink /d MyWebApplication.war %PROJECTS_HOME%\MyWebApplication\target\MyWebApplication-1.0.0

    上面创建了一个从%JBOSS_HOME%\standalone\deployments\MyWebApplication.war\target\MyWebApplication-1.0.0 的符号链接,这是maven 在编译后、jsp、html 或任何其他文件更改后传输所有文件的地方。

    最后要做的是在 %JBOSS_HOME%\standalone\deployments 中创建一个CentralManagement.war.dodeploy 文件。该文件将告诉 JBOSS 将战争“文件”部署为 Web 应用程序

【讨论】:

【参考方案7】:

只要我的两分钱:

冷部署是在停止应用程序(或停止整个服务器)后部署应用程序,然后安装新版本,最后重新启动应用程序(或启动整个服务器)。它适用于官方生产部署,但在开发过程中这样做会非常缓慢。如果您正在这样做,请忘记快速开发。

自动部署是服务器必须定期重新扫描新 EAR/WAR 并在幕后为您或 IDE (Eclipse) 自动部署的能力当您更改源代码时自动部署整个应用程序。 JBoss 会这样做,但 JBoss 的营销部门会误导性地称其为“热部署”。与冷部署相比,自动部署并不慢,但与热部署相比确实很慢。

热部署是在“键入时”在幕后部署的能力。进行更改时无需重新部署整个应用程序。热部署ONLY 部署更改。您更改了 Java 源代码,瞧!它已经在运行了。你从来没有注意到它正在部署它。 JBoss 无法做到这一点,除非您为 JRebel(或类似产品)购买,但这对我来说太贵了(我很便宜)。

现在是我的“推销”:D

在开发过程中使用 Tomcat 怎么样?全天提供热部署...免费。我在开发过程中一直这样做,然后部署在 WebSphere、JBoss 或 Weblogic 上。不要误会我的意思,这三个非常适合生产,但对于在本地机器上进行快速开发真的很糟糕。如果整天使用这三个,开发效率就会下降。

根据我的经验,我停止使用 WebSphere、JBoss 和 Weblogic 进行快速开发。不过,我仍然将它们安装在本地环境中,但仅用于我可能需要运行的偶尔测试。当我获得惊人的开发速度时,我不会一直为 JRebel 付费。我有没有提到 Tomcat 与 JBoss 完全兼容?

Tomcat 是免费的,不仅可以自动部署,还可以在您在 Eclipse 中键入时进行真正的热部署(Java 代码、JSP、JSF、XHTML)(是的,您没看错)。 MYKong 有一个页面 (https://www.mkyong.com/eclipse/how-to-configure-hot-deploy-in-eclipse/) 详细介绍了如何设置。

你喜欢我的推销吗?

干杯!

【讨论】:

这并不能真正回答问题。此外,*** 不适用于专业的产品比较、评论或推荐。 不过很有帮助! 你能链接到MYKong的文章吗?谢谢。【参考方案8】:

我一直在使用 Eclipse 和 Wildfly 开发一个项目,由于部署了我在应用程序中需要的所有第 3 方库,分解的 EAR 文件变得越来越大。我将部署指向我的 Maven 存储库,我猜它每次都在重新复制 jar。因此,每当我更改服务层中的 Java 代码时重新部署应用程序就变成了一场噩梦。

然后求助于 Hotswap 代理,这有助于在不重新部署应用程序的情况下查看 EJB 代码的更改。

但是,我最近升级到 Wildfly 10、Java 8 和 JBoss Developer Studio 10,在此过程中,我花时间移动了所有 3rd 方应用程序 jar,例如primefaces 进入 Wildfly 模块,我从部署配置中删除了我的 Maven 存储库。现在通过 Eclipse 重新部署一个相当大的整个应用程序只需要几秒钟,而且比以前快得多。我什至不觉得有必要安装 Hotswap,而且现在也不想冒险。

因此,如果您使用 Wildfly 在 Eclipse 下构建,那么使用 Wildfly 模块让您的应用程序远离 3rd 方库,这样会更好。

【讨论】:

【参考方案9】:

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

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

构建您的项目。 导航到 [JBOSS_HOME]/standalone/tmp/vfs。 打开最近修改的名为“deployment[some_alphanumeric_values]”的文件夹,即“deployment344b1c870c8edbd”。 导航到您要编辑的特定视图(通常包含在打包的 .war 文件夹中)并使用文本编辑器(即 Notepad++)打开它。 进行所需的更改并保存文件。 刷新浏览器上的相应页面。现在应该可以看到更改。

完成后,别忘了将这些更改复制到您的实际开发环境中,重新构建和重新部署。

【讨论】:

没有关于这个(旧)版本的线索 :-)【参考方案10】:

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

我的解决方案非常简单 - 你应该去 JBoss 管理面板(默认为 localhost:9990),在配置文件设置中打开 Core - Deployment Scanners。打开 Autodeploy-Exploded(设置为 true),根据您的意愿,您可以将扫描仪时间(默认为 5000 毫秒)设置为适合您的(我设置为 2000,以便在我对项目进行更改时在 Eclipse 中更快地增量发布) .而已。现在 JBoss 不仅对 HTML(JSF、XHTML 等)文件进行 HOT 部署,而且还负责 POJO 类(bean 等)文件。

【讨论】:

太棒了!就像一个魅力,我只花了 3 分钟,在添加一个用户 $catalina_home/bin/add-user.sh 这个设置确实有助于重新部署战争,但是它会导致我的战争重新开始并且我的所有应用程序的会话都是清晰的。 这不是 IMO 的正确方式。当我只对静态文件(如 XHTML 和 CSS 文件)进行更改时,为什么要清除所有会话。如果我更改 Java 类而不是静态文件,我会接受它。 “但也处理 POJO 类(bean 等)文件”到底是什么意思。 ?我想热部署仅适用于静态更改(UI、xhtml 等),因为需要在 Java 类中完成的其他所需更改需要您重新构建项目,因为它们都是 。 class 文件,所以你不能修改它们。 当我打开它时,日志文件中出现以下消息: 10:50:04,343 WARN [org.jboss.as.server.deployment.scanner] (HttpManagementService-threads - 3) JBAS015005 :当启用了展开内容的自动部署(即不使用“.dodeploy”标记文件的部署)时,可靠的部署行为是不可能的。不建议在任何需要可靠性的情况下配置爆炸内容的自动部署。建议将部署扫描器的 auto-deploy-exploded 设置配置为“false”。【参考方案11】:

在link上找到了解决方案:

做什么:

    将爆炸的战争工件配置为具有扩展名 .war 将爆炸的工件部署到 WildFly 或 Jboss 配置 IntelliJ 以在更新操作时更新资源

当我修改页面(网络)时,我会更新,当我刷新网络浏览器时:我的 mod 就在那里。 我确实为自动扫描配置了 Jboss(不确定它是否有帮助)

【讨论】:

【参考方案12】:

实际上我的问题是命令行 mvn 实用程序由于某种原因看不到更改。我在 Deployment Scanner 中打开了 Auto-deploy,仍然没有任何区别。但是...我在 Eclipse 环境中摆弄,因为我为它的服务器窗口添加了一个 JBoss 服务器,我发现我能够在我的工作区中“添加或删除...”模块。一旦添加了项目,每当我对代码进行更改时,部署扫描程序就会检测到代码更改,并且 JBoss 会通过更新代码的周期!!!像魅力一样工作。

这里是设置它的必要步骤;

首先,如果您还没有这样做,请使用 File->New->Other->Server 将 JBoss 服务器添加到 Eclipse,然后执行添加 JBoss AS 7 服务器的动作。确保找到您正在使用的目录。

添加后,向下看 Eclipse 底部附近的“服务器”选项卡。您应该会看到您的 JBoss 服务器。突出显示它并查找“添加或删除...”。从那里你应该看到你的项目。

添加后,对您的代码进行一些小改动,然后观看 JBoss 为您进行热部署。

【讨论】:

【参考方案13】:

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

【讨论】:

是的,它有效。这是我在 jboss5 上获得的唯一能够正确执行此操作的产品。如果你在 jboss7 上,你不需要 jrebel 来获得 jsp 热部署。如果你在standalone.xml 中打开 jsp-development 标志,它就像 jboss7tools 的黄油一样工作。【参考方案14】:

使用 Ant 脚本并进行目标部署。

部署目标应该:

    停止 JBoss 将ear或war复制到部署目录 启动 JBoss

==> 在测试期间进行后续部署后,没有缓存 + 也没有内存不足的问题。

【讨论】:

重启服务器不是热部署。 这在实践中也很可怕,因为 jboss 5 有严重的重启时间【参考方案15】:

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

你是用eclipse还是命令行还是??

当我使用命令行时,我想我做了“seam clean”或“seam undeploy”,甚至可能是“seam restart”,然后是“seam explode”。我可能一次又一次地尝试了所有这些,从不费心去查看每个人做了什么。

这个想法是从两个地方删除部署的战争文件

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 时,构建项目就足够了。当我更改 java 源 Build All 时。有可能它们做同样的事情,不同之处在于我的想象,但这些东西的一些组合会为你工作。

你必须观察输出。有时,应用程序不会被清理或取消部署。这将导致看不到您的更改。有时我先关闭服务器,然后重建/清理/部署项目。

希望这会有所帮助。

TDR

【讨论】:

【参考方案16】:

不幸的是,这并不容易。 JBoss 的幕后有更复杂的事情(其中大部分与 ClassLoader 相关)会阻止您对应用程序进行 HOT-DEPLOYING。

例如,如果您的某些类签名发生更改,您将无法进行 HOT-DEPLOY。

到目前为止,使用MyEclipse IDE(Eclipse 的付费发行版)是我发现的唯一可以非常成功地进行热部署的方法。虽然不是 100% 准确。但肯定比 JBoss Tools、Netbeans 或任何其他基于 Eclipse 的解决方案更好。

如果你想看看的话,我一直在寻找免费工具来完成你刚才在 *** 中的 asking 人所描述的内容。

【讨论】:

抱歉,从 maven 目标中获得了“硬部署”。但这让我感到困惑,因为我找到的文档告诉我它就是这么简单(例如redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Getting_Started/…)。我可以看到与 EJB 相关的东西可能会有更复杂的连接的问题.. HOT-DEPLOY,据我了解,是能够在不重新部署的情况下即时更改当前部署的内容。我猜 RedHat 文档调用 HOT-DEPLOY 是为了能够在不重新启动应用程序服务器的情况下部署任何东西。也许我错了。你使用 Eclipse 吗?试试 MyEclipse。有 30 天的试用期,如果您决定试用,价格会非常便宜。 这是应用服务器的一个特性,与IDE无关。

以上是关于在 JBoss 上热部署 - 我如何让 JBoss “看到”变化?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 JBoss/WildFly 在应用程序部署/初始化失败时自动终止?

如何让 Jenkins 将我的项目部署到 JBoss EAP(AS7)

我可以让 JBoss CLI 工具报告导致我的部署失败的异常吗?

如何修改 Jboss 部署战争文件中的文件?

如何解决 JBOSS 部署错误:等待部署者的包?

如何在 jboss 7.1.1 中使用 liferay 6.1.2 中的 jboss 部署 structure.xml?