基于Ant(subant)的遗留Java项目升级为Maven的可行方案问询
可行性分析与实现方案
完全可以采用Maven <module> 聚合模式完成迁移,不需要拆分共享源码,也不用依赖maven-ant-run插件。核心思路是利用Maven的源码目录配置与筛选规则,让每个子模块仅编译共享src目录中属于自己的代码包。
步骤1:调整项目结构
保持原有的统一src目录在父项目根路径下,同时在父项目下创建6个子模块目录(与原Ant模块名一致:CMEjbModule、OtherEjbModule、MyJarModule、MyJar2Module等),每个子模块下只放自己的pom.xml,无需单独创建src目录。
父项目根结构示例:
parent-project/ ├── src/ │ ├── main/java/ │ │ ├── com/ │ │ │ ├── myproject/ │ │ │ │ ├── tool/ │ │ │ │ ├── business/ │ │ │ │ ├── ejb/ │ │ │ │ │ ├── cm/ │ │ │ │ │ ├── other/ │ ├── main/resources/ ├── CMEjbModule/ │ └── pom.xml ├── OtherEjbModule/ │ └── pom.xml ├── MyJarModule/ │ └── pom.xml ├── MyJar2Module/ │ └── pom.xml └── pom.xml
步骤2:父项目pom.xml配置
父项目作为聚合与继承的顶层,packaging设为pom,并声明所有子模块:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.myproject</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <modules> <module>CMEjbModule</module> <module>OtherEjbModule</module> <module>MyJarModule</module> <module>MyJar2Module</module> <!-- 补充剩余两个模块 --> </modules> <!-- 统一管理依赖版本,子模块可直接继承 --> <dependencyManagement> <dependencies> <!-- EJB 3.0依赖示例 --> <dependency> <groupId>javax.ejb</groupId> <artifactId>javax.ejb-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- 其他项目依赖统一声明 --> </dependencies> </dependencyManagement> </project>
步骤3:子模块pom.xml配置
普通JAR模块(如MyJarModule)
指定源码目录为父项目的src/main/java,通过includes筛选需要编译的包路径:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.myproject</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> </parent> <artifactId>MyJarModule</artifactId> <packaging>jar</packaging> <build> <!-- 指向父项目的源码目录 --> <sourceDirectory>${project.parent.basedir}/src/main/java</sourceDirectory> <resources> <resource> <directory>${project.parent.basedir}/src/main/resources</directory> <!-- 筛选当前模块需要的资源文件 --> <includes> <include>com/myproject/tool/**</include> <include>com/myproject/business/common/**</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <!-- 仅编译指定包下的Java文件 --> <includes> <include>com/myproject/tool/**/*.java</include> <include>com/myproject/business/common/**/*.java</include> </includes> </configuration> </plugin> </plugins> </build> </project>
EJB 3.0模块(如CMEjbModule)
packaging设为ejb,同样指定共享源码目录,配合maven-ejb-plugin生成符合规范的EJB包:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.myproject</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> </parent> <artifactId>CMEjbModule</artifactId> <packaging>ejb</packaging> <dependencies> <!-- 依赖EJB API,父项目已统一版本 --> <dependency> <groupId>javax.ejb</groupId> <artifactId>javax.ejb-api</artifactId> <scope>provided</scope> </dependency> <!-- 依赖其他JAR模块时直接添加 --> <dependency> <groupId>com.myproject</groupId> <artifactId>MyJarModule</artifactId> <version>1.0.0</version> </dependency> </dependencies> <build> <sourceDirectory>${project.parent.basedir}/src/main/java</sourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <version>3.2.0</version> <configuration> <!-- 指定EJB版本为3.0,无需ejb-jar.xml --> <ejbVersion>3.0</ejbVersion> <!-- 不需要生成客户端包可设为false --> <generateClient>false</generateClient> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <includes> <include>com/myproject/ejb/cm/**/*.java</include> <include>com/myproject/business/cm/**/*.java</include> </includes> </configuration> </plugin> </plugins> </build> </project>
关键注意事项
- 依赖顺序:如果子模块之间存在依赖(如EJB模块依赖JAR模块),Maven会自动按依赖顺序编译,确保编译时依赖类已存在。
- 测试代码:若有统一的测试目录,可在子模块中配置
testSourceDirectory,同样用includes筛选对应测试类。 - 冲突避免:确保每个包仅被一个子模块编译,避免重复打包同一类到多个JAR中。
- 资源文件:根据模块需求筛选资源,避免不必要的资源被打包进模块JAR。
内容的提问来源于stack exchange,提问作者Frank Cherry
相关产品推荐
相关产品推荐

