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
相关产品推荐
相关产品推荐

