您可以使用 clean 和 resources 插件轻松清理和复制静态文件,但它并不总是适用于 JSP 文件。如果要复制的 JSP 文件中的 java 源引入了新的依赖项,则您不会将其复制到 lib 文件夹。在这种情况下,应用程序将因ClassNotFoundException而中断。
即使它被复制,它仍然可能中断,因为必须将服务器配置为扫描具有依赖关系的文件夹并刷新类路径。我相信这就是热部署的开始(详情)。
也试试 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
必须是绝对路径或以 a${project.basedir}
或类似开头。以 开头的属性path.element
是相对路径,这意味着它们不能以 a/
开头或以另一个绝对路径的属性开头。之所以如此,是因为资源插件在outputDirectory/targetPath
( )中复制resources:copy-resources,
resource
以我的经验,IDE 通常将他们的 clean-and-build 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 中的位置无关紧要,因为您使用命令参数 order 定义它们的顺序。如果这适合您,您的 IDE 很可能有办法将此命令映射为从其 UI 菜单可见的自定义目标。
在这两种情况下,我建议在第一次运行时备份项目文件夹。