IDEA打包jar
在IDEA中写了main函数,并且在IDE中可以运行,这种时候如果需要将这个代码打包去执行某些业务,就需要打包这个main函数的内容,而不是整个项目。
在本文中笔者特意使用到了三方库Gson,为了说明最终打包时会自动引入你的程序运行依赖的文件,不用担心你依赖的文件最终会缺失的问题。
package org.venus;
import com.google.gson.Gson;
/**
* Author Jxx _让世界看到我
* On 2021/11/26
* Note TODO
*/
public class Run {
public static void main(String[] args) {
System.out.println("程序启动");
System.out.println("参数信息:"+new Gson().toJson(args));
for (String arg : args) {
System.out.println("参数:"+arg);
}
System.out.println("执行结束");
}
}
1.这段代码再IDEA中执行大家一眼能看出来,参数args里面是没有内容的。首先在IEDA中执行这个函数,确保是能正确执行。
2021-11-26_102311.png
2.选择左上角的file->project structure
2021-11-26_102603.png
3.选择artifacts->加号(+)->JAR->from modules with dependencies
2021-11-26_102954.png
4.Module选择你要打包运行的main函数是在当前项目中的哪一个module,Main Class选择你要打包的main所在的类,选择extract to the target JAR,选择manifest文件的存储路径,一般就在打包模块的里面。
2021-11-26_1033471.png
5.确认后project structure面板中多了一个打包选项,其中name就是打包后jar文件的名称,output directory是jar文件的路径,点击OK返回编辑界面。
2021-11-26_103526.png
6.导航栏中选择build->build artifacts
2021-11-26_103718.png
7.选择上文中创建的打包模块名称->选择build,IDEA会进入构建过程,构建完成打开上文中提到的打包jar文件存储路径的文件夹,可以看到里面有一个打包的jar文件。
2021-11-26_104414.png
在窗口中运行jar
上文记录了java程序打包成jar文件,这里记录一下运行jar文件,在Windows中不能直接运行jar文件,所以使用命令行运行,和添加参数。
在命令行中运行jar文件的命令是:
java -jar xxx.jar
2021-11-26_104737.png
上图中执行打包的jar和打包之前再IDEA中运行结果是一样的,也就说明我们打包成功并且运行也成功。
下面修改这个程序,添加几个参数。拟定我们需要2个参数,一个IP和一个端口。
package org.venus;
import com.google.gson.Gson;
/**
* Author Jxx _让世界看到我
* On 2021/11/26
* Note TODO
*/
public class Run {
public static void main(String[] args) {
System.out.println("程序启动");
System.out.println("参数信息:"+new Gson().toJson(args));
for (String arg : args) {
System.out.println("参数:"+arg);
}
if (args.length<2){
System.out.println("请给我2个参数,地址和端口!");
return;
}
String ip = args[0];
String portS = args[1];
int port = -1;
try {
port= Integer.parseInt(portS);
} catch ( Exception e){
System.out.println("端口号格式错误,请参照[80-65535]!");
return;
}
if (port<0){
System.out.println("请给我正确的端口号!");
return;
}
System.out.println("你给的地址是:"+ip+",端口是:"+port+",我现在就去工作!");
for (int i = 0; i < 5; i++) {
try {
System.out.println("工作中...");
Thread.sleep(1000*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("工作完成!");
System.out.println("执行结束");
}
}
改了过后在IDEA中运行main函数,程序会停在22行,因为没有参数。现在将程序继续打包,运行jar文件。
2021-11-26_105553.png
2021-11-26_105525.png
和在IDEA中一样提示没有参数。
现在在执行命令后面加上2个参数运行:
java -jar MavenJar.jar 12 34
2021-11-26_110041.png
可以看到日志地址是12,端口是34。也就是说在执行命令后面使用空格隔开,可以添加参数,多个参数之间也使用空格隔开。
那么我们再修改命令,在12中间加个空格:
java -jar MavenJar.jar 1 2 34
2021-11-26_110209.png
看到日志地址是1,端口是2,可以说明后面接的参数多一个空格,就认为后面的是另一个参数,那么如果我的参数中确实有那个空格呢?可以将参数使用双引号包起来,双引号内的空格不会拆分。
java -jar MavenJar.jar "1 2" 34
2021-11-26_110508.png
看到日志地址是1 2,使用引号可以解决传带空格参数问题,所以建议后面写参数都使用引号,即使你传的是一个数值型的,因为在代码中这些参数都是以String类型传进去的,与Java语法也是匹配的,String类型就是要带引号。