Java Swing编写批量模糊替换jar包小工具

news2024/9/20 20:37:41

用途:由于jar包升级需要对之前jar包进行替换,而版本后缀不一致需要人工手动比对

作用:代码升级后,同一个模块jar包相同只有后缀不同,编写小工具进行比对进行替换名称,避免人工核对

技术点:Java Swing

好处:编写代码完成后,打包双击可直接运行,有用前台可视化页面,代码较少使用方便

Java Swing基本组件介绍:

JPanel(面板)

JPanel是Java Swing包的一部分,是一个可以存储一组组件的容器。JPanel的主要任务是组织组件,可以在JPanel中设置各种布局,以更好地组织组件,但是它没有标题栏。

//创建一个新的 JPanel双缓冲区和流布局。  
JPanel jPanel = new JPanel() 
//创建一个新的 JPanel与 FlowLayout和指定的缓冲策略。  
JPanel jPanel = new JPanel(boolean isDoubleBuffered) 
//使用指定的布局管理器创建一个新的缓冲JPanel  
JPanel jPanel = new JPanel(LayoutManager layout) 
//使用指定的布局管理器和缓冲策略创建一个新的JPanel。  
JPanel jPanel = new JPanel(LayoutManager layout, boolean isDoubleBuffered) 

JLabel标签

JLabel是JPanel中的标签,可以包含文本、图像,或者两者都包括。

JLabel jLabel = new JLabel("Hi,我是标签");
//添加到面板
Jpanel1.add(jLabel);
//将面板添加到窗口
jFrame.add(Jpanel1);

小工具实现原理

根据浏览框选择我们想要替换的目录,根据选择的目录在后台读取该目录下的所有jar文件,并进行提示,防止误替换操作,点同意后,对原有jar包所在目录与新jar包所在目录进行对比替换,同时把日志打印在页面控制台,也可同时生成日志文件在本地目录作为保存。

