HotSwaping代码变成“mvnDebug tomcat:run”

通常我使用mvnDebug tomcat:run启动tomcat。

代码更改后我需要使用mvn tomcat:redeploy

这是次优的,因为我经常只改变现有方法体的内容。

我可以将方法的主体热切换到运行时,并将热重新部署作为后备吗?

不幸的是,我发现像maven-hotswap-plugin

faces-config.xml中

 ...  com.sun.facelets.FaceletViewHandler  de_DE   Message message  org.springframework.web.jsf.el.SpringBeanFacesELResolver   

web.xml中:

  org.springframework.web.context.ContextLoaderListener    org.springframework.web.context.request.RequestContextListener   

pom.xml中:

   org.hibernate hibernate-envers 4.3.0.Final   net.java.dev.ajax4jsf ajax4jsf 1.0.6   org.hibernate hibernate-core 3.6.6.Final   commons-lang commons-lang 2.3   org.apache.myfaces.core myfaces-api 1.2.10 compile   org.apache.myfaces.core myfaces-impl 1.2.10 runtime   org.apache.myfaces.tomahawk tomahawk12 1.1.9 runtime   javax.servlet jstl 1.2 runtime   com.sun.facelets jsf-facelets 1.1.14   org.hibernate hibernate-validator 3.1.0.GA   org.springframework spring 2.5.6   org.postgresql postgresql 9.2-1004-jdbc41   servletapi servlet-api 2.4 provided      org.apache.tomcat.maven tomcat7-maven-plugin 2.2  true     

您可以使用Jrebel – 它完全按照您的预期工作。 您只需要指定javaagent,它将在运行时重新加载所有类和框架更改。 它也适用于远程服务器

要将它与maven项目集成,您必须添加jrebel-maven-plugin ,它将生成所有配置(rebel.xml)文件。

如果没有JRebel,您可以使用标准的HotSwap机制,但它只允许重新加载方法体

JRebel是个不错的选择。 它并不便宜,但有可用的开源许可证。 Maven的安装说明如下:http: //zeroturnaround.com/software/jrebel/learn/maven/

我们通过特定的运行配置文件和嵌入式Tomcat来实现这一点。 这是一个特定的子模块,它依赖于构建Web应用程序之战的其他项目。 因此,如果在runner子模块中配置类似以下内容:

   run    org.apache.tomcat.maven tomcat7-maven-plugin   run-wars  run-war-only  integration-test    theWar /relativepath    ${project.groupId} myArtifact ${project.version} war true myContext         

您可以使用mvn package -Prun运行它,您应该可以使用Ctrl+C关闭它。

然后,当它在一个终端中运行时,进行代码更改,打开一个新终端并运行mvn compile 。 随着JRebel的推移,应该会在您的网络应用中立即反映出这些变化。

应该没有什么能阻止你通过Eclipse的m2e插件运行这些相同的目标。

JRebel是您的最佳解决方案之一

  • 您需要做的是对框架进行适当的更改并使用jrebel-maven-plugin对其进行集成。
    它允许重新加载所有方法体。
  • 完成链接后,将生成一个auto xml配置文件,该文件将用作插件的配置文件。
  • 提及您的Java代理。
  • 成功测试后,您还可以将其与构建集成

看来你可能正在使用maven tomcat插件的一些旧版本,因为较新的版本应该被称为tomcat6或tomcat7,e..g。 mvnDebug tomcat7:run 。 我在2.2上,Eclipse的热插拔工作得很好。

为了澄清一点,这是我在使用mvn tomcat:run启动应用程序时在命令提示符中看到的mvn tomcat:run

 ... [INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) @ tomcatMvnDebug >>> ... 

请注意1.1

这就是我用mvn tomcat7:run启动应用程序时mvn tomcat7:run

 ... [INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ tomcatMvnDebug >>> ... 

请注意,这次maven使用tomcat插件版本2.2

我将使用Eclipse或IntelliJ的HotSwap函数。 它们对我来说都很好用:只需在调试模式下运行maven目标(tomcat:run)。

我们通常使用已经具有重载function的grails开发Web应用程序,我相信它是使用弹簧加载的插件完成的。 它可能是jRebel的替代品(虽然我不确定它是否适合你,但如果你想节省几百美元,可能值得尝试)。

所以,基本上我看到以下选项:

  • 使用已经支持重新加载类的框架(Grails,Play)
  • 使用像spring-loaded或JRebel这样的javaagent
  • 使用集成到IDE中的一些javaagent(我使用IntelliJ IDEA并强烈推荐它。不确定它是否适用于免费社区版)。

https://github.com/spring-projects/spring-loaded

有一个maven插件 。 它似乎没有得到维护。 但是从简短的源代码看我相信你可以使它工作。

它基于类似的ant插件 ,所以您也可以使用maven antrun来执行此操作

然而,它将在任何IDE中具有与hotswap相同的function(和限制)。