java的jar是一个很不错的技术。可是现在开源的发展,使得一个项目中会用到很多很多的jar文件(我们的一个项目中,刚开始lib目录下有超过100兆的jar文件),一直怀疑有些文件是用不到的,但是又不太确定哪些是有用的,哪些是没用的。
想了想,决定还是做个小工具,一劳永逸地解决这个问题吧。
此小工具能完成如下功能:
1、将原来lib路径的所有jar备份到lib\bak目录下;
2、删除不用的jar
那怎么判断哪些是没用的呢?
这里用到了java -verbose:class,这个命令会将所有加载class的过程打印出来,如果是jar中的class, 还会指明是从哪个jar中加载的。
因此,通过在tomcat或者其他应用服务器的启动脚本中,添加-verbose:class,然后运行,即可获得加载信息。将其复制到一个log文件中,作为参数传递给JarCleaner即可。
-
- 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.InputStream;
- import java.util.HashSet;
- import java.util.Set;
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class JarCleaner {
-
- public Set<String> getNecessaryJarSet(String appLibPath , String logFile){
-
- String pattern = "\\[Loaded.*[\\/].*\\.jar\\]";
- Set<String> jarSet = new HashSet<String>();
-
- BufferedReader br = null;
- try {
- br = new BufferedReader(new FileReader(new File(logFile)));
- } catch (FileNotFoundException ee) {
- System.out.println("Can't find the log file." + ee.getMessage());
- }
-
- String aLine = "";
-
- while(true){
-
- try {
- aLine = br.readLine();
- } catch (IOException e) {
- System.out.println("End of log file.");
- }
-
- if (aLine == null) break;
-
- if (aLine.matches(pattern)){
- String[] strs = aLine.split("from");
- if (strs.length <= 0) continue;
- String jarName = strs[strs.length - 1].trim();
- if (jarName.startsWith("file")){
- jarName = jarName.substring(6);
- }
- jarName = jarName.substring(0, jarName.length() - 1);
- if (jarName.indexOf("/") > 0){
- jarName = jarName.replaceAll("[/]", "\\\\");
- }
-
- if (jarName.startsWith(appLibPath)){
- if (!jarSet.contains(jarName))
- jarSet.add(jarName);
- }
- }
- }
- return jarSet;
- }
-
- public Set<String> backupOriginalJars(String appLibPath){
- File libPath = new File(appLibPath);
- File[] jars = libPath.listFiles();
- Set<String> jarSet = new HashSet<String>();
-
- File bakPath = new File(appLibPath + "\\bak");
- if (!bakPath.exists())
- bakPath.mkdir();
-
- for (File jar : jars){
- String jarName = jar.getAbsolutePath();
- jarName.replaceAll("[/]", "\\\\");
- jarSet.add(jarName);
-
- File newJar = new File(appLibPath + "\\bak\\" + jar.getName());
- copyFile(newJar, jar);
- }
-
- return jarSet;
- }
-
- public void cleanJars(Set<String> allJars, Set<String> jarSet){
- allJars.removeAll(jarSet);
-
- for (String jarName : allJars){
- File oldJar = new File(jarName);
- oldJar.delete();
- }
-
- }
-
- private void copyFile(File targetFile, File file) {
- if (targetFile.exists()) {
- System.out.println("File:" + targetFile.getAbsolutePath()
- + " already existed, skip that file!");
- return;
- } else {
- createFile(targetFile, true);
- }
- System.out.println("copied " + file.getAbsolutePath() + " to "
- + targetFile.getAbsolutePath());
- try {
- InputStream is = new FileInputStream(file);
- FileOutputStream fos = new FileOutputStream(targetFile);
- byte[] buffer = new byte[1024];
- while (is.read(buffer) != -1) {
- fos.write(buffer);
- }
- is.close();
- fos.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- private void createFile(File file, boolean isFile) {
- if (!file.exists()) {
- if (!file.getParentFile().exists()) {
- createFile(file.getParentFile(), false);
- } else {
- if (isFile) {
- try {
- file.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- } else {
- file.mkdir();
- }
- }
- }
- }
-
-
-
-
-
- public static void main(String[] args) throws Exception{
- if (args.length != 2){
- System.out.println("Usage : java JarCleaner <webapp lib path> <class verbose log file>\n" +
- "This command will backup all jar files in your specified webapp lib path,\n" +
- "and remain the necessary jars only.\n" +
- " <webapp lib path> : the full path of your web application located.\n" +
- " <class verbose file> : the full path of your log file. \n" +
- " use:java -verbose:class to get the log content.\n\n" +
- "Note: You must shut down the server before run this command.");
- System.exit(-1);
- }
- String appLibPath = args[0].trim();
- String logFile = args[1].trim();
-
- JarCleaner cleaner = new JarCleaner();
-
- Set<String> jarSet = cleaner.getNecessaryJarSet(appLibPath, logFile);
-
-
- Set<String> allJars = cleaner.backupOriginalJars(appLibPath);
-
-
- cleaner.cleanJars(allJars, jarSet);
- }
-
- }
-
分享到:
相关推荐
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
系统可以提供信息显示和相应服务,其管理新冠抗原自测平台小程序信息,查看新冠抗原自测平台小程序信息,管理新冠抗原自测平台小程序。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7 小程序开发工具:hbuildx/微信开发者工具
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
新建 文本文档.docx
hw06
3. Kafka入门-安装与基本命令
燃气管道施工资质和特种设备安装改造维修委托函.docx
AI大模型研究相关报告
lab02
仅供学习使用,其他用途请购买正版资源AVPro Video Core Windows Edition 2.2.3 亲测可用的视频播放插件,能丝滑播放透明视频等.
建设工程消防验收现场指导意见表.docx
MVIMG_20241222_194113.jpg
五相电机双闭环矢量控制模型_采用邻近四矢量SVPWM_MATLAB_Simulink仿真模型包括: (1)原理说明文档(重要):包括扇区判断、矢量作用时间计算、矢量作用顺序及切时间计算、PWM波的生成; (2)输出部分仿真波形及仿真说明文档; (3)完整版仿真模型:包括邻近四矢量SVPWM模型和完整双闭环矢量控制Simulink模型; 资料介绍过程十分详细,零基础手把手教学,资料已经写的很清楚
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7