public class MainFrame {
    public static void main(String[] args) {

        // 创建 JFrame 实例
        JFrame frame = new JFrame("jar包批量模糊替换");
        // Setting the width and height of frame
        frame.setSize(500, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /* 创建面板,这个类似于 HTML 的 div 标签
         * 我们可以创建多个面板并在 JFrame 中指定位置
         * 面板中我们可以添加文本字段,按钮及其他组件。
         */
        JPanel panel = new JPanel();
        panel.setBounds(10,10,500,220);
//        // 添加面板
        frame.add(panel);
        JTextArea infoText4 = new JTextArea();
        /*
         * 调用用户定义的方法并添加组件到面板
         */
        placeComponents(panel,infoText4);
        // 设置界面可见
        frame.setVisible(true);
        frame.setBounds(500, 500, 650, 320);
    }

    private static void placeComponents(JPanel panel,JTextArea infoText4) {
        /* 布局部分我们这边不多做介绍
         * 这边设置布局为 null
         */
        panel.setLayout(null);

        // 创建 JLabel
        JLabel userLabel = new JLabel("执行更名目录");
        userLabel.setBounds(10, 20, 80, 25);
        panel.add(userLabel);

        /*
         * 创建文本域用于用户输入
         */
        final JTextField infoText = new JTextField();

        //  第一行输入框
        infoText.setBounds(150, 20, 350, 25);
        panel.add(infoText);


        JLabel userLabel2 = new JLabel("目标参考目录");
        userLabel2.setBounds(10, 50, 130, 25);
        panel.add(userLabel2);

        final JTextField infoText2 = new JTextField();

        //  第er行输入框
        infoText2.setBounds(150, 50, 350, 25);
        panel.add(infoText2);


        // 输入密码的文本域
        JLabel passwordLabel2 = new JLabel("模糊匹配规则");
        passwordLabel2.setBounds(10, 80, 130, 25);
        panel.add(passwordLabel2);
        //  第3行输入框
        final JTextField infoText3 = new JTextField();
        infoText3.setBounds(150, 80, 350, 25);
        infoText3.setText("bemp");
        infoText3.setEditable(false);
        panel.add(infoText3);

        // 按钮
        JButton loginButton = new JButton("浏览");
        loginButton.setBounds(500, 20, 100, 25);
        loginButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                infoText.setText(jButton1ActionPerformed(evt));
            }

        });
        panel.add(loginButton);

        JButton loginButton1 = new JButton("浏览");
        loginButton1.setBounds(500, 50, 100, 25);
        loginButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                infoText2.setText(jButton1ActionPerformed(evt));
            }

        });
        panel.add(loginButton1);
        //执行
        JButton loginButton2 = new JButton("执行");
        loginButton2.setBounds(150, 110, 350, 25);


        JScrollPane scrollpane=new JScrollPane();//创建滚动条面板
        scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollpane.setBounds(20, 150, 600, 80);
        scrollpane.setViewportView(infoText4);
        panel.add(scrollpane);


        infoText4.setLineWrap(true);



        loginButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                String text = infoText.getText();
                List<String> fileList = getFileList(text);

                if ("".equals(text) && "".equals(infoText2.getText())){
                    JOptionPane.showConfirmDialog(null, "请先选择目录","提示", JOptionPane.OK_CANCEL_OPTION);

                }else {
                    int i = JOptionPane.showConfirmDialog(null, "检测到"+text+"目录下含有"+fileList.size()+"个可替换文件是否需要替换","提示", JOptionPane.OK_CANCEL_OPTION);
                    if (i == 0){
                        String text1 = infoText2.getText();
                        Date date = new Date();
                        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                    Logger.log("模糊替换开始执行"+sdf.format(date),text);
                        infoText4.append("模糊替换开始执行"+sdf.format(date));
                        infoText4.append("\n");
                        Changes(evt,text,text1,infoText4);
                        Date date1 = new Date();
//                    Logger.log("模糊替换执行结束"+sdf.format(date1),text);

                        infoText4.append("模糊替换结束执行"+sdf.format(date1));
                        infoText4.append("\n");
                }
                }
            }

        });
        panel.add(loginButton2);



    }
    private static String jButton1ActionPerformed(ActionEvent evt){
        JFileChooser chooser = new JFileChooser(); //文件选择
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.showOpenDialog(chooser);        //打开文件选择窗
        File openFile = chooser.getSelectedFile();    //获取选择的文件
        String textPath = openFile.getPath();    //获取选择文件的路径
        return textPath;
    }
    private static void Changes(ActionEvent evt,String text,String text1,JTextArea infoText4){
        List<String> fileList = getFileList(text);
        //参考目录
        List<String> fileList1 = getFileList(text1);
//根据自自己规则进行匹配
        for (int i = 0; i < fileList.size(); i++) {
            String filename = fileList.get(i).substring(text.length());
            
            for (int j = 0; j < fileList1.size(); j++) {
                String substring = filename.substring(1, 5);
                if (fileList1.get(j).contains(filename) && "bemp".equals(filename.substring(1, 5))){
                    if (!fileList.get(i).substring(text.length()+1).equals(fileList1.get(j).substring(text1.length()+1))){
                        //替换名称
                        File file = new File(fileList.get(i));
                        //修改成功
                        boolean b = file.renameTo(new File(text+fileList1.get(j).substring(text1.length())));
//                        Logger.log(fileList.get(i).substring(text.length()+1)+" -> "+fileList1.get(j).substring(text1.length()+1),text);
                        infoText4.append(fileList.get(i).substring(text.length()+1)+" -> "+fileList1.get(j).substring(text1.length()+1));
                        infoText4.append("\n");
                    }
                    break;
                }
            }

        }
    }
    public static List<String> getFileList(String strPath) {
        ArrayList<String> filelist = new ArrayList<>();
        File dir = new File(strPath.trim());
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getName();
                if (files[i].isDirectory()) { // 判断是文件还是文件夹
                    //文件夹不管
                    //      getFileList(files[i].getAbsolutePath()); // 获取文件绝对路径
                } else {
                    String strFileName = files[i].getAbsolutePath();
                    if (strFileName.contains(".jar") && strFileName.contains("xxx")){
                        filelist.add(strFileName);
                    }

                }
            }
        }
        return filelist;

    }
}

