1. 概述

本文将介绍如何通过 Maven 命令行,运行任意 Java 类中的 main 方法。这在调试工具类、运行启动脚本或快速验证逻辑时非常实用,尤其适合那些不想手动拼 classpath 的场景。

2. 使用 exec-maven-plugin

假设我们有如下 Java 类:

public class Exec {

    private static final Logger LOGGER = LoggerFactory.getLogger(Exec.class);

    public static void main(String[] args) {
        LOGGER.info("Running the main method");
        if (args.length > 0) {
            LOGGER.info("List of arguments: {}", Arrays.toString(args));
        }
    }
}

我们的目标是通过 Maven 命令直接运行这个类的 main 方法。

✅ 解决方案:使用 exec-maven-plugin,具体是它的 exec:java 目标(goal)。该目标会以当前项目的依赖作为 classpath,执行指定的 Java 类。

执行命令如下:

$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec"
02:26:45.112 INFO com.baeldung.main.Exec - Running the main method

📌 关键点说明:

  • -Dexec.mainClass:传入要执行的类的全限定名。
  • compile:先编译源码,确保 class 文件存在。
  • ⚠️ 如果不加 compile,Maven 可能找不到编译后的 .class 文件,导致类加载失败。

虽然你也可以用 javac + java 手动执行,但当项目依赖众多时,手动维护 classpath 是一场噩梦。而使用该插件,Maven 会自动帮你把 classpath 搞定,简单粗暴又高效。

3. 传递参数给 main 方法

有时候我们需要向 main(String[] args) 传参,比如指定环境、配置路径等。

方法一:使用 exec.args(空格分隔)

$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec" \
  -Dexec.args="First Second"
02:31:08.235 INFO com.baeldung.main.Exec - Running the main method
02:31:08.236 INFO com.baeldung.main.Exec - List of arguments: [First, Second]

参数通过空格分隔,最终会被拆成 args 数组。

方法二:使用 exec.arguments(XML 风格,支持复杂参数)

$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec" \ 
  -Dexec.arguments="Hello World,Bye"
02:32:25.616 INFO com.baeldung.main.Exec - Running the main method
02:32:25.618 INFO com.baeldung.main.Exec - List of arguments: [Hello World, Bye]

这种方式用逗号分隔参数,适合参数本身包含空格的场景(如文件路径 "C:\my data\config.json")。

💡 小技巧:
如果你的参数带空格,推荐使用 exec.arguments 并配合逗号分隔,避免 shell 解析出错。

4. 自定义插件配置(推荐)

为了避免每次都在命令行重复输入类名和参数,可以在 pom.xml 中预设配置。

设置默认主类

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <mainClass>com.baeldung.main.Exec</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

配置后,命令简化为:

$ mvn compile exec:java
02:33:14.197 INFO com.baeldung.main.Exec - Running the main method

📌 注意:命令行传入的 -Dexec.mainClass 会覆盖这里的默认值,灵活性保留。

设置默认参数

进一步地,我们可以预设常用参数:

<configuration>
    <mainClass>com.baeldung.main.Exec</mainClass>
    <arguments>
        <argument>First</argument>
        <argument>Second</argument>
    </arguments>
</configuration>

执行时无需再传参:

$ mvn clean compile exec:java
02:34:24.448 INFO com.baeldung.main.Exec - Running the main method
02:34:24.450 INFO com.baeldung.main.Exec - List of arguments: [First, Second]

✅ 优势总结:

  • 减少重复命令输入
  • 团队协作更统一
  • 支持复杂参数结构(如 <argument> 标签)
  • 仍可通过命令行覆盖,不影响灵活性

更多高级配置可参考官方文档:exec-maven-plugin Java Goal

5. 总结

通过 exec-maven-pluginexec:java 目标,我们可以:

  • 快速运行任意 Java 类的 main 方法 ✅
  • 自动继承项目依赖作为 classpath,省去手动管理烦恼 ✅
  • 支持命令行传参(空格或逗号分隔)✅
  • 支持在 pom.xml 中配置默认类和参数,提升效率 ✅

📌 踩坑提醒:

  • 记得先 compile,否则可能报 ClassNotFoundException
  • 参数含空格时优先使用 exec.arguments + 逗号分隔
  • 多模块项目中注意在正确的模块下执行命令

所有示例代码已托管至 GitHub:https://github.com/baeldung/tutorials/tree/master/maven-modules/maven-exec-plugin


原始标题:Run a Java Main Method in Maven