摘要

记录启动jar包时原生的传参,以及使用JCommander实现的人性化传参。

正文

本文源码地址

一、原生方式

创建Maven项目,添加Main类

java
1
2
3
4
5
6
7
class Main {
    public static void main(String... argv) {
        for (String s : argv) {
            System.out.println(s);
        }
    }
}

打包方式,参照2.1.1

运行命令,.jar后面表示参数

sh
1
java -jar mvn-command-1.0.jar 1 2 3 4

image-20230306154447030.png

二、基于JCommander

Java自带的命令行其实不是特别友好。通过引入第三方依赖,可以实现指定参数的效果。

基于JCommander参数式运行Jar包

  • 原生Maven项目:mvn-command
  • SpringBoot项目:springboot-command

2.1 原生Maven项目

2.1.1 打包项目

创建一个Maven项目,引入JCommaner依赖

xml
1
2
3
4
5
<dependency>
    <groupId>com.beust</groupId>
    <artifactId>jcommander</artifactId>
    <version>1.81</version>
</dependency>

创建一个计算类

java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;


public class Calc {

    @Parameter(names = {"--numberA", "-a"}, description = "数字A")
    int a;
    @Parameter(names = {"--numberB", "-b"}, description = "数字B")
    int b;

    @Parameter(names = {"--model", "-m"}, description = "运算符,支持 + - x /")
    String model;

    @Parameter(names = "--help", help = true)
    boolean help;

    public static void main(String... args) {
        Calc main = new Calc();
        JCommander jCommander = JCommander.newBuilder()
                .addObject(main)
                .build();
        jCommander.parse(args);
        if (main.help) {
            jCommander.usage();
            return;
        }
        main.run();
    }

    public void run() {
        int result;
        switch (model) {
            case "+":
                result = a + b;
                break;
            case "-":
                result = a - b;
                break;
            case "x":
                result = a * b;
                break;
            case "/":
                result = a / b;

                break;
            default:
                System.out.println("不支持的运算符");
                return;
        }
        System.out.println(result);
    }
}

配置打包所有依赖的插件,并指定入口函数

xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <!--jar包的入口函数-->
                                <mainClass>top.meethigher.Calc</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

执行命令,生成jar包

sh
1
mvn clean package -DskipTests

2.1.2 运行项目

执行命令

sh
1
2
java -jar mvn-command-1.0.jar --help
java -jar mvn-command-1.0.jar --model x -a 16 -b 8

image-20230306155346782.png

2.2 SpringBoot项目

创建SpringBoot项目,将2.1.1的Calc拿过来,依赖也拿过来,然后打包。

运行命令

sh
1
2
java -cp springboot-command-1.0.jar -Dloader.main=top.meethigher.line.Calc org.springframework.boot.loader.PropertiesLauncher --help
java -cp springboot-command-1.0.jar -Dloader.main=top.meethigher.line.Calc org.springframework.boot.loader.PropertiesLauncher --model x -a 16 -b 8

image-20230306161636800.png

三、参考致谢

JCommander

giraffe-tree/websocket-c10k: 使用 netty 实现 websocket 百万长连接, 包含服务端/客户端压测代码