idea把项目打成jar包步骤详解

        最近产品需要预研一个小功能,开始后在本地开发测试好之后,需要打成jar提供出去,今天弄完了,决定把这个步骤记录下来,便于以后轻车熟路。

        打成jar要有mian方法的入口,所以我们在代码中需要定义一个main方法,然后通过这个main方法调用我们的核心逻辑代码。下面是我的代码示例:

public static void main(String[] args){System.out.println("启动成功");JSONObject json = new JSONObject();//要处理的文件路径json.put("filePath",args[0]);//休眠秒数的因子json.put("millisecond",args[1]);//输出文件的路径json.put("writeFilePath",args[2]);//输出文件的名称(需提前创建)json.put("writeFileName",args[3]);//打印参数System.out.println(json.toJSONString());//调用核心处理方法getData(json);}

核心代码:

/*** 获取数据* @param params* @return*/private static JSONObject getData(@RequestBody JSONObject params){JSONObject ret = new JSONObject();ret.put("code","1");ret.put("message","执行成功");//String filePath = PropertiesUtil.getProp(PropertiesUtil.FILE_SYSTEM, "splib.barcode.path") + "/sp_barcode_200.txt";String filePath = params.getString("filePath");Long milliseconds = StringUtil.toLong(params.get("millisecond"));List<String> result = new ArrayList<>();try (FileReader fileReader = new FileReader(filePath);BufferedReader bufferedReader = new BufferedReader(fileReader)) {String line;while ((line = bufferedReader.readLine()) != null) {// 在这里根据实际需求对每一行进行处理if(StringUtil.isNotEmpty(line)){int random = (int) (Math.random() * StringUtil.toInteger(milliseconds));logger.info("休眠{}毫秒再执行",random);System.out.println(String.format("休眠%s毫秒再执行>>>>>>>",random));Thread.sleep(random);String barcode = line.replace(",", "");String s1 = HttpUtils.httpClientGet(String.format(GDS_API_URL,barcode), 4000);System.out.println("s1>>>>>>>" + s1);String s2 = HttpUtils.httpClientGet(String.format("%s%s",GDS_URL,barcode), 4000);System.out.println("s2>>>>>>>" + s2);result.add(s2);}}} catch (IOException e) {e.printStackTrace();logger.error("io异常:",e);ret.put("code","0");ret.put("message","执行失败");}catch(InterruptedException e){e.printStackTrace();logger.error("InterruptedException异常:",e);ret.put("code","0");ret.put("message","执行失败");}if(CollectionUtil.isNotEmpty(result)){String code = writeTxt(params.getString("writeFilePath"), params.getString("writeFileName"), result);if(!"1".equals(code)){ret.put("code","0");ret.put("message","写文件失败");}}return ret;}/*** 写文件*/private static String writeTxt(String filePath,String fileName,List<String> list){// 指定文件路径和文件名/*String filePath = "D:";String fileName = "sp_barcode_test.txt";*/// 创建BufferedWriter对象try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath + "/" + fileName))) {// 将List<String>中的每个元素写入文件中for (String str : list) {writer.write(str);writer.newLine(); // 写入换行符}System.out.println("文件已成功写入!");logger.info("文件已成功写入");return "1";} catch (IOException e) {System.out.println("写入文件时出现错误:" + e.getMessage());logger.error("写入文件时出现错误:",e);return "0";}}

上面是我的代码示例,只是给大家一个演示,不必关心里面的功能。下面来演示如何把该文件所在项目打成jar包。

1.点击 File ==> Project Structure ==> Artifacts ==> 点击加号 ==> 选择JAR ==> 选择From modules with dependencies

 我们需要把所依赖的其他项目包都打进来的话,按下图所示

  点击ok===>apply===>继续ok

选择Build===>build artifact,找到自己的jar包那条目录

先点击 clear 进行清除,然后再点击 Build 进行构建,就可以打成一个jar包了,就可以在我们设置的输出目录看到对应的jar包了

我此处把这个目录压缩成.zip包,便于上传到服务器。

连上服务器,建好对应项目的文件夹(注意目录权限),rz命令上传zip包,unzip解压

由于我的main方法中需要传四个参数,不然程序运行会报错,所以启动的时候,需要在命令行传上所需的参数:

java -jar spcenter.jar \/home\/spcenter\/spcenter_jar\/sp_barcode.txt 10000 \/home\/spcenter\/spcenter_jar test.txt说明:
要处理的文件:\/home\/spcenter\/spcenter_jar\/sp_barcode.txt
随机数的参数:10000 
输出文件目录:\/home\/spcenter\/spcenter_jar
输出文件名称:test.txt

到这就搞定了,完工。功能不复杂,但是涉及的知识点挺多的,希望能帮助到大家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132356.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业机器人仿真参考

最近有一些朋友看到我做的关于Unity3d仿真机器人的项目&#xff0c;本次我在平台做以分享&#xff0c;希望的朋友或者有需要在此基础做开发的可以参考下。 开发工具&#xff1a; 下位机&#xff1a;Unity3D 上位机&#xff1a;Visual Studio 机械臂模型&#xff1a;TH6-QKM…

【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。

您所使用的密钥ak有问题&#xff0c;不支持jsapi服务&#xff0c;可以访问该网址了解如何获取有效密钥。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的&#xff0c;点击以后就进入…

LeetCode(力扣)452. 用最少数量的箭引爆气球Python

LeetCode452. 用最少数量的箭引爆气球 题目链接代码 题目链接 https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/ 代码 class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if len(points) 0:return 0…

无涯教程-JavaScript - SHEETS函数

描述 SHEETS函数返回参考中的页数。 语法 SHEETS (reference) 争论 Argument描述Required/OptionalReference 参考是您想知道其包含的页数的参考。 如果省略"引用",SHEETS将返回工作簿中包含该功能的页数。 Optional Notes SHEETS包括所有其他工作表类型(宏,图表…

飞行动力学 - 第25节-特征根与动稳定性 之 基础点摘要

飞行动力学 - 第25节-特征根与动稳定性 之 基础点摘要 1. 特征根2. 实根3. 复根4. 参考资料 1. 特征根 动稳定性考虑的是扰动后飞机的时间响应&#xff0c;即 x 0 ≠ 0 x_0 \ne 0 x0​0, u 0 u 0 u0 2. 实根 x x 0 e λ t x x_0 e^{\lambda t } xx0​eλt 3. 复根 4.…

驱动开发,stm32mp157a开发板的led灯控制实验

1.实验目的 编写LED灯的驱动&#xff0c;在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制&#xff1b; 2.LED灯相关寄存器分析 LED1->PE10 LED1亮灭&#xff1a; RCC寄存器[4]->1 0X50000A28 GPIOE_MODER[21:20]->01 (输出) 0X50006000 GPIOE_ODR[10]-&g…

Cglib代理和JDK代理原理的区别

一、JDK Jdk动态代理&#xff0c;拿到目标类所继承的接口&#xff0c;生成代理类&#xff0c;并且代理类也会实现和目标类一样的接口。 二、Cglib Cglib代理功能更强&#xff0c;无论目标类是否实现接口都可以代理&#xff0c;他是基于继承的方式类代理目标类&#xff0c;如果…

数学实验-数列与级数(Mathematica实现)

一、实验名称&#xff1a;数列与级数 二、实验环境&#xff1a;Mathematica 10.3软件 三、实验目的&#xff1a;本实验通过Mathematica 10.3软件编程演示Fibonacci数列、调和级数的函数图像及函数关系式&#xff0c;通过Mathematica 10.3软件发现数列与极限状态的性质&#x…

STM32F103VET6基于ENC28J60移植LWIP1.4.1(标准库,无RTOS)

目录 环境引脚连接1.准备LWIP2.新建arch3.网卡驱动4.新建分组5.项目头文件路径6.LWIIP头文件编写7.ethernetif.cvoid low_level_init(struct netif *netif)err_t low_level_output(struct netif *netif, struct pbuf *p)struct pbuf *low_level_input(struct netif *netif)void…

ChatGPT 网站合集/NovelAI tag生成器/Novel资源大全

ChatGPT 网站合集 https://github.com/xx025/carrot NovelAI tag生成器 https://wolfchen.top/tag/ Novel资源大全 https://wolfchen.top/tag/doc.html 简单地说&#xff0c;Stable Diffusion被修改后做出了NovelAI&#xff0c;NovelAI离家出走便有了Naifu Naifu简单好上手&am…

基于红黑树对map和set容器的封装

本章代码gitee仓库&#xff1a;map和set模拟实现、stl_map_set_tree源码 文章目录 &#x1f431;1. 红黑树的泛型&#x1f408;1.1 红黑树节点&#x1f408;1.2 红黑树迭代器&#x1f408;1.3 仿函数 &#x1f42f;2. 对set的封装&#x1f984;3. 对map的封装 &#x1f431;1. …

CRM系统销售自动化功能如何提高销售效率

销售效率对企业的盈利能力有着至关重要的联系。提高销售效率&#xff0c;就是要提高销售人员的工作效率和销售转化率。那么&#xff0c;企业如何提高销售效率呢&#xff1f;CRM销售自动化功能可以帮助企业实现这一目标。 一、线索管理 线索是指有潜在购买意向的客户&#xff…

基于STM32F407ZET6的环境温湿度监控系统(粤嵌GEC-M4)

注意使用事项&#xff1a; 开发板如下 由于外部晶振是8M&#xff0c;需要修改setup和stm32f4头文件的晶振值。 操作如下&#xff1a; system_stm32f4xx.c的254行 #define PLL_M 8stm32f4xx.h的127行 #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the Ex…

2023/9/14 -- C++/QT

作业&#xff1a; 仿照Vector实现MyVector&#xff0c;最主要实现二倍扩容 #include <iostream>using namespace std;template <typename T> class MyVector { private:T *data;size_t size;size_t V_capacity; public://无参构造MyVector():data(nullptr),size(…

【深度学习 AIGC】stablediffusion-infinity 在无界限画布中输出绘画 Outpainting

代码&#xff1a;https://github.com/lkwq007/stablediffusion-infinity/tree/master 启动环境&#xff1a; git clone --recurse-submodules https://github.com/lkwq007/stablediffusion-infinity cd stablediffusion-infinity conda env create -f environment.yml conda …

如何开启Win10虚拟机Hyper-V功能

操作步骤: 使用前提&#xff1a; 1、确保系统是 Windows 10 专业版/企业版/教育版&#xff0c;且必须是64位操作系统才支持。 提示&#xff1a;Win10家庭版不支持hyper-v。 2、使用Hyper-V需要cpu支持虚拟化并处于开启状态。 3、硬件要求及如何验证硬件兼容性&#xff1a; 硬件…

什么是云存储,从对象存储说起?

在《存储系统形态之争,从块存储到统一存储》一文中我们提到了对象存储的概念,知道目前很多企业级存储都是支持对象存储的,比如EMC、NetApp和华为等。以EMC的对象存储为例,其最早在1998年就已经具备成熟的产品了,到目前已经有二十多年的历史了。如图是关于对象存储主要产品…

SpringMVC之JSR303和拦截器

一.什么是JSR303 二.JSR303 常用注解 作用 使用 导入pom.xml 在实体类相对应的属性中增加注解用来指定校验 在hpjyController里面新加以下代码 修改eidt.jsp 测试结果 ​编辑 二.拦截器 什么是拦截器 拦截器与过滤器的区别 应用场景日志记录&#xff1a;拦截器可以用…

图解第一类曲线积分与第二类曲线积分的关系

图解第一类曲线积分与第二类曲线积分的关系 笔记相关内容&#xff1a; 1.曲线积分&#xff08;Line Integral&#xff09; 2.向量场中的曲线积分、环量、通量 第一类曲线积分&#xff08;对弧长 d s ds ds进行积分&#xff09;(无方向性) 物理意义&#xff1a; f ( x , y ) f(…

Docker 一键安装Confluence(已支持最新版本)

Docker 一键安装Confluence&#xff08;已支持最新版本&#xff09; 本文用于Confluence在Docker的安装&#xff0c;仅用于记录安装方式Jira 也可以参考这种方式安装&#xff0c;只有细微差别转载请注明来源Linux安装可参考链接Windows安装可查考链接条件允许时&#xff0c;请…