摘要
记录启动jar包时原生的传参,以及使用JCommander实现的人性化传参。
正文
本文源码地址。
一、原生方式
创建Maven项目,添加Main类
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后面表示参数
1
| java -jar mvn-command-1.0.jar 1 2 3 4
|
二、基于JCommander
Java自带的命令行其实不是特别友好。通过引入第三方依赖,可以实现指定参数的效果。
基于JCommander参数式运行Jar包
- 原生Maven项目:mvn-command
- SpringBoot项目:springboot-command
2.1 原生Maven项目
2.1.1 打包项目
创建一个Maven项目,引入JCommaner依赖
1
2
3
4
5
| <dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.81</version>
</dependency>
|
创建一个计算类
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);
}
}
|
配置打包所有依赖的插件,并指定入口函数
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包
1
| mvn clean package -DskipTests
|
2.1.2 运行项目
执行命令
1
2
| java -jar mvn-command-1.0.jar --help
java -jar mvn-command-1.0.jar --model x -a 16 -b 8
|
2.2 SpringBoot项目
创建SpringBoot项目,将2.1.1的Calc拿过来,依赖也拿过来,然后打包。
运行命令
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
|
三、参考致谢
JCommander
giraffe-tree/websocket-c10k: 使用 netty 实现 websocket 百万长连接, 包含服务端/客户端压测代码