如何在maven应用程序中热部署JSP更改?

时间:2013-06-02 10:30:05

标签: maven hotdeploy tcserver

我有一个maven web应用程序。我正在使用springource工具套件及其内置的tc结构服务器。

每次进行任何更改时,我都必须执行mvn clean install并重新启动服务器。即使是JSP的变化。

我有什么方法可以进行JSP更改,它们会在浏览器中反映出来,就像常规的Web应用程序(不是maven应用程序)一样。

我在互联网上搜索但尚未成功。

仍然没有任何线索。它使开发过程非常缓慢。我查看了jrebel,但它不是免费的,我不是在寻找热门的类部署,而只是JSP的热门部署,javascripts,css等。

4 个答案:

答案 0 :(得分:5)

我目前使用配置文件将JSP复制到我的目标目录,一旦我需要更新JSP,我就会从Eclipse调用它。 您还可以通过添加执行来复制这样的类文件。

<profile>
    <id>copyJsps</id>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <outputDirectory>${basedir}/target/app/WEB-INF/jsp</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/webapp/WEB-INF/jsp</directory>
                            <filtering>true</filtering>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

使用:mvn resources:copy-resources -PcopyJsps

答案 1 :(得分:4)

您可以使用Eclipse Filesync plugin来实现此目的。您可以配置插件以将maven输出文件夹映射到应用程序服务器目录

我知道这不是maven方式,但它有效。

也许这question会提供更多见解。

答案 2 :(得分:1)

这是我在Linux上使用JBoss时的简单解决方案(解决方法?)。它也应该对Tomcat或支持被攻击战争的任何其他容器有效。

1。使用mvn war:inplacesrc/main/webapp中创建爆炸式战争。 这将复制类和lib。如果您只是更改JSP(或其他/ webapp /文件),则无需重复此步骤。 或者,您可以在classes中为libsrc/main/webapp/WEB-INF创建符号链接:

cd src/main/webapp/WEB-INF
ln -s ../../../../target/classes
mvn package
ln -s ../../../../target/*/WEB-INF/lib

2. 在部署目录中创建符号链接到src / main / webapp:

cd $DEPLOYMEN_DIR
ln -s $MYAPP_DIR/src/main/webapp myapp.war

这使得对JSP和其他webapp文件的更改立即可用。 如果您想查看classes中的更改,那么您只能通过修改web.xml来重新启动应用程序。您可以运行此脚本来监视触发重启:

#!/bin/bash
while sleep 1; do 
    if [[ -n $(find WEB-INF/classes -newer WEB-INF/web.xml -type f) ]];then
        date
        touch WEB-INF/web.xml
    fi
done

src/main/webapp/目录运行它。

关于JBoss AS 7的注意事项:为了触发重新加载,您需要创建myapp.war.dodeploy文件,而不是触及web.xml

答案 3 :(得分:0)

您可以使用clean和resources插件轻松地清理和复制静态文件,但它始终不适用于JSP文件。如果要复制的JSP文件中的java源引入了新的依赖项,则不会将其复制到lib文件夹。在这种情况下,应用会以ClassNotFoundException打破。

即使它被复制,它仍然可以中断,因为必须将服务器配置为扫描具有依赖项的文件夹并刷新类路径。这是我相信的热门部署的开始(details)。

也尝试使用Vinay的建议。从他的答案来看,似乎tc服务器默认支持扫描依赖关系,并且通过正确的maven构建,这可能是一个令人满意的解决方案。

清理源文件目录中的静态文件并将其复制到部署目录:

      <plugin>
            <groupId>org.apache.maven.plugins</groupId>           
            <artifactId>maven-clean-plugin</artifactId>
            <version>2.5</version>
            <executions>
                <execution>
                    <id>clean-loaded</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                    <configuration>
                        <excludeDefaultDirectories>true</excludeDefaultDirectories>
                        <filesets>
                            <fileset>
                                <directory>${path.server.input}</directory>
                                <followSymlinks>false</followSymlinks>
                                <useDefaultExcludes>false</useDefaultExcludes>
                                <includes>
                                    <include>**/*.jsp</include>
                                    <include>**/*.js</include>
                                    <include>**/*.html</include>
                                    <include>**/*.css</include>
                                    <include>**/*.png</include>
                                    <include>**/*.gif</include>
                                    <include>**/*.jpg</include>
                                    <include>**/*.jpeg</include>
                                </includes>                               
                            </fileset>
                        </filesets>
                    </configuration> 
                </execution>
            </executions>
        </plugin>

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <executions>
              <execution>
                <id>copy-compile-output</id>                    
                <phase>compile</phase>
                <goals>
                  <goal>copy-resources</goal>
                </goals>
                    <configuration>
                        <outputDirectory>${path.server.input}</outputDirectory>
                        <overwrite>true</overwrite>
                        <includeEmptyDirs>true</includeEmptyDirs>
                        <filtering>true</filtering>
                        <resources>
                            <resource>
                                <directory>${path.jsp.source}</directory>
                                <targetPath>${path.element.jsp.deploy}</targetPath>
                                <includes>
                                    <include>**/*.jsp</include>
                                </includes>
                            </resource>                     
                            <resource>                      
                                <directory>${path.static.source}</directory>
                                <targetPath>${path.element.static.deploy}</targetPath>
                                <includes>
                                    <include>**/*.js</include>
                                    <include>**/*.html</include>
                                    <include>**/*.css</include>
                                    <include>**/*.png</include>
                                    <include>**/*.gif</include>
                                    <include>**/*.jpg</include>
                                    <include>**/*.jpeg</include>
                                </includes>
                            </resource>                     
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

将此添加到您的properties部分:

<path.server.input>ABSOLUTE_PATH_TO_DEPLOYED_WEBAPP_ROOT</path.server.input>
<path.jsp.source>ABSOLUTE_PATH_TO_JSP_SOURCE_ROOT</path.jsp.source>
<path.static.source>ABSOLUTE_PATH_TO_STATIC_SOURCE_ROOT</path.static.source>
<path.element.jsp.deploy>REALTIVE_PATH_TO_JSP_DEPLOY_ROOT</path.element.jsp.deploy>
<path.element.static.deploy>REALTIVE_PATH_TO_STATIC_DEPLOY_ROOT</path.element.static.deploy>

path开头的属性必须是绝对路径,或以${project.basedir}或类似方式开头。以path.element开头的属性是相对路径,这意味着它们不能以/为前缀,也不能以另一个属性为absoulte路径的属性开头。之所以如此,是因为资源插件会在outputDirectory/targetPathresources:copy-resources, resource

中复制

根据我的经验,IDE通常将他们的清理和构建UI动作绑定到编译阶段。此外,IDE通常还有一种方法可以将shell命令或maven自定义目标映射到其UI菜单中。

使用clean-and-build

运行

插件已绑定到编译阶段。要确保在编译阶段结束时资源插件之前运行干净插件,请将它们放在插件部分的末尾。如果一个插件定义了两次并不重要,只要确保从顶部读取pom时,第一个干净插件定义出现在第一个资源插件定义之前。

作为单独的操作运行

execution标记下更改两者,如下所示:

<id>default-cli</id>
<phase>never</phase>

现在它不会在compile阶段运行,而是从命令行调用:

mvn clean:clean resources:copy-resources

在这种情况下,插件定义在pom中的放置是无关紧要的,因为您使用命令参数顺序定义它们的顺序。如果这适合您,您的IDE最有可能将此命令映射为可从其UI菜单中看到的自定义目标。

在这两种情况下,我建议首次运行时备份项目文件夹。