文档章节

模拟maven的管理jar包。使用文件签名。非版本号

林小宝
 林小宝
发布于 2018/06/07 16:37
字数 1180
阅读 7
收藏 0

说明

    在家整理以前的项目时,并想备份到网盘,发现项目很多都不是使用maven的老项目,感觉jar非常多,而且重复也比较多,所以就想把那些重复的jar去掉,并可以还原。

使用缓存 java  Jars  cache  是否清理jar 地址
 还原      java Jars  restore  地址

原理是会在有.project文件的目录生成一个.jars文件用来记录 相对地址下的jar,及其md5值

最后发现:其实并没有什么用,权当呵呵了。

代码集

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * 模拟Maven管理jar包,程序。
 * 
 * @author zenglb
 */
public class Jars {
    /**
     * 池的根目录
     */
    private final File jarsCache;
    private final String jarsCachePath;
    /**
     * 默认提供的配置文件。
     */
    private static final String DEFAULT_JARS_FILE_NAME = "/.jars";
 
    /**
     * 需要传入jar池的地址。
     * 
     * @param jarsCache
     */
    public Jars(String jarsCache) {
        this.jarsCache = new File(jarsCache);
        if (!this.jarsCache.exists()) {
            this.jarsCache.mkdir();
        }
        if (this.jarsCache.isFile()) {
            throw new IllegalArgumentException("jarsCache must exists be a Directory!");
        }
        jarsCachePath = this.jarsCache.getAbsolutePath();
    }
 
    public Jars() {
        this("D:/0_base" + DEFAULT_JARS_FILE_NAME);
    }
 
    public void analysis(String pathName, boolean isCache, boolean isClear) {
        File path = new File(pathName);
        if (!path.exists() || path.isFile()) {
            throw new IllegalArgumentException("pathName must exists and isDirectory!");
        }
        fileEach(path, isCache, isClear);
    }
 
    private void fileEach(File path, boolean isCache, boolean isClear) {
        if (null != path) {
            Logs.debug("analysis isCache = [%s] isClear =[%s]  %s ", isCache, isClear, path.getAbsolutePath());
            if (path.exists()) {
                if (path.isFile()) {
                    return;
                }
                boolean project = isProject(path);
                if (project) {
                    if (isCache) {
                        cacheProject(path, isClear);
                    } else {
                        restoreProject(path);
                    }
                } else {
                    File[] files = path.listFiles();
                    if (null != files) {
                        for (File file : files) {
                            fileEach(file, isCache, isClear);
                        }
                    }
                }
            }
        }
    }
 
