使用Maven JspC插件是否会导致扫描到的jar文件被锁定?
你的判断正确,两款jspc-maven-plugin均存在JSP编译阶段加载依赖Jar后未主动释放文件句柄的共性缺陷,你的配置没有问题。
两款插件底层都依赖Apache Jasper编译器处理JSP文件,Jasper在编译过程中需要读取依赖Jar中的标签库定义、业务类等资源,默认会以Windows系统下的独占文件锁模式打开Jar文件。而你使用的两个版本的插件均未在编译任务完成后主动执行类加载器销毁、资源释放的逻辑,编译线程结束后操作系统不会立即回收文件句柄锁,就会导致后续maven-war-plugin执行文件复制操作时触发占用报错。不同插件锁定的Jar文件不同,是因为二者的依赖加载顺序存在差异。
对应的解决方案如下:
- 临时规避方案:在
jspc插件的执行逻辑之后、maven-war-plugin执行之前,插入一段等待逻辑给系统留出文件锁释放的时间,可以通过maven-antrun-plugin实现,配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>wait-for-file-lock-release</id> <phase>prepare-package</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <sleep seconds="2"/> </tasks> </configuration> </execution> </executions> </plugin>
调整插件的<execution>顺序,确保该任务在JSP编译任务之后运行即可。
- 根本修复方案:可以向对应插件的官方仓库提交Issue,要求在编译逻辑结束后新增资源释放代码;也可以自行修改插件源码,在JSP编译完成后主动关闭Jasper对应的类加载器、清理临时打开的文件资源。
- 替代方案:如果业务允许不提前预编译JSP,可以关闭打包阶段的JSP预编译逻辑,改为应用容器启动时动态编译JSP,彻底避开该问题。
内容的提问来源于stack exchange,提问作者David Hofmann
相关产品推荐
相关产品推荐

