Java 海康录像机(NVR&&DVR)二次开发-通过时间下载录像和抓图功能

海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能 海康摄像头二次开发详解准备海康摄像头SDK开发下载路径:开发过程中遇到的问题记录:添加maven依赖下面代码中会出现的实体类CameraManage实体类:ControlDto实体类:加载库文件:初始化:登录控制:查询历史视频保存时间:退出登陆释放资源:完整代码:视频下载、回放、视频直播、抓图等功能 准备 海康摄像头SDK开发下载路径: https://www.hikvision.com/cn/d... 阅读详情
AI摘要

本文介绍了使用Java调用海康录像机SDK进行开发的方法。首先需从海康官网下载相应SDK开放包,将依赖jar包导入项目。接着修改程序代码,拷贝相关库文件到本地路径。然后修改HCNetSDK.java内容,最后进行通过时间下载录像和抓图功能的编码。

海康录像机还是国内市场比较火的录像机吧!反正我也不知道,我也不敢问啊!╮(︶﹏︶)╭话不多说!赶紧去海康官网选择一个相应sdk开放包下载,这里给老铁们奉上地址:盘他⁽⁽ƪ(•̩̩̩̩_•̩̩̩̩)ʃ⁾⁾ᵒᵐᵍᵎᵎ。

第一步:海康官网提供的开发文档和操作手册是c++版本,我一个学过c++都看得不是很懂,可能是我比较菜吧!如果你没学过的话,可能会你会比较~%?…;# *’☆&℃$︿★? 乱码!好吧,我来介绍java如何使用,看下图,这是我从官网下载的sdk,你需要把依赖jar包导入到项目中,我使用maven导入的依赖

<!--海康录像机二次开发依赖jar包-->
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>3.0.9</version>
</dependency>
<!--海康录像机sdk官方提供jar包-->
<dependency>
    <groupId>com.qy</groupId>
    <artifactId>examples</artifactId><!--需要在maven自行安装这个jar包-->
    <version>1.0.0</version>
</dependency>