    /**
     * 还原一个java工程
     * 
     * @param path
     */
    private void restoreProject(File path) {
        if (isProject(path)) {
            String base = path.getAbsolutePath();
            Logs.debug("restore project: %s", base);
            Logs.debug("=======================================");
            File jars = new File(base + DEFAULT_JARS_FILE_NAME);
            if (jars.exists() && jars.isFile()) {
                BufferedReader in = null;
                try {
                    in = new BufferedReader(new FileReader(jars));
                    String line = null;
                    String[] tt = null;
                    File jar = null;
                    while (null != (line = in.readLine())) {
                        tt = line.split("####");
                        if (tt.length == 2) {
                            jar = new File(base + tt[0].trim());
                            Logs.debug("try restore %s >> %s", jar.getName(), tt[1].trim());
                            restoreJar(jar, tt[1].trim());
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    IOKit.closeIo(in);
                }
 
            }
        }
    }
 
    /**
     * 缓存一个工程
     * 
     * @param path
     * @param isClear
     */
    private void cacheProject(File path, boolean isClear) {
        if (isProject(path)) {
            Logs.debug("cache project: %s", path.getAbsolutePath());
            Logs.debug("-----------------------------------------");
            List<File> jarFileLst = new ArrayList<File>();
            findJars(path, jarFileLst);
 
            String md5 = null;
            String relativePath = null;
            ArrayList<String> jarsContent = new ArrayList<String>();
            int basePath = path.getAbsolutePath().length();
            for (File jar : jarFileLst) {
                md5 = getFileMD5(jar);
                Logs.debug("try cache %s >> %s", jar.getName(), md5);
                relativePath = jar.getAbsolutePath().trim().substring(basePath);
                jarsContent.add(relativePath + "####" + md5);
                cacheJar(jar, md5);
            }
 
            if (!jarsContent.isEmpty()) {
                File f = new File(path.getAbsolutePath() + DEFAULT_JARS_FILE_NAME);
                if (f.exists()) {
                    Logs.debug("rename " + DEFAULT_JARS_FILE_NAME);
 
                    copyFile(f, new File(
                            f.getAbsoluteFile() + ".bak." + DateKit.printDateTime(new Date(), "yyyyMMddHHmmss")));
                }
                PrintWriter out = null;
                try {
                    out = new PrintWriter(f);
                    for (String ss : jarsContent) {
                        out.println(ss);
                    }
                } catch (FileNotFoundException e) {
                } finally {
                    try {
                        out.flush();
                    } catch (Exception e) {
                    }
                    IOKit.closeIo(out);
                }
                if (isClear) {
                    Logs.debug("delete jars! : %s", jarFileLst.size());
                    for (File file : jarFileLst) {
                        file.delete();
                    }
                }
            }
            Logs.debug("=======================================");
            Logs.debug("\n");
        }
    }
 
    /**
     * 查找工程中的所有jar包
     * 
     * @param path
     * @param jarFileLst
     */
    private void findJars(File path, List<File> jarFileLst) {
        if (null != jarFileLst && null != path && path.exists()) {
            if (path.isFile() && path.getName().trim().toLowerCase().endsWith(".jar")) {
                jarFileLst.add(path);
            } else if (path.isDirectory()) {
                File[] files = path.listFiles();
                if (null != files) {
                    for (File file : files) {
                        findJars(file, jarFileLst);
                    }
                }
            }
        }
    }
 
    /**
     * 缓存jar
     * 
     * @param jar
     * @param md5
     * @return
     */
    private boolean cacheJar(File jar, String md5) {
        if (null != jar && jar.isFile() && null != md5) {
            File saveFile = new File(jarsCachePath + getCachePath(jar.getName(), md5));
            FileKit.makeDir(saveFile.getParentFile());
            if (saveFile.exists() && md5.equals(getFileMD5(saveFile))) {// 已经存在
                Logs.debug("cache %s exists", jar.getName());
                return true;
            }
            copyFile(jar, saveFile);
            Logs.debug("cache  %s success", jar.getName());
            return true;
        }
        Logs.debug("cache  %s[%s] falid", null != jar ? jar.getName() : "ERR", md5);
        return false;
    }
 
    /**
     * 还原一个jar到指定地址
     * 
     * @param jar
     * @param md5
     * @return
     */
    private boolean restoreJar(File jar, String md5) {
        String name = jar.getName();
        if (jar.exists() && md5.equals(getFileMD5(jar))) {
            Logs.debug("restore %s exists", name);
            return true;
        }
        File dbFile = new File(jarsCachePath + getCachePath(name, md5));
        if (dbFile.exists() && md5.equals(getFileMD5(dbFile))) {
            FileKit.makeDir(jar.getParentFile());
            copyFile(dbFile, jar);
            Logs.debug("restore  %s success", name);
            return true;
        }
        Logs.debug("restore  %s[%s] falid", name, md5);
        return false;
    }
 
    /**
     * 通过名字的hash值计算包所在地址。
     * 
     * @param name
     * @param md5
     * @return
     */
    protected String getCachePath(String name, String md5) {
        int hash = name.hashCode();
        hash = (hash > 0 ? hash : 0 - hash) % 1000;
        return String.format("/%3$02x/%4$03x/%1$s_%2$s", name, md5, hash / 100, hash % 100);
    }
 
    /**
     * 是否为一个项目,包含.classpath和.project文件就是项目。
     * 
     * @param path
     * @return
     */
    public boolean isProject(File path) {
        int i = 1;
        if (null != path && path.exists() && path.isDirectory()) {
            File[] lst = path.listFiles();
            String fileName = null;
            if (null != lst) {
                for (File file : lst) {
                    if (file.isFile()) {
                        fileName = file.getName();
                        if (".project".equalsIgnoreCase(fileName.trim())) {
                            i--;
                        }
                    }
                }
            }
        }
        return i <= 0;
    }
 
    /**
     * 计算文件的MD5值
     * 
     * @param file
     * @return
     */
    private static String getFileMD5(File file) {
        if (null == file || !file.isFile()) {
            return null;
        }
        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            byte[] data = IOKit.readToByteBuffer(in, Integer.MAX_VALUE);
            return DigestKit.md5Digest(data).toLowerCase();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOKit.closeIo(in);
        }
        return null;
    }
 
    private static boolean copyFile(File src, File to) {
        if (null != src && src.isFile() && null != to) {
            FileInputStream in = null;
            FileOutputStream out = null;
            byte[] tmp = new byte[8192];
            try {
                in = new FileInputStream(src);
                out = new FileOutputStream(to);
                int n = 0;
                while (-1 < (n = in.read(tmp))) {
                    out.write(tmp, 0, n);
                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != out) {
                    try {
                        out.flush();
                    } catch (IOException e) {
                    }
                    IOKit.closeIo(out);
                }
                IOKit.closeIo(in);
            }
        }
        return false;
    }
 
    public static void main(String[] args) throws Exception {
        args = new String[] { "restore", "D:/tmp/J2EE_WP" };
        boolean isERROR = true;
        if (args.length >= 2) {
            Boolean isCache = null;
            boolean isClear = false;
            if ("cache".equals(args[0])) {
                isCache = true;
                if (args.length == 3) {
                    isClear = Boolean.valueOf(args[1]);
                }
            } else if ("restore".equals(args[0])) {
                isCache = false;
            }
            String pathName = args[args.length - 1].trim();
            if (null != isCache) {
                new Jars().analysis(pathName, isCache, isClear);
                return;
            }
        }
        if (isERROR) {
            Logs.debug("using type[cache|restore] isClear[true|false] projectPath");
        }
    }
}

创建目录

/**
 * 创建文件夹
 * 
 * @param file
 * @return
 */
public static synchronized boolean makeDir(File file) {
    if (null != file) {
        if (file.exists() && file.isDirectory()) {
            return true;
        }
        if (makeDir(file.getParentFile())) {
            file.mkdir();
            return true;
        }
    }
    return false;
}

读取数据

public static byte[] readToByteBuffer(InputStream inStream, int maxSize) throws IOException {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        if (maxSize > 0) {
            int bufferSize = 0x2000;
            byte[] buffer = new byte[bufferSize];
            int read;
            int remaining = maxSize;
 
            while (true) {
                read = inStream.read(buffer);
                if (-1 == read) {
                    break;
                }
                if (read > remaining) {
                    outStream.write(buffer, 0, remaining);
                    break;
                }
                remaining -= read;
                outStream.write(buffer, 0, read);
                if (bufferSize > read) {
                    break;
                }
            }
        }
        return outStream.size() > 0 ? outStream.toByteArray() : null;
    }

© 著作权归作者所有

林小宝
粉丝 5
博文 30
码字总数 11167
作品 2
深圳
私信 提问
Spring Boot + WebJars 整合运用

Spring Boot + WebJars 整合运用 #### 示例:SpringBoot 第十八章:web应用开发之WebJars使用 WebJars(https://www.webjars.org/)介绍及使用  什么是WebJars  为什么使用  原理 如何使用 ...

近在咫尺远在天涯
05/06
0
0
Github开源Java项目(IJPay)上传到Maven Central Repository 方法详细介绍

之前IJPay Jar是上传到JitPack,但是有很多同学反馈说Jar无法下载。为了响应群众的号召,这次需要向中央仓库提交jar, 我们可以利用Sonatype OSSRH把Jar等资源提交给Maven的中央仓库。 Sonaty...

Javen205
2017/09/02
0
0
Maven相关内容收集整理-01

pom.xml配置文件说明 示例: 2. 配置补充说明 2.1. 关于版本号的管理 常见的GNU风格的版本号命名格式: 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]] 示例: 4.2.5, 4.2.8.1 GNU风格...

