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-plugin
的 exec:java
目标,我们可以:
- 快速运行任意 Java 类的 main 方法 ✅
- 自动继承项目依赖作为 classpath,省去手动管理烦恼 ✅
- 支持命令行传参(空格或逗号分隔)✅
- 支持在
pom.xml
中配置默认类和参数,提升效率 ✅
📌 踩坑提醒:
- 记得先
compile
,否则可能报ClassNotFoundException
- 参数含空格时优先使用
exec.arguments
+ 逗号分隔 - 多模块项目中注意在正确的模块下执行命令
所有示例代码已托管至 GitHub:https://github.com/baeldung/tutorials/tree/master/maven-modules/maven-exec-plugin