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

Maven项目如何打包单个可运行jar支持参数选择多主类运行

Maven单可运行Jar包多主类切换方案

核心思路

你不需要为每个主类单独打Jar,Java本身支持动态指定运行的主类,也可以通过自定义统一入口的方式实现更友好的参数化启动,两种方案如下:


方案1:无额外代码,直接通过命令指定主类

步骤1:配置Maven打Fat Jar(包含所有依赖)

在pom.xml中添加maven-shade-plugin插件配置,不需要指定固定主类:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.5.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

执行mvn package即可生成包含所有类和依赖的Jar包。

步骤2:运行时指定主类

使用-cp参数指定Jar包,后跟目标主类的全限定名即可:

  • 运行class1:java -cp your-project.jar package1.class1
  • 运行class2:java -cp your-project.jar package1.class2
  • 运行class3:java -cp your-project.jar package1.class3

如果需要给主类传参,直接在命令末尾追加参数即可。


方案2:自定义统一入口类,参数化选择主类(更友好)

如果不想每次输入全限定类名,可以新增一个统一调度入口类,打包时将其设为默认主类,运行时只需要传入主类的简写即可。

步骤1:新增调度入口类

在package1下新建MainDispatcher.java:

package package1;

import java.lang.reflect.Method;

public class MainDispatcher {
    public static void main(String[] args) throws Exception {
        // 校验入参
        if (args.length == 0) {
            System.out.println("请指定要运行的主类,可选值:class1 / class2 / class3");
            return;
        }
        // 映射主类全限定名
        String targetClassFullName;
        switch (args[0]) {
            case "class1":
                targetClassFullName = "package1.class1";
                break;
            case "class2":
                targetClassFullName = "package1.class2";
                break;
            case "class3":
                targetClassFullName = "package1.class3";
                break;
            default:
                throw new IllegalArgumentException("未知的主类标识:" + args[0]);
        }
        // 提取传给目标主类的参数
        String[] targetArgs = new String[args.length - 1];
        System.arraycopy(args, 1, targetArgs, 0, targetArgs.length);
        // 反射调用目标主类的main方法
        Class<?> targetClazz = Class.forName(targetClassFullName);
        Method mainMethod = targetClazz.getMethod("main", String[].class);
        mainMethod.invoke(null, (Object) targetArgs);
    }
}

步骤2:修改打包插件配置,指定默认主类

修改maven-shade-plugin的配置,添加主类指定:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.5.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>package1.MainDispatcher</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

步骤3:运行方式

执行mvn package生成Jar包后,直接通过第一个参数指定要运行的主类即可:

  • 运行class1:java -jar your-project.jar class1
  • 运行class2并传参:java -jar your-project.jar class2 param1 param2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:33:00