第二步:修改程序代码,我们找到官方提供的sdk,找到java示例代码,在下图第一张图所示所显示路径中找到HCNetSDK.java导入项目当中,把海康sdk中库文件里的HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、HCNetSDKCom文件夹等文件均拷贝到本地路径。HCNetSDKCom文件夹(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改。把HCNetSDK.java文件复制一份到本地路径,如下图第二张图所示。其中HCNetSDK.java文件自己指定loadlibrary加载库的路径,如下图第三张图所示。

第三步:这一步对抓图功能很关键,我们要修改HCNetSDK.java里面的内容(修改之后要保证和本地磁盘下HCNetSDK.java文件一致,复制过去就可以了),把sJpegPicBuffer的String类型改成ByteBuffer就可以了

第四步:开始编码通过时间下载录像这个功能,通过时间下载功能测试在play类的main方法中

public class VideoDowload {
    private static Logger logger = LoggerFactory.getLogger(VideoDowload.class);
    private static HCNetSDK hcNetSDK = HCNetSDK.INSTANCE;
    private NativeLong userId;//用户句柄
    private NativeLong loadHandle;//下载句柄
    private Timer downloadTimer;

    /**
     *按时间下载视频
     * @param dvr
     * @param startTime
     * @param endTime
     * @param filePath
     * @param channel
     * @return
     */
    public boolean downloadVideo(Dvr dvr,Date startTime, Date endTime, String filePath, int channel) {
        boolean initFlag = hcNetSDK.NET_DVR_Init();
        if(!initFlag) { //返回值为布尔值 fasle初始化失败
            logger.warn("hksdk(视频)-海康sdk初始化失败!");
            return false;
        }
        HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
        userId = hcNetSDK.NET_DVR_Login_V30(dvr.getDvrip(),(short)dvr.getDvrport(),dvr.getDvrusername(),dvr.getDvrpassword(),deviceInfo);
        logger.info("hksdk(视频)-登录海康录像机信息,状态值:"+hcNetSDK.NET_DVR_GetLastError());
        long lUserId = userId.longValue();
        if(lUserId==-1) {
            logger.warn("hksdk(视频)-海康sdk登录失败!");
            return false;
        }
        loadHandle =new NativeLong(-1);
        if(loadHandle.intValue()==-1) {
            loadHandle = hcNetSDK.NET_DVR_GetFileByTime(userId,new NativeLong(channel),getHkTime(startTime),getHkTime(endTime),filePath);
            logger.info("hksdk(视频)-获取播放句柄信息,状态值:"+hcNetSDK.NET_DVR_GetLastError());
            if(loadHandle.intValue()>=0) {
                boolean downloadFlag = hcNetSDK.NET_DVR_PlayBackControl(loadHandle,hcNetSDK.NET_DVR_PLAYSTART,0,null);
                int tmp = -1;
                IntByReference pos = new IntByReference();
                while(true) {
                    boolean backFlag = hcNetSDK.NET_DVR_PlayBackControl(loadHandle,hcNetSDK.NET_DVR_PLAYGETPOS,0,pos);
                    if(!backFlag) {//防止单个线程死循环
                        return downloadFlag;
                    }
                    int produce =pos.getValue();
                    if((produce%10)==0&&tmp!=produce) {//输出进度
                        tmp = produce;
                        logger.info("hksdk(视频)-视频下载进度:"+"=="+produce+"%");
                    }
                    if(produce ==100) {//下载成功
                        hcNetSDK.NET_DVR_StopGetFile(loadHandle);
                        loadHandle.setValue(-1);
                        hcNetSDK.NET_DVR_Logout(userId);//退出录像机
                        logger.info("hksdk(视频)-退出状态"+hcNetSDK.NET_DVR_GetLastError());
                        //hcNetSDK.NET_DVR_Cleanup();
                        return true;
                    }
                    if(produce>100) {//下载失败
                        hcNetSDK.NET_DVR_StopGetFile(loadHandle);
                        loadHandle.setValue(-1);
                        logger.warn("hksdk(视频)-海康sdk由于网络原因或DVR忙,下载异常终止!错误原因:"+ hcNetSDK.NET_DVR_GetLastError());
                        //hcNetSDK.NET_DVR_Logout(userId);//退出录像机
                        //logger.info("hksdk(视频)-退出状态"+hcNetSDK.NET_DVR_GetLastError());
                        return false;
                    }
                }
            }else{
                System.out.println("hksdk(视频)-下载失败" + hcNetSDK.NET_DVR_GetLastError());
                return false;
            }
        }
        return false;
    }

    /**
     * 获取海康录像机格式的时间
     * @param time
     * @return
     */
    public HCNetSDK.NET_DVR_TIME getHkTime(Date time) {
        HCNetSDK.NET_DVR_TIME structTime = new HCNetSDK.NET_DVR_TIME();
        String str = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(time);
        String[] times = str.split("-");
        structTime.dwYear = Integer.parseInt(times[0]);
        structTime.dwMonth = Integer.parseInt(times[1]);
        structTime.dwDay = Integer.parseInt(times[2]);
        structTime.dwHour = Integer.parseInt(times[3]);
        structTime.dwMinute =Integer.parseInt(times[4]);
        structTime.dwSecond = Integer.parseInt(times[5]);
        return structTime;
    }

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Date startTime =null;
        Date endTime = null;
        try {
            startTime = sdf.parse("20190712164200");   //开始时间
            endTime =   sdf.parse("20190712170000");      //结束时间
        } catch (ParseException e) {
            e.printStackTrace();
        }
        VideoDowload test = new VideoDowload();
        Dvr dvr = new Dvr(0,"录像机ip",8000,"录像机用户名","录像机密码",null,0);
        int channel =2//通道
        System.out.print(test.downloadVideo(dvr,startTime,endTime,"G:\\test\\test.mp4",chanel));
    }
}

第四步:开始编码抓图功能,抓图功能测试在Camera的main方法里面。

public class Camera {
    private static  HCNetSDK hcNetSDK = HCNetSDK.INSTANCE;
    private Logger logger = LoggerFactory.getLogger(Camera.class);
    private NativeLong userId;//用户句柄