文件生成日志

public class Logger {
    public static void log(String arg,String text){
        PrintStream out=null;
        try {
            if (!new File(text+"/logs").exists()){
                new File(text+"/logs").mkdir();
            }
            //指向一个文件日志
            Date nowTime=new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
            String path = text+"/logs/"+"/bemp_jar_ren_log"+sdf.format(nowTime)+".txt";
            out=new PrintStream(new FileOutputStream(path,true));
            //改变输出方向,输出到out中
            System.setOut(out);


            System.out.println(arg);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            if(out !=null){
                out.close();
            }
        }
    }

}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快来看看Java在编程语言中的优势与特性吧

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 其他专栏&#xff1a;《系统解析C语言》《C语言》《C语言-语法篇》 内容分享&#xff1a…

iview ui vue2.0 radio 点击选中状态后取消选中状态

<RadioGroup v-model"formData.deficiencyType"><Radio label"1" :disabled"modalTypeC?true:false" click.native"cancelSelection(1)">1</Radio><Radio label"2" :disabled"modalTypeC?tru…

基于Java校园自助洗衣系设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

MIT6.584分布式-原MIT6.824-lab1-2023年万字从0到1小白学习笔记

文章目录 前置准备一、分布式系统知识的学习1.1分布式Go语言环境安装1.2MIT6.824课程的学习1.2* 前言学习 可以看到这个任务是不会完成的&#xff0c;在我们没有开始进行编码的时候1.3课程需求1.4怎么实现、借助课程的Hints1.5首先看看其mapfunction的工作逻辑&#xff1a; 二、…

2023上半年软考系统分析师科目一整理-09

