如何用Maven自动构建javax与jakarta双版本Servlet工具类库
实现方案(全程仅操作target目录,无原源码污染风险)
核心逻辑是先将原源码完整复制到target下的临时构建目录,在临时目录完成javax到jakarta的import替换后,仅编译临时目录代码生成产物,全程不修改src目录下的任何文件,不会干扰Git状态。
以下配置均添加到你的jakarta专属Maven Profile中即可:
1. 复制原源码到target临时目录
通过maven-resources-plugin在构建初期把所有Java源码复制到target/generated-sources/jakarta目录:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>copy-sources-for-jakarta</id> <phase>generate-sources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/generated-sources/jakarta</outputDirectory> <resources> <resource> <directory>src/main/java</directory> <filtering>false</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin>
2. 批量替换临时目录下的import语句
使用maven-replacer-plugin仅修改临时目录中的Java文件,完成javax.servlet到jakarta.servlet的命名空间替换:
<plugin> <groupId>com.google.code.maven-replacer-plugin</groupId> <artifactId>replacer</artifactId> <version>1.5.3</version> <executions> <execution> <id>replace-javax-to-jakarta</id> <phase>generate-sources</phase> <goals> <goal>replace</goal> </goals> <configuration> <basedir>${project.build.directory}/generated-sources/jakarta</basedir> <includes> <include>**/*.java</include> </includes> <replacements> <replacement> <token>import javax.servlet</token> <value>import jakarta.servlet</value> </replacement> <!-- 如有其他需要迁移的javax命名空间,可在此处新增替换规则 --> </replacements> </configuration> </execution> </executions> </plugin>
3. 配置编译规则,仅编译临时目录代码
通过build-helper-maven-plugin将临时目录加入编译源,同时配置maven-compiler-plugin排除原src目录的源码,避免冲突:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.4.0</version> <executions> <execution> <id>add-jakarta-source-root</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/jakarta</source> </sources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <excludes> <exclude>**/*.java</exclude> </excludes> <includes> <include>${project.build.directory}/generated-sources/jakarta/**/*.java</include> </includes> </configuration> </plugin>
可选优化
如果后续命名空间替换规则变复杂,可替换maven-replacer-plugin为OpenRewrite的Jakarta EE迁移配方,可自动完成全量javax到jakarta的命名空间迁移,同样仅操作临时目录不影响原源码。
内容的提问来源于stack exchange,提问作者morgwai
相关产品推荐
相关产品推荐

