我有一个maven web应用程序。我正在使用springource工具套件及其内置的tc结构服务器。
每次进行任何更改时,我都必须执行mvn clean install并重新启动服务器。即使是JSP的变化。
我有什么方法可以进行JSP更改,它们会在浏览器中反映出来,就像常规的Web应用程序(不是maven应用程序)一样。
我在互联网上搜索但尚未成功。
仍然没有任何线索。它使开发过程非常缓慢。我查看了jrebel,但它不是免费的,我不是在寻找热门的类部署,而只是JSP的热门部署,javascripts,css等。
答案 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:inplace
在src/main/webapp
中创建爆炸式战争。
这将复制类和lib。如果您只是更改JSP(或其他/ webapp /文件),则无需重复此步骤。
或者,您可以在classes
中为lib
和src/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/targetPath
(resources:copy-resources,
resource
)
根据我的经验,IDE通常将他们的清理和构建UI动作绑定到编译阶段。此外,IDE通常还有一种方法可以将shell命令或maven自定义目标映射到其UI菜单中。
插件已绑定到编译阶段。要确保在编译阶段结束时资源插件之前运行干净插件,请将它们放在插件部分的末尾。如果一个插件定义了两次并不重要,只要确保从顶部读取pom时,第一个干净插件定义出现在第一个资源插件定义之前。
在execution
标记下更改两者,如下所示:
<id>default-cli</id>
<phase>never</phase>
现在它不会在compile
阶段运行,而是从命令行调用:
mvn clean:clean resources:copy-resources
在这种情况下,插件定义在pom中的放置是无关紧要的,因为您使用命令参数顺序定义它们的顺序。如果这适合您,您的IDE最有可能将此命令映射为可从其UI菜单中看到的自定义目标。
在这两种情况下,我建议首次运行时备份项目文件夹。