6

通常我使用mvnDebug tomcat:run.

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

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

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

不幸的是,我没有找到像maven-hotswap-plugin.

面孔-config.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>

网页.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.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>
4

7 回答 7

8

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

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

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

于 2014-02-07T15:30:51.540 回答
2

适合您情况的最佳解决方案之一是JRebel

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

看来您可能正在使用一些旧版本的 maven tomcat 插件,因为较新的版本应该称为 tomcat6 或 tomcat7,例如 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

于 2014-02-11T20:11:17.977 回答
1

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 插件运行这些相同的目标。

于 2014-02-07T16:17:55.043 回答
0

我们一般使用 grails 开发 web 应用程序,它已经具有 reload 功能,我相信它是通过 spring-loaded 插件完成的。它可能是 jRebel 的替代品(虽然我不确定它是否适合你,但如果你想节省几百美元,可能值得一试)。

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

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

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

于 2014-02-14T00:20:40.960 回答
0

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

于 2014-02-13T15:03:31.730 回答
-1

有一个Maven 插件。好像没有维护。但是,从简短的源代码来看,我相信你可以让它工作。

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

尽管如此,它将具有与任何 IDE 中的热插拔相同的功能(和限制)。

于 2014-02-10T16:25:17.893 回答