2023上半年软考系统分析师科目一整理-09 IDEF (Integration DEFinition method &#xff0c;集成定义方法)是一系列建模、分析和仿真方法的统称&#xff0c;每套方法都是通过建模来获得某种特定类型的信息。其中&#xff0c; IDEFO 可以进行&#xff08;C&#xff09;建模; IDE…

互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用

目录 一、SpringBoot快速整合Feign 1.添加Pom依赖 2.启动类添加注解 3.引用Feign服务 二、为请求添加Header的3种方式 1.添加固定header 2.通过接口签名添加header 3.动态添加header 三、为请求添加超时配置 1.默认超时时间 3.超时异常 4.全局超时配置 5.为单个服…

Linux:安装jdk

一、tar压缩包形式安装jdk&#xff1a; 1、安装到/opt目录下&#xff0c;如下图所示&#xff0c;先将tar.gz压缩包移动到/opt目录下&#xff0c;然后解压出来&#xff0c;命令依次是&#xff1a; tar -zxvf jdk-8u151-linux-x64.tar.gz 2、解压缩完毕后&#xff0c;我们使用ls命…

ArrayList继承了AbstractList,已经间接实现了List接口,那么为什么ArrayList还要显式实现List接口呢

这是因为,通过显式实现接口,ArrayList可以确保: 它实际上已经完整实现了List接口所规定的所有方法。 更明确地告诉其他程序员:这个类的目的是完整实现List接口。 如果ArrayList仅仅继承AbstractList,而未显式实现List接口,那么其他程序员在阅读代码时,无法立即确定这个类是否完…

STM32单片机(三)第二节:GPIO输出练习3(蜂鸣器)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

VTK 三维移动旋转工具 ,移动工具 旋转工具 三维旋转工具

前言&#xff1a;本文为该系列的第一篇建立3D交互窗口&#xff0c;​ 基于VTK&QT&#xff0c;建立3D交互窗口&#xff1b; 基本信息 开发平台&#xff1a;VS&QT 版 本&#xff1a;VS2017 & QT5.15.2 & VTK9.0.3 功能&#xff1a; 选中控件 移动 旋转 …

卷积神经网络的三大特性

卷积神经网络&#xff08;CNN&#xff09;的三大特性是&#xff1a; Sparse Interaction&#xff08;稀疏交互&#xff09;&#xff1a;稀疏交互是指在卷积神经网络中&#xff0c;每个神经元仅与输入数据的局部区域进行交互。这意味着神经元只对输入数据的一小部分感知&#xf…

Qt自定义控件(数字框与拖拽条互动)

一、效果 自定义红色区域组件&#xff0c;做到数字与拖拽条相互影响。 二、实现 输入合适的名字 打开自定义组件ui 选择合适的组件进行布局 将两个空间的信号和值进行绑定 新增自定义函数并实现 #include "smallwidget.h" #include "ui_smallwidget.h"sma…

从架构角度看网络安全:数字化时代企业如何构建防御体系?

导语 | 数字化时代&#xff0c;网络安全已经成为企业发展的重中之重&#xff0c;通过体系化的安全建设&#xff0c;企业可以从容应对愈加复杂的网络安全挑战。今天&#xff0c;我们特邀了腾讯云 TVP、赛博英杰科技董事长 谭晓生老师&#xff0c;他将从资深技术专家视角解读如何…

vscode vue-helper插件导致vscode 自动换行快捷键失效

vue-helper插件&#xff1a;代码提示&#xff0c;点击文件路径快速跳转。 vue-helper导致vscode功能异常&#xff1a;自动换行的快捷键&#xff08;alt Z&#xff09;失效了。 因为我平时看代码的时候喜欢 换行和不换行之间来回切换&#xff0c;所以这个alt Z 我是经常用的。…

URL缩短服务:复杂问题的简洁解决方案

项目简介&#xff1a;TinyURL是一项在线服务&#xff0c;允许用户将长网址缩短为简洁的短网址&#xff0c;以便于分享和使用。这种服务尤其适用于社交媒体和电子邮件&#xff0c;因为这些平台对链接长度可能有限制。TinyURL的使用非常简单&#xff0c;只需在它的网站上输入长网…

【 Android11 WiFi开发 一 】WiFi列表获取与展示

前言 最近在Android11上开发了WiFi相关功能&#xff0c;涉及到WiFi列表的获取、连接有密码的WiFi、连接已保存的WiFi、忘记连接的WiFi、添加其他WiFi。涉及到的知识点较多作以分篇记录&#xff0c;本篇将介绍WiFi列表的获取与展示。 说明 下面梳理下WiFi列表获取流程&#xff1…

白嫖的text2video模型ZeroScope_v2

ZeroScope是一种基于ModelScope的视频生成模型&#xff0c;可以通过文本生成16:9的高质量视频。 Zeroscape 是一种基于 Transformer 架构的语言生成模型&#xff0c;其中包括了多种不同的变体和版本。其中&#xff0c;zeroscape_v2 是一种较新的模型&#xff0c;相较于之前的版…

浅谈电气火灾监控系统在高层建筑的应用

摘要&#xff1a;通过介绍上海某高层建筑电气火灾监控系统设计情况&#xff0c;对电气火灾监控系统工作特点和具体设计内容进行说明&#xff0c;同时提出一些设 计过程中需注意的事项&#xff0c;供业内人士借鉴&#xff0c;以期增进对电气火灾监控系统设计的重视&#xff0c;…

【vim】Linux种的vim

:q quit (close window) :w save (“write”) :wq save and quit :e {name of file} open file for editing :ls show open buffers :help {topic} open help :help :w opens help for the :w command:help w opens help for the w movement <ESC>进入vim模式 &l…

Python如何调用C库(Windows Linux)

软硬件环境 ubuntu 18.04 64bitwindows 10 64bitPython 3.8GCC 4.9visual studio 前言 在做 python 开发中&#xff0c;经常会碰到&#xff0c;需要通过调用 C 的一个动态链接库来获取相应的值。本文详细讲解了 Windows 和 Linux 2个平台上的不同实现。 linux版的动态库 写个简…