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中执行这个函数,确保是能正确执行。




ideajava项目只打部分包 idea打包指定main_ideajava项目只打部分包


2021-11-26_102311.png


2.选择左上角的file->project structure



ideajava项目只打部分包 idea打包指定main_java_02


2021-11-26_102603.png


3.选择artifacts->加号(+)->JAR->from modules with dependencies



ideajava项目只打部分包 idea打包指定main_java_03


2021-11-26_102954.png


4.Module选择你要打包运行的main函数是在当前项目中的哪一个module,Main Class选择你要打包的main所在的类,选择extract to the target JAR,选择manifest文件的存储路径,一般就在打包模块的里面。



ideajava项目只打部分包 idea打包指定main_编程语言_04


2021-11-26_1033471.png


5.确认后project structure面板中多了一个打包选项,其中name就是打包后jar文件的名称,output directory是jar文件的路径,点击OK返回编辑界面。



ideajava项目只打部分包 idea打包指定main_java_05


2021-11-26_103526.png


6.导航栏中选择build->build artifacts



ideajava项目只打部分包 idea打包指定main_java_06


2021-11-26_103718.png


7.选择上文中创建的打包模块名称->选择build,IDEA会进入构建过程,构建完成打开上文中提到的打包jar文件存储路径的文件夹,可以看到里面有一个打包的jar文件。



ideajava项目只打部分包 idea打包指定main_java_07


2021-11-26_104414.png


在窗口中运行jar

上文记录了java程序打包成jar文件,这里记录一下运行jar文件,在Windows中不能直接运行jar文件,所以使用命令行运行,和添加参数。

在命令行中运行jar文件的命令是:

java -jar xxx.jar



ideajava项目只打部分包 idea打包指定main_linux_08


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文件。



ideajava项目只打部分包 idea打包指定main_编程语言_09


2021-11-26_105553.png



ideajava项目只打部分包 idea打包指定main_linux_10


2021-11-26_105525.png


和在IDEA中一样提示没有参数。

现在在执行命令后面加上2个参数运行:

java -jar MavenJar.jar 12 34



ideajava项目只打部分包 idea打包指定main_python_11


2021-11-26_110041.png


可以看到日志地址是12,端口是34。也就是说在执行命令后面使用空格隔开,可以添加参数,多个参数之间也使用空格隔开。

那么我们再修改命令,在12中间加个空格:

java -jar MavenJar.jar 1 2 34



ideajava项目只打部分包 idea打包指定main_python_12


2021-11-26_110209.png


看到日志地址是1,端口是2,可以说明后面接的参数多一个空格,就认为后面的是另一个参数,那么如果我的参数中确实有那个空格呢?可以将参数使用双引号包起来,双引号内的空格不会拆分。

java -jar MavenJar.jar "1 2" 34



ideajava项目只打部分包 idea打包指定main_ideajava项目只打部分包_13


2021-11-26_110508.png


看到日志地址是1 2,使用引号可以解决传带空格参数问题,所以建议后面写参数都使用引号,即使你传的是一个数值型的,因为在代码中这些参数都是以String类型传进去的,与Java语法也是匹配的,String类型就是要带引号。