Hyou
2016/09/22
19
0
maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级...

嗯哼9925
2017/11/15
0
0
Maven 中 dependencies 与 dependencyManagement 的区别

Maven 中 dependencies 与 dependencyManagement 的区别 前提 这段时间项目中遇到过了一些 Jar 包冲突的问题,很多是由于我们项目模块很多的时候,用 Maven 管理不当导致的冲突问题,本文就这...

晨猫
2018/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux日志切割工具 logrotate

Linux系统默认安装logrotate,默认的配置文件: /etc/logrotate.conf /etc/logrotate.d/ logrotate.conf:为主配置文件 logrotate.d:为配置相关子系统,用于隔离每个应用配置(Nginx、PHP、...

llzzzz
11分钟前
0
0
不得不收藏的大数据Hadoop教程:Hadoop集群搭建

搭建环境安装时间同步Yum install -y ntpdate 网络时间同步命了 服务器地址是阿里云ntpdate ntp1.aliyun.com 手动时间同步方式date -s "20190622 12:32:00" #yyyymmdd hh:mm:ss完全分布式服务...

好程序员IT
14分钟前
0
0
xhprof php性能分析工具

php7 没有官方版 下载地址git clone https://github.com/longxinH/xhprof cd xhprof/extension/ 进入目录指定phpconfig地址进行安装 extension=xhprof.so xhprof.output_dir=/tmp 安装包中x......

曲文
15分钟前
0
0
CentOS7安装GitLab的过程详解

安装Gitlab Step 1.安准基础依赖 $ yum install -y curl policycoreutils-python openssh-server Step 2.安装Postfix 说明:Postfix是一个邮件服务器,GitLab发送邮件需要用到 $ yum ins...

Linux_Anna
16分钟前
0
0
Centos 用docker安装Confluence

1. 下载官方镜像 docker pull atlassian/confluence-server:6.15.7-alpine 2. 创建并运行容器 docker run -m 1024M --memory-swap -1 -host --net=host --name wiki -d -p 8090:8090 -p 800......

熊小熊会写代码哦
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部