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

Maven多模块项目:如何从单点构建全模块并运行子模块应用

解决Maven多模块项目的单点构建与运行问题

我来帮你搞定这个多模块项目的痛点!其实不用搞反向配置那么复杂,咱们利用Maven原生的聚合和依赖机制就能轻松实现单点操作,既不会出现循环构建,也能保证所有模块更新后正确运行。

先理清楚基础依赖关系(关键前提)

首先确保你的模块结构和依赖是正确的,这是一切的基础:

  • root-project:packaging设为pom,作为聚合器和父项目,在<modules>里包含database和server
  • database:packaging设为jar,是独立的依赖模块
  • server:packaging设为jar,在<dependencies>中添加对database的依赖

这样Maven在构建时会自动按依赖顺序处理:先构建database,再构建server,从根源避免更新不同步的问题。

方案一:从根项目触发全构建+运行Server(推荐)

你之前在根项目配置exec-maven-plugin时遇到类路径问题,核心是没指定用server模块的类路径。只要调整插件配置,就能让根项目构建完所有模块后,直接运行server的应用:

在root-project的pom.xml中添加以下插件配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>3.1.0</version>
      <!-- 绑定到install阶段,执行install时自动运行Server -->
      <executions>
        <execution>
          <id>run-server</id>
          <phase>install</phase>
          <goals>
            <goal>java</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <!-- 替换成你server模块的主类全路径 -->
        <mainClass>com.yourcompany.server.ServerApplication</mainClass>
        <!-- 指定使用server模块的编译类路径 -->
        <classpathScope>compile</classpathScope>
        <!-- 切换到server模块的目录,保证资源文件等路径正确 -->
        <workingDirectory>${project.basedir}/server</workingDirectory>
        <!-- 手动添加server的编译产物类路径(可选,保险用) -->
        <additionalClasspathElements>
          <additionalClasspathElement>${project.basedir}/server/target/classes</additionalClasspathElement>
        </additionalClasspathElements>
      </configuration>
    </plugin>
  </plugins>
</build>

怎么用?

  • 直接在根项目目录执行:mvn clean install → 会自动清理、构建所有子模块,然后运行Server
  • 如果只想运行不想安装到本地仓库:mvn clean compile exec:java

这样不管database怎么更新,Maven都会先重新构建database,再构建server,最后运行最新的代码,完全不用在模块间切换。

方案二:从Server模块触发全构建+运行(备选)

如果你习惯在Server模块操作,也可以用maven-invoker-plugin在构建Server前先触发根项目的全构建,避免循环:

在server的pom.xml中添加以下配置:

<build>
  <plugins>
    <!-- 先调用根项目的构建,确保所有模块都是最新的 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-invoker-plugin</artifactId>
      <version>3.5.0</version>
      <executions>
        <execution>
          <id>build-all-modules</id>
          <phase>validate</phase> <!-- 在Server构建前执行 -->
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <pomFile>${project.basedir}/../pom.xml</pomFile>
            <goals>
              <goal>clean</goal>
              <goal>compile</goal>
            </goals>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <!-- 原来的exec插件,用来运行Server -->
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>3.1.0</version>
      <executions>
        <execution>
          <id>run-server</id>
          <phase>install</phase>
          <goals>
            <goal>java</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <mainClass>com.yourcompany.server.ServerApplication</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

怎么用?

在server模块目录执行:mvn install → 会先触发根项目的全模块构建,再构建并运行Server。Maven会自动检测循环构建,不会出现重复执行的问题。

避坑提醒

  • 不要尝试在Server模块配置compiler-plugin来构建根项目,这完全没必要,还容易引发潜在的循环风险
  • 始终保证模块间的依赖是正确声明的,Maven的依赖解析机制会自动处理构建顺序,这是多模块项目的核心优势

内容的提问来源于stack exchange,提问作者Gili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:51:52