57

I am developing a Java EE application that I deploy over and over again on a local JBoss installation during development. I want to speed up the build by hot deploying my application straight into [JBOSS]/server/default/deploy/myApp

It seems to work - but there also seems to be a somewhat arbitrary delay between the hard deploy and when JBoss starts using the new classes. I am not very familiar with JBoss, but I assume it caches classes, and that this is what causes the problem.

Am I correct, and if so, how do I make JBoss flush it's cache?

Jacob Hansson
  • 149
  • 3
  • 7
  • 19

17 Answers17

114

I had the same problem in my bundle: (Eclipse IDE + JBoss server adapter) + JBoss AS 7.0.1 (community project).

My solution is very simple - you should go to JBoss administrative panel (by default localhost:9990), there in profile settings open Core - Deployment Scanners. Turn on Autodeploy-Exploded (set to true), and by your wishes you can set scanner time (by default 5000 ms) to appropriate for your (I set to 2000, for more fast incremental publish in Eclipse when I make changes to projects). That's it. Now JBoss makes HOT deploy not only for HTML (JSF, XHTML and so on) files, but also takes care of POJO classes (beans and so on) files.

Morgan Thrapp
  • 9,748
  • 3
  • 46
  • 67
Yan Pak
  • 1,767
  • 2
  • 19
  • 15
  • 3
    Wondeful ! works like a charm and it tooked me only 3 minutes, after adding a user with $catalina_home/bin/add-user.sh – Nicolas Zozol Mar 29 '13 at 21:08
  • 3
    This setting really help re-deploy the war, however it causes to restart my war and all of my application's sessions are clear. – Steve Lam Oct 28 '13 at 03:20
  • 2
    Thats not the right way IMO. Why clearing all sessions when I only make changes in static files like XHTML and CSS files. I would accept it, if I make changes to Java classes, but not on static files. – AdemC May 20 '15 at 15:14
  • What do you exactly mean by "but also takes care of POJO classes (beans and so on) files." ? I suppose hot-deployment is only meant for static changes (UI, xhtml, etc.), as the other desired changes that need to be done in the Java classes, require you to rebuild the project, as they are all .class files , so you cannot modify them. – teobais Oct 02 '15 at 13:28
  • When I turned this on, the following message appeared in the log files: 10:50:04,343 WARN [org.jboss.as.server.deployment.scanner] (HttpManagementService-threads - 3) JBAS015005: Reliable deployment behaviour is not possible when auto-deployment of exploded content is enabled (i.e. deployment without use of ".dodeploy"' marker files). Configuration of auto-deployment of exploded content is not recommended in any situation where reliability is desired. Configuring the deployment scanner's auto-deploy-exploded setting to "false" is recommended. – Louis St-Amour Jan 26 '16 at 15:51
  • For Wildfly 9, this answer is still valid but a different path should be followed: management console -> configuration -> Subsystems -> Deployment Scanners. – Ad Infinitum Jul 07 '17 at 08:21
  • One thing that made it work for me: do not deploy as compressed files. In eclipse Wildfly config, do NOT check the option "Deploy projects as compressed archives" – Edu Castrillon Aug 22 '17 at 09:36
  • Still works fine on JBoss EAP 7. For me, changes to .properties-files didn't hot deploy. – Thomas Feb 14 '18 at 13:22
  • 1
    You can add `auto-deploy-exploded="true"` in _standalone.xml_ (or full) in your development environment (only), see the best answer [here](https://stackoverflow.com/a/29772123/9160102) – Bruno L. May 30 '20 at 07:27
8

Unfortunately, it's not that easy. There are more complicated things behind the scenes in JBoss (most of them ClassLoader related) that will prevent you from HOT-DEPLOYING your application.

For example, you are not going to be able to HOT-DEPLOY if some of your classes signatures change.

So far, using MyEclipse IDE (a paid distribution of Eclipse) is the only thing I found that does hot deploying quite successfully. Not 100% accuracy though. But certainly better than JBoss Tools, Netbeans or any other Eclipse based solution.

I've been looking for free tools to accomplish what you've just described by asking people in StackOverflow if you want to take a look.

Community
  • 1
  • 1
Pablo Santa Cruz
  • 176,835
  • 32
  • 241
  • 292
  • Sorry, got the "hard deploy" from the maven goal for doing that. This confuses me though, as the documentation I find tells me it is just that easy (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 for example). I can see how it would be a problem with EJB-related stuff that might have more intricate connections though.. – Jacob Hansson Jun 09 '09 at 12:20
  • 3
    HOT-DEPLOY, as far as I understand, is the ability to change ON-THE-FLY what's currently deployed without redeploying it. I guess RedHat documentation call HOT-DEPLOY to the ability of deploy anything without RESTARTING the application server. Maybe I am wrong. Do you use Eclipse? Give MyEclipse a try. There is a 30-day trial and it's pretty cheap if you decide to go for it. – Pablo Santa Cruz Jun 09 '09 at 12:39
  • 4
    it's a feature of the app server, has nothing related to the IDE. – Jackie Dec 21 '11 at 03:02
6

You should try JRebel, which does the hot deploy stuff pretty well. A bit expensive, but worth the money. They have a trial version.

Julien Kronegg
  • 4,968
  • 1
  • 47
  • 60
  • 2
    yep it works. this is the ONLY product i've gotten that does this correctly on jboss5. if you are on jboss7, you don't need jrebel to get jsp hot deploy.if you turn on the jsp-development flag in the standalone.xml it works like butter with jboss7tools. – Nicholas DiPiazza Feb 26 '16 at 18:29
4

Just my two cents:

  • Cold deployment is the way of deploying an application when you stop it (or stop the whole server), then you install the new version, and finally restart the application (or start the whole server). It's suitable for official production deployments, but it would be horrible slow to do this during development. Forget about rapid development if you are doing this.

  • Auto deployment is the ability the server has to re-scan periodically for a new EAR/WAR and deploy it automagically behind the scenes for you, or for the IDE (Eclipse) to deploy automagically the whole application when you make changes to the source code. JBoss does this, but JBoss's marketing department call this misleadingly "hot deployment". An auto deployment is not as slow compared to a cold deployment, but is really slow compared to a hot deployment.

  • Hot deployment is the ability to deploy behind the scenes "as you type". No need to redeploy the whole application when you make changes. Hot deployment ONLY deploys the changes. You change a Java source code, and voila! it's running already. You never noticed it was deploying it. JBoss cannot do this, unless you buy for JRebel (or similar) but this is too much $$ for me (I'm cheap).

Now my "sales pitch" :D

What about using Tomcat during development? Comes with hot deployment all day long... for free. I do that all the time during development and then I deploy on WebSphere, JBoss, or Weblogic. Don't get me wrong, these three are great for production, but are really AWFUL for rapid-development on your local machine. Development productivity goes down the drain if you use these three all day long.

In my experience, I stopped using WebSphere, JBoss, and Weblogic for rapid development. I still have them installed in my local environment, though, but only for the occasional test I may need to run. I don't pay for JRebel all the while I get awesome development speed. Did I mention Tomcat is fully compatible with JBoss?

Tomcat is free and not only has auto-deployment, but also REAL hot deployment (Java code, JSP, JSF, XHTML) as you type in Eclipse (Yes, you read well). MYKong has a page (https://www.mkyong.com/eclipse/how-to-configure-hot-deploy-in-eclipse/) with details on how to set it up.

Did you like my sales pitch?

Cheers!

Community
  • 1
  • 1
Vladimir
  • 1
  • 2
2

Hot deployment is stable only for changes on static parts of the application (jsf, xhtml, etc.).

Here is a working solution, according to JBoss AS 7.1.1.Final:

  • Build your project.
  • Navigate to [JBOSS_HOME]/standalone/tmp/vfs.
  • Open the most recently modified folder named "deployment[some_alphanumeric_values]", i.e. "deployment344b1c870c8edbd".
  • Navigate to the specific view that you want to edit (usually, this is included into the packaged .war folder) and open it with a text editor (i.e. Notepad++).
  • Make the changes you want and save the file.
  • Refresh the respective page on your browser. The changes should be visible now.
  • When finished, don't forget to copy these changes to your actual development environment, rebuild and redeploy.

    teobais
    • 2,820
    • 1
    • 24
    • 36
    2

    This worked for me in Eclipse Mars with WildFly 11. Double-click on WildFly server under Servers to open the configuration page. In the Overview tab -> Publishing, choose "Automatically publish when resources change" and set the interval to 1. Next, Overview tab -> Application Reload Behavior, uncheck the use default pattern and set the pattern to \.jar$|\.class$. In the Deployment tab, uncheck Deploy project as compressed archives. Hope this helps.

    jpllosa
    • 2,066
    • 1
    • 28
    • 30
    1

    Found the solution on this link:

    What to do:

    1. configure exploded war artifact to have extension .war
    2. deploy exploded artifact to WildFly or Jboss
    3. configure IntelliJ to Update Resources on Update Action

    When I modify a page (web), I update and when I refresh web browser: is all there with my mod. I did configured Jboss for autoscanning (not sure it did helped)

    JMarques
    • 3,044
    • 4
    • 34
    • 55
    Mircea Stanciu
    • 3,675
    • 3
    • 34
    • 37
    1

    I am using JBoss AS 7.1.1.Final. Adding following code snippet in my web.xml helped me to change jsp files on the fly :

    <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>
    

    Hope this helps.!!

    1

    I have had the same problem, but think I've got it under control now.

    Are you using eclipse or command line or ??

    When I use the command line, I think I did "seam clean" or "seam undeploy" or maybe even "seam restart" followed by "seam explode". I probably tried all of these at one time or another never bothering to look up what each one does.

    The idea is to remove the deployed war file from TWO places

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

    I'm pretty sure "seam undeploy" removes the 1st and "seam clean" removes the 2nd.

    When I use eclipse (I use the free one), I first turn off "Project/Build Automatically" Then when I am ready to deploy I do either Project/Build Project or Project/Build All depending on what I've changed. When I change xhtml, Build Project is sufficient. When I change java source Build All works. It's possible these do the same things and the difference is in my imagination, but some combination of this stuff will work for you.

    You have to watch the output though. Occasionally the app does not get cleaned or undeployed. This would result in not seeing your change. Sometimes I shut down the server first and then rebuild/clean/deploy the project.

    Hope this helps.

    TDR

    0

    Actually my problem was that the command line mvn utility wouldn't see the changes for some reason. I turned on the Auto-deploy in the Deployment Scanner and there was still no difference. HOWEVER... I was twiddling around with the Eclipse environment and because I had added a JBoss server for it's Servers window I discovered I had the ability to "Add or Remove..." modules in my workspace. Once the project was added whenever I made a change to code the code change was detected by the Deployment Scanner and JBoss went thru the cycle of updating code!!! Works like a charm.

    Here are the steps necessary to set this up;

    First if you haven't done so add your JBoss Server to your Eclipse using File->New->Other->Server then go thru the motions of adding your JBoss AS 7 server. Being sure to locate the directory that you are using.

    Once added, look down near the bottom of Eclipse to the "Servers" tab. You should see your JBoss server. Highlight it and look for "Add or Remove...". From there you should see your project.

    Once added, make a small change to your code and watch JBoss go to town hot deploying for you.

    Perry
    • 35
    • 3
    0

    I've been developing a project with Eclipse and Wildfly and the exploded EAR file was getting big due to deploying of all the 3rd party libraries I needed in the application. I was pointing the deployment to my Maven repository which I guess was recopying the jars each time. So redeploying the application when ever I changed Java code in the service layer was turning into a nightmare.

    Then having turned to Hotswap agent this helped a lot as far as seeing changes to EJB code without redeploying the application.

    However I have recently upgraded to Wildfly 10, Java 8 and JBoss Developer Studio 10 and during that process I took the time to move all my 3rd party application jars e.g. primefaces into Wildfly modules and I removed my Maven repo from my deployment config. Now redeploying the entire application which is a pretty big one via Eclipse takes just a few seconds and it is much much faster than before. I don't even feel the need to install Hotswap and don't want to risk it anyway right now.

    So if you are building under Eclipse with Wildfly then keep you application clear of 3rd party libs using Wildfly Modules and you'll be much better off.

    Shaun O'Hagan
    • 191
    • 1
    • 5
    0

    Solution for Netbeans 8.02 and 8.1 IDE and JBOSS EAP 6.4:

    1. From the services tab of Netbeans, add JBOSS server to your "servers" node.
    2. If you are using MAVEN, netbeans compiles files and maven copies files to ./target directory. You need to create a symbolic link from .\target to JBOSS_HOME\standalone\deployments. Under windows, an example command would be

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

      The above creates a symbolic link from %JBOSS_HOME%\standalone\deployments\MyWebApplication.war to \target\MyWebApplication-1.0.0 which is where maven transfers all files after compilation, or after a jsp, html or any other file changes.

    3. Last think to do is to create a CentralManagement.war.dodeploy file in %JBOSS_HOME%\standalone\deployments. This file will tell JBOSS to deploy the war "file" as a web application

    chrisl08
    • 1,658
    • 1
    • 15
    • 24
    0

    Start the server in debug mode and It will track changes inside methods. Other changes It will ask to restart the module.

    erickdeoliveiraleal
    • 708
    • 2
    • 9
    • 21
    0

    Deploy the app as exploded (project.war folder), add in your web.xml:

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

    Update the web.xml time every-time you deploy (append blank line):

    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
    
    0

    In case you are working with the Eclipse IDE there is a free plugin Manik-Hotdeploy.

    This plugin allows you to connect your eclipse workspace with your wildfly deployment folder. After a maven build your artifact (e.g. war or ear) will be automatically pushed into the deployment folder of your server. Also web content files (e.g. .xhtml .jsf ...) will be hot deployed.

    The plugin runs for wildfly, glassfish and payara.

    Read the section JBoss/Wildfly Support for more details.

    Ralph
    • 4,500
    • 9
    • 48
    • 87
    0

    In jboss-5.2.0-eap\server\default\deploy\hdscanner-jboss-beans.xml

        <property name="scanPeriod">2000</property>
    

    And, in your 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>
    
    -7

    Use Ant script and make target deploy.

    The deploy target should:

    1. Stop JBoss
    2. Copy the ear or war to the deploy directory
    3. Start JBoss

    ==> No caching + also no out of memory issues after subsequent deploys during testing.

    Shadow The GPT Wizard
    • 66,030
    • 26
    • 140
    • 208
    ruben
    • 1
    • 1