You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:24:57