通常我使用mvnDebug tomcat:run
启动tomcat。
代码更改后,我需要使用mvn tomcat:redeploy
。
这是次优的,因为我经常只改变现有方法体的内容。
我可以将方法的主体HotSwap到运行时,并将热重新部署作为后备吗?
我遗憾地发现没有像maven-hotswap-plugin
那样的人。
... <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>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<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>
答案 0 :(得分:8)
您可以使用Jrebel - 它完全按照您的预期运作。您只需要指定javaagent,它将在运行时重新加载所有类和框架更改。它也适用于远程服务器
要将其与maven项目集成,您必须添加jrebel-maven-plugin,这将生成所有配置(rebel.xml)文件。
如果没有JRebel,您可以使用标准的HotSwap机制,但它只允许重新加载方法主体
答案 1 :(得分:2)
JRebel是个不错的选择。它并不便宜,但有可用的开源许可证。 Maven的安装说明如下: http://zeroturnaround.com/software/jrebel/learn/maven/
我们通过特定的运行配置文件和嵌入式Tomcat来实现这一点。这是一个特定的子模块,它依赖于构建Web应用程序之战的其他项目。因此,如果在runner子模块中配置如下内容:
<profiles>
<profile>
<id>run</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<executions>
<execution>
<id>run-wars</id>
<goals>
<goal>run-war-only</goal>
</goals>
<phase>integration-test</phase>
</execution>
</executions>
<configuration>
<warDirectory>theWar</warDirectory>
<path>/relativepath</path>
<systemProperties>
<webapps>
<webapp>
<groupId>${project.groupId}</groupId>
<artifactId>myArtifact</artifactId>
<version>${project.version}</version>
<type>war</type>
<asWebapp>true</asWebapp>
<contextPath>myContext</contextPath>
</webapp>
</webapps>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
您可以使用mvn package -Prun
运行此功能,您可以使用Ctrl+C
关闭该功能。
然后,当它在一个终端中运行时,更改代码,打开一个新终端并运行mvn compile
。随着JRebel的推移,更改应该立即在您的Web应用程序中立即反映出来。
应该没有什么能阻止你通过Eclipse的m2e插件运行这些相同的目标。
答案 2 :(得分:2)
适合您情况的最佳解决方案之一是JRebel
答案 3 :(得分:1)
您似乎可能正在使用某些旧版本的maven tomcat插件,因为较新的版本应该称为tomcat6或tomcat7,e..g。 mvnDebug tomcat7:run
。我在2.2上,Eclipse的热插拔工作正常。
为了澄清一点,这是我在使用mvn tomcat:run
启动应用时在命令提示符中看到的内容:
...
[INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) @ tomcatMvnDebug >>>
...
请注意 1.1 。
这就是我在使用mvn tomcat7:run
启动应用时看到的内容:
...
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ tomcatMvnDebug >>>
...
请注意,此时maven使用tomcat插件版本 2.2 。
答案 4 :(得分:0)
我使用Eclipse或IntelliJ的HotSwap函数。它们对我来说都很好用:只需在调试模式下运行maven目标(tomcat:run)。
答案 5 :(得分:0)
我们通常使用已经具有重载功能的grails开发Web应用程序,我相信它是使用弹簧加载的插件完成的。它可能是jRebel的替代品(虽然我不确定它是否适合你,但如果你想节省几百美元,可能值得一试)。
所以,基本上我看到以下选项:
答案 6 :(得分:-1)
有一个maven plugin。它似乎没有得到维护。但是,从简短的源代码看,我相信你可以使它工作。
它基于类似的plugin for ant,所以您也可以使用maven antrun执行此操作
然而,它将具有与任何IDE中的hotswap相同的功能(和限制)。