    /**
     * 抓拍图片
     * @param dvr
     */
    public void getDVRPic(Dvr dvr, int chan, String imgpath) {
        NativeLong chanLong = new NativeLong(chan);

        if(!hcNetSDK.NET_DVR_Init()) {
            logger.warn("hksdk(抓图)-海康sdk初始化失败!");
            return ;
        }
        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息
        //注册设备
        userId = hcNetSDK.NET_DVR_Login_V30(dvr.getDvrip(),(short)dvr.getDvrport(),dvr.getDvrusername(), dvr.getDvrpassword(), devinfo);// 返回一个用户编号,同时将设备信息写入devinfo

        if (userId.intValue() < 0) {
            logger.warn("hksdk(抓图)-设备注册失败,错误码:"+hcNetSDK.NET_DVR_GetLastError());
            return;
        }
        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
        if (!hcNetSDK.NET_DVR_GetDVRWorkState_V30(userId, devwork)) {
            // 返回Boolean值,判断是否获取设备能力
            logger.info("hksdk(抓图)-返回设备状态失败");
        }
        //图片质量
        HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
        //设置图片分辨率
        jpeg.wPicSize=5;
        //设置图片质量
        jpeg.wPicQuality=0;
        IntByReference a = new IntByReference();
        //设置图片大小
        ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
        //String jpegBuffer ="1024 * 1024";
        File file = new File(imgpath);
        // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中
        //需要加入通道
        boolean is = hcNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, chanLong, jpeg, jpegBuffer, 1024 * 1024, a);
        if(is) {
            logger.info("hksdk(抓图)-结果状态值(0表示成功):"+hcNetSDK.NET_DVR_GetLastError());
            //存储到本地
            BufferedOutputStream outputStream = null;
            try {
                outputStream = new BufferedOutputStream(new FileOutputStream(file));
                outputStream.write(jpegBuffer.array(),0,a.getValue());
                outputStream.flush();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(outputStream!=null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }else{
            logger.info("hksdk(抓图)-抓取失败,错误码:"+hcNetSDK.NET_DVR_GetLastError());
        }

        hcNetSDK.NET_DVR_Logout(userId);//退出登录
        //hcNetSDK.NET_DVR_Cleanup();
    }
    public static void main(String[] args) {
        Camera camera = new Camera();
        Dvr dvr = new Dvr(0,"录像机ip",8000,"录像机用户名","密码",null,0);
        String imgpath ="G:\\test\\test.jpg";
        int channel = 2;//通道号
        camera.getDVRPic(dvr,channel,imgpath);
    }
}

注意:Dvr类就是录像机设备信息类,你自己建一个你自己的就可以了,海康录像机每一个摄像枪对应一个通道号,在通道号上选择,我这里选择通道号是1,2......。但是你可能会选择错误,有些录像机实际通道号是从33开始的,对应录像机设置通道1、通道2......,可能不同的录像机不太一样吧!

如果需要实现其他功能,各位老铁去看丧心病狂的c++文档吧!或许可以帮到你。

▄█▀█●各位老铁,如果我的代码能够帮助到你,请给我一个赞吧!有啥子不懂的地方或者开发与遇到啥问题请评论。懂就给你解答。不懂的话,我也没办法啊!

使用Java实时保存海康威视摄像头预览视频流到指定文件 首先,我们需要导入一些必要的Java库,包括OpenCV和海康威视SDK。确保您已经正确安装了这些库,并将其添加到您的项目中。在这篇文章中,我们将使用Java编程语言实现一个程序,可以实时预览海康威视摄像头的视频流,并将视频流保存到指定的文件中。通过运行上述程序,您将能够实时预览海康威视摄像头的视频流,并将视频流保存到指定的文件中。请注意,您需要将代码中的"IP地址"、“用户名”、“密码”、"保存路径"替换为您自己的摄像头信息和保存路径。使用Java实时保存海康威视摄像头预览视频流到指定文件。 阅读详情

相关推荐

Java语言使用SDK抓取海康威视录像机(NVR)图片及视频流实时显示

使用SDK抓取海康威视NVR的图片(文件及内存方式),从底层抓取视频流转化为BufferImage实时显示,支持二次开发。注意修改sdk路径。有问题联系QQ:52185025

回放和下载模块使用

一.查找录像文件并下载 #include <stdio.h> #include <iostream> #include "Windows.h" #include "HCNetSDK.h" using namespace std; int saveRecordFile(int userId,char * srcfile,char * destfile) { int bRes = 1; int hPlayback = 0; if( (hPlayback =

分享嵌入式,移动端,智能应用,数据库等专业板块,记录知识碎片!!! 2041

java 使用JNA连接海康的硬盘录像机

NULL 博文链接:https://suigara.iteye.com/blog/1955217

【海康威视】-按时间下载录像文件

由于没有在官方文档中找到通过ISAPI协议透传实现按时间下载文件的方式。所以采取了SDK本地调用方式。 实现过程使用了 NET_DVR_GetFileByTime_V40、NET_DVR_PlayBackControl、NET_DVR_PlayBackControl_V40 相关方法调用

宣晨光 9478

海康NVR视频下载,根据时间下载,适配世面几乎所有型号

海康NVR视频下载,官网的文档是C#的,这个是用java调用的,直接打包为工具类了,目前有点小问题,后续会更新

基于STM32与毫米波雷达的非接触式睡眠监测系统

物联网和嵌入式系统技术正在推动医疗健康设备的智能化发展。通过传感器网络采集生理信号,结合信号处理算法实现健康监测已成为主流技术方案。毫米波雷达凭借其非接触检测特性,在呼吸、心率等生命体征监测中展现出独特优势。STM32系列MCU凭借丰富外设和低功耗特性,成为医疗级嵌入式设备的首选平台。本系统整合60GHz毫米波雷达、红外测温与无线传输模块,构建了完整的睡眠质量评估解决方案,其硬件架构设计、信号处理算法和低功耗优化策略对可穿戴医疗设备开发具有参考价值。

weixin_36369848的博客 614

海康sdkC++二次开发之回放下载

功能简介 因为项目只用到下载录像机硬盘视频的功能,所以就想找比较简单的代码,最后是在官方sdk文档的帮助文档中找到的,每个功能都有一个小示例,下面贴出来` #include <stdio.h> #include <iostream> #include "Windows.h" #include "videoInclude/HCNetSDK.h" using namespace std; int main() { //----------------------------------

qq_42410741的博客 2606

混合部署 操作系统混合部署

在openEuler Embedded 22.03中,已经集成了OpenAMP相关支持,并与openEuler的SIG Zephyr合作实现了openEuler Embedded与实时操作系统Zephyr在QEMU平台上的混合部署。具体的混合部署方式取决于设备的硬件和软件支持。例如,可以使用虚拟机软件(如VirtualBox)在Linux操作系统上运行Android虚拟机,从而实现Linux和Android的混合部署。需要注意的是,混合部署涉及到设备的硬件和软件兼容性,以及操作系统的配置和管理。

dianqicyuyan的博客 1767

海康威视SDK二次开发JAVA(SpringBoot)

System.out.println("hksdk(视频)-退出状态" + hcNetSDK.NET_DVR_GetLastError());System.out.println("hksdk(视频)-登录海康录像机信息,状态值:" + hcNetSDK.NET_DVR_GetLastError());System.out.println("hksdk(视频)-下载失败" + hcNetSDK.NET_DVR_GetLastError());

很多时候犯错都是在不知情的情况下发生的 7711

时间序列学习(4):平稳性检验(单位根检验、ADF检验)

时间序列学习(4):平稳性检验(单位根检验、ADF检验)1、单位根检验2、ADF检验3、指数走势的检验4、对数收益率序列检验 相关图可以大致判断序列是否平稳。但是,这毕竟不是严格的。 这篇笔记来就谈一谈平稳性的检验。 到目前为止,我们有了以下的时间序列模型: 白噪声; 随机游走; AR模型; MA模型; ARMA模型。 我们知道白噪声、MA模型一定是平稳的(这里的平稳都是弱平稳);随机游走一定是不平稳的;ARMA模型取决于其AR部分。 所以唯一需要做平稳性检验的就是AR模型。 1、单位根检验 先来看一阶

lucialucia的博客 7万+

PTA 学生信息的那些操作:添加记录(结构体)

这是河南工业大学自主命题的一道基础题,题目如下: 有一学生成绩表,包括学号、姓名、3门课程成绩。已知该成绩表按学号升序排序。请编程实现,添加一个新的学生信息,且使成绩表仍按学号有序;若待添加的学号与已有学号重复,则输出错误信息,拒绝添加。 输入格式: 首先输入一个整数n(1<=n<=100),表示学生人数; 然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。 最后一行输入一个待添加的学生信息,包括学号

weixin_63617665的博客 3156

记一次用java从海康ISC下载rtsp历史数据过程

由于业务需要,需要从海康ISC中获取历史视频,但是查找了API只有一个获取历史RTSP的url的接口,但是这个rtsp的url用VLC播放不了,就尝试自己去抓包解析。 一、以下为用wireshark抓的rtsp包,rtsp和http类似,只是文本的交互协议,具体交互过程这里不阐述。 OPTIONS rtsp://192.168.30.254:554/openUrl/yOqDCw0?beginTime=20210712T090000&endTime=20210712T090100...

u010737670的博客 2707

记录一次小项目中的重放攻击与解决方案

文章目录1、重放攻击简介2、重放攻击演示3、解决方案4、重放攻击验证 欢迎各位 前(提)来(出)讨(意)论(见)。 1、重放攻击简介 重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。 举个简单的小例子。 我们往系统里面插入一条数据,如果此次操作的数据包被攻击者获取,又恰巧后台没有对重复内容进行验证,那么攻击者就可以利用该数据包重复的发起请求,无限制的往数据库插入数据,即使请求包是加密的也

fiveSix 8727

关于海康威视录像回放功能文件搜索失败问题

项目需要研究海康摄像头录像机等等,期间遇到一个录像回放的问题,跟大家分享一下,如果有帮助到大家,给一个评论就是对博主最大的支持。 是这样在调试录像机过程中,录像机后台管理页面录像功能调试正常,但在官方给出的java Demo调试 一直出现问题,如图: 调试未通过就无法去抠它的源码出来实现我们的功能,你是否遇到这个问题,按道理两个客户端通信原理一致,不知什么原因导致。那么我告诉你 如图我有两...

鸿鹄的博客 9623

【数据集实例】CMIP6气候模式数据下载-以河东地区为例

以河东地区为例,介绍CMIP6数据下载及处理

WW、forever的博客 4954

深入解析 OpenClaw(小龙虾)源码:架构设计与核心实现

OpenClaw用清晰、工程化的代码结构,将复杂的Agent交互流程变成了可管理、可扩展的流水线。无论是想深入了解Agent系统设计,还是希望二次开发定制自己的AI助理,阅读OpenClaw源码都是一次绝佳的学习旅程。希望本文能帮助你快速掌握OpenClaw的核心脉络。如果你对某个模块(如技能开发、安全机制)感兴趣,欢迎继续探讨。本文基于OpenClaw社区版本源码分析,具体实现可能随版本迭代有所调整,请以最新源码为准。

Ven%的博客 449

海康摄像头SDK二次开发错误问题解决方案(三):3. 错误:提示如“HCNetSDK.dll”组件缺失,无法加载问题

错误: 提示如“HCNetSDK.dll”组件缺失,无法加载问题 分析: MFC平台可能有bug,有时不能读取出“HCNetSDK.dll”文件; 解决: 可将HCNetSDK.dll等dll文件全放置到系统的System32文件夹里面。 即可解决!  ...

qq_41969790的博客 1万+

XCP实战系列介绍07-使用ASAP2 Editor生成A2l文件详解

介绍通过ASAP2 Editor工具生成A2l文件步骤详解

initiallizer的博客 7299

海康摄像头的二次开发(java)

海康摄像头的二次开发(java) 我第一次接触海康摄像头的二次开发的项目,一开始的时候摸不清套路,走了不少弯路,现在准备把我的一些经验留下来,让大家参考一下。 1、首先到海康的官网下载设备网络SDK:http://www.hikvision.com/cn/download_61.html,下载的时候注意版本号; 2、然后将下载的文件解压后,可以看到Demo示...

weixin_33919941的博客 1896

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

海康威视SDK基于JAVA二次开发

项目背景 项目中用到了海康威视的摄像机视频服务器。项目要求,要将海康威视的摄像视频同步按时间至我们自己的服务器,并且在项目中记录文件信息。

笑小枫 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java下载海康历史视频并合并转码

Java下载海康历史视频并合并转码 关于上一篇的升级版(补充一下,需要的小伙伴可能更明白点) 有时间补上,目前一直用的OneNote,很少分享了,也不知道好还是不好。。。 function getNowDate() { var date = new Date(); var split = "-"; var year = date.getFullYear(); ...

weixin_30244889的博客 1304

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

海康 sdk 视频截取 demo

说下这个demo 的背景 ..... 好了 说完了 直接上重点 .... 这是在网上看到一个 jijl 的朋友的 demo 基础上面开发的,用到了里面的一些东西 。示例demo 以及 web 版的demo 会放在文末 。 src/equment/hkwslin linux 版本的 src/equment/hkwswin windows 版本的 src/test 在此基础上面写的一个基于 海康 CVR 流ID 方式下载的demo 用到上面的...

跳动的石头 1715

java基于海康网络设备sdk二次开发

解压下载的sdk,将库文件目录下的文件放到一个固定地址,后期要根据这个地址来加载dll文件(windows和linux加载的文件不同,如需适配2个平台,需要在代码里面做如下判断)1、新建springboot项目,在resources下创建lib文件夹将sdk的java demo示例文件中的examples.jar、jna.jar拷贝到该文件夹下。在截取了视频保存到本地之后,发现不能直接打开,只能通过海康的VSPlayer软件打开,所以需要通过ffmpeg进行转码,转码工具内容如下。

qq_19800029的博客 1413

Java调用Hikvision接口并抓取Jpeg图片到内存

Java调用Hikvision接口并抓取Jpeg图片到内存

redfoxtao的专栏 3039
上一篇: java 并发编程-主线程等待多个子线程
下一篇: Tomcat配置jindi
评论 67
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值