Java – hotswaping code to “mvndebug Tomcat: run”
Usually I use mvndebug Tomcat: run to start Tomcat
After the code changes, I need to use MVN Tomcat: redeploy
This is suboptimal because I often only change the content of the existing method body
Can I the method's body HotSwap to the runtime and hot redeploy it as a fallback?
Unfortunately, I found it like maven HotSwap plugin
faces-config. In XML
... <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> <locale-config> <default-locale>de_DE</default-locale> </locale-config> <resource-bundle> <base-name>Message</base-name> <var>message</var> </resource-bundle> <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> </application> </faces-config>
web. In XML:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>
pom. In XML:
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> <version>4.3.0.Final</version> </dependency> <dependency> <groupId>net.java.dev.ajax4jsf</groupId> <artifactId>ajax4jsf</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.6.Final</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-api</artifactId> <version>1.2.10</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-impl</artifactId> <version>1.2.10</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.myfaces.tomahawk</groupId> <artifactId>tomahawk12</artifactId> <version>1.1.9</version> <scope>runtime</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.sun.facelets</groupId> <artifactId>jsf-facelets</artifactId> <version>1.1.14</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>3.1.0.GA</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.2-1004-jdbc41</version> </dependency> <dependency> <groupId>servletapi</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <contextReloadable>true</contextReloadable> </configuration> </plugin> </plugins> </build>
Solution
You can use jrebel – it works exactly as you expect You only need to specify the Java agent, which will reload all class and framework changes at run time It also applies to remote servers
To integrate it with the Maven project, you must add the jrebel Maven plugin, which will generate all the configuration (rebel. XML) files
Without jrebel, you can use the standard HotSwap mechanism, but it only allows you to reload the method body