开发web应用时,有时更新了类却没有生效,事实上是由于jboss/tomcat中其它公布包下有同名类(包含全路径都同样)。

于是萌发了做个程序来检查指定文件夹是否存在反复类(通过asm从类文件里取类的全路径),扩展开来,还支持查找反复的文件(按文件md5进行比較),反复的jar文件。

主要代码例如以下:

package cn.jerryhouse.util.dup_files;

import java.io.File;

public abstract class FileProcessor {
private long totalFileCount = 0;
private long processedFileCount = 0;
public void processFiles(File[] dirs) throws Exception {
for (File file : dirs) {
processFile(file);
}
} public void processFile(File file) throws Exception {
if (file.isFile()) {
if (isFileAccepted(file)) {
handleFile(file);
processedFileCount++;
}
totalFileCount++;
} else {
File[] files = file.listFiles();
for (File fileInDir : files) {
processFile(fileInDir);
}
}
} protected boolean isFileAccepted(File file) throws Exception {
return true;
} protected abstract void handleFile(File file); public long getTotalFileCount() {
return totalFileCount;
} public long getProcessedFileCount() {
return processedFileCount;
}
}

package cn.jerryhouse.util.dup_files;

import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; public class FileDupFinder extends FileProcessor {
protected Map<String, List<String>> fileMap = new ConcurrentHashMap<String, List<String>>();
public void analyseResult() {
boolean foundDup = false;
for (Entry<String, List<String>> entry : fileMap.entrySet()) {
List<String> classPathList = entry.getValue();
if (classPathList.size() > 1) {
System.out.println(" paths:"
+ classPathList);
foundDup = true;
}
}
if (foundDup == false) {
System.out.println("No duplicate file found.");
}
} protected void handleFile(final File file) {
try {
String fileMD5 = FileDigest.getFileMD5(file);
try {
List<String> list;
if (fileMap.get(fileMD5) != null) {
list = fileMap.get(fileMD5);
list.add(file.getCanonicalPath());
} else {
list = new LinkedList<String>();
list.add(file.getCanonicalPath());
fileMap.put(fileMD5, list);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
} }

package cn.jerryhouse.util.dup_files;

import java.io.File;

public class JarFileDupFinder extends FileDupFinder {

	protected boolean isFileAccepted(final File file) throws Exception
{
if(file.getCanonicalPath().endsWith(".jar"))
{
return true;
}
else
{
return false;
}
} }
package cn.jerryhouse.util.dup_files;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry; import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor; public class ClassDupFinder extends FileDupFinder { protected boolean isFileAccepted(final File file) throws Exception {
if (file.getCanonicalPath().endsWith(".class")) {
return true;
} else {
return false;
}
} public void analyseResult() {
boolean foundDup = false;
for (Entry<String, List<String>> entry : fileMap.entrySet()) {
List<String> classPathList = entry.getValue();
if (classPathList.size() > 1) {
System.out.println("class:" + entry.getKey() + " paths:"
+ classPathList);
foundDup = true;
}
}
if (foundDup == false) {
System.out.println("No duplicate class found.");
}
} protected void handleFile(final File file) {
try {
String filePath = file.getCanonicalPath();
ClassVisitor visitor = new ClassVisitor() {
@Override
public void visit(int version, int access, String name,
String signature, String superName, String[] interfaces) {
try {
List<String> list;
if (fileMap.get(name) != null) {
list = fileMap.get(name);
list.add(file.getCanonicalPath());
} else {
list = new LinkedList<String>();
list.add(file.getCanonicalPath());
fileMap.put(name, list);
}
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void visitSource(String source, String debug) {
} @Override
public void visitOuterClass(String owner, String name,
String desc) {
} @Override
public AnnotationVisitor visitAnnotation(String desc,
boolean visiable) {
return null;
} @Override
public void visitAttribute(Attribute attr) {
} @Override
public void visitInnerClass(String name, String outerName,
String innerName, int access) {
} @Override
public FieldVisitor visitField(int access, String name,
String desc, String signature, Object value) {
return null;
} @Override
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
return null;
} @Override
public void visitEnd() {
}
};
ClassReader cr = new ClassReader(new FileInputStream(filePath));
cr.accept(visitor, 0);
} catch (Exception e) {
e.printStackTrace();
}
} }
package cn.jerryhouse.util.dup_files;

import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map; public class FileDigest {
/**
* 获取单个文件的MD5值
* @param file
*/
public static String getFileMD5(File file) {
if (!file.isFile()) {
return null;
}
MessageDigest digest = null;
FileInputStream in = null;
byte buffer[] = new byte[1024];
int len;
try {
digest = MessageDigest.getInstance("MD5");
in = new FileInputStream(file);
while ((len = in.read(buffer, 0, 1024)) != -1) {
digest.update(buffer, 0, len);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
BigInteger bigInt = new BigInteger(1, digest.digest());
return bigInt.toString(16);
} /**
* 获取文件夹中文件的MD5值
* @param file
* @param listChild 为true时,递归子文件夹中的文件;否则不递归
*/
public static Map<String, String> getDirMD5(File file, boolean listChild) {
if (!file.isDirectory()) {
return null;
}
Map<String, String> map = new HashMap<String, String>();
String md5;
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
File f = files[i];
if (f.isDirectory() && listChild) {
map.putAll(getDirMD5(f, listChild));
} else {
md5 = getFileMD5(f);
if (md5 != null) {
map.put(f.getPath(), md5);
}
}
}
return map;
}
}
package cn.jerryhouse.util.dup_files;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader; public abstract class LineReaderProcessor extends FileProcessor {
private long totalFileCount = 0;
private long processedFileCount = 0;
public void processFiles(File[] dirs) throws Exception {
for (File file : dirs) {
processFile(file);
}
} public void processFile(File file) throws Exception {
if (file.isFile()) {
if (isFileAccepted(file)) {
handleFile(file);
}
} else {
File[] files = file.listFiles();
for (File fileInDir : files) {
processFile(fileInDir);
}
}
} protected boolean isFileAccepted(File file) throws Exception {
return true;
} protected void handleFile(File file)
{
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while((line=br.readLine())!=null)
{
readLine(file,line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
protected abstract void readLine(File file,String line); public long getTotalFileCount() {
return totalFileCount;
} public long getProcessedFileCount() {
return processedFileCount;
}
}
package cn.jerryhouse.util.dup_files;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.UUID; public abstract class LineUpdateProcessor extends FileProcessor {
private long totalFileCount = 0;
private long processedFileCount = 0;
private String NEW_LINE = System.getProperty("line.separator");
public void processFiles(File[] dirs) throws Exception {
for (File file : dirs) {
processFile(file);
}
} public void processFile(File file) throws Exception {
if (file.isFile()) {
if (isFileAccepted(file)) {
handleFile(file);
}
} else {
File[] files = file.listFiles();
for (File fileInDir : files) {
processFile(fileInDir);
}
}
} protected boolean isFileAccepted(File file) throws Exception {
return true;
} protected void handleFile(File file)
{
try {
BufferedReader br = new BufferedReader(new FileReader(file));
File tmpFile = new File(tmpFilePath(file));
BufferedWriter bw = new BufferedWriter(new FileWriter(tmpFile));
String line;
while((line=br.readLine())!=null)
{
String updatedLine = updateLine(file,line);
bw.write(updatedLine+NEW_LINE);
}
br.close();
bw.close();
file.delete();
tmpFile.renameTo(file);
} catch (Exception e) {
e.printStackTrace();
}
} private String tmpFilePath(File file)
{
String dir = file.getParent();
String filePath = dir+""+getUniqFileName();
return filePath;
} private String getUniqFileName()
{
return UUID.randomUUID().toString();
}
protected abstract String updateLine(File file,String line); public long getTotalFileCount() {
return totalFileCount;
} public long getProcessedFileCount() {
return processedFileCount;
}
}

简单測试代码:

package cn.jerryhouse.util.dup_files.test;

import java.io.File;

import org.junit.Test;

import cn.jerryhouse.util.dup_files.ClassDupFinder;
import cn.jerryhouse.util.dup_files.FileDupFinder;
import cn.jerryhouse.util.dup_files.JarFileDupFinder; public class DupTest { @Test
public void testJarFiles() {
try {
File[] files = new File[1];
files[0] = new File("E:\\workspace\\yinxing");
JarFileDupFinder dupFinder = new JarFileDupFinder();
dupFinder.processFiles(files);
dupFinder.analyseResult();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testFileDup() {
try {
File[] files = new File[1];
files[0] = new File("E:\\workspace\\yinxing");
FileDupFinder classDupFinder = new FileDupFinder();
classDupFinder.processFiles(files);
classDupFinder.analyseResult();
} catch (Exception e) {
e.printStackTrace();
}
} @Test
public void testClassDup() {
try {
File[] files = new File[1];
files[0] = new File("E:\\workspace\\yinxing");
ClassDupFinder classDupFinder = new ClassDupFinder();
classDupFinder.processFiles(files);
classDupFinder.analyseResult();
} catch (Exception e) {
e.printStackTrace();
}
} }

注:依赖jar包asm.jar。



java查找反复类/jar包/普通文件的更多相关文章

  1. java查找重复类/jar包/普通文件

    开发web应用时,有时更新了类却没有生效,其实是因为jboss/tomcat中其他发布包下有同名类(包括全路径都相同). 于是萌发了做个程序来检查指定目录是否存在重复类(通过asm从类文件中取类的全路 ...

  2. Java实现动态修改Jar包内文件内容

    import java.io.*; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; ...

  3. Java如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  4. Jar中的Java程序如何读取Jar包中的资源文件

    Jar中的Java程序如何读取Jar包中的资源文件 比如项目的组织结构如下(以idea中的项目为例): |-ProjectName |-.idea/  //这个目录是idea中项目的属性文件夹 |-s ...

  5. java中最常用jar包的用途说明

    java中最常用jar包的用途说明,适合初学者 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实 ...

  6. Java中常见的jar包及其主要用途

    jar包        用途 axis.jar     SOAP引擎包 commons-discovery-0.2.jar     用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周 ...

  7. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  8. 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案

    JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 本文为转载,原文地址为:https://www.cnblogs.com/adversary/p/103 ...

  9. Java Service Wrapper将jar包安装成Windows服务

    刚接触java,第一次使用Java开发windows服务,也是刚不久看了SSM框架 简直也是一头雾水,不过只要用心理解,其实很简单,下面有详细的步骤,包学包会 在windows上运行jar包,需要在工 ...

随机推荐

  1. 中介模式和学习日记Effective C++

    中介模式(Mediator):利用中介对象来封装一组对象交互.中保使对象并不需要显式地相互引用,使得松耦合,的交互. (1).中介者模式非常easy在系统中应用,也非常easy在系统中误用.当系统出现 ...

  2. Android:创建耐磨应用 - 定义自己的布局

    创建自己的自定义布局(Creating Custom Layouts) 本文介绍如何创建自己的自定义通知和使用可穿戴UI库来创建自己的自定义布局同时你还需要知道耐磨设计标准(Wear Design P ...

  3. DataNode连接错误Retrying connect to server

      在Hadoop分布式模式部署完毕后,通过start-dfs.sh启动NameNode.DataNode.SecondaryNameNode,在master节点通过jps命令查看,看到NameNod ...

  4. REST|RESTful初步认识

    工作中要用到jersey来实现restful风格的webservice.对于webservice另一定的认知(能够觉得是一种服务,远程调用的组件),可是对于restful笔者根本就木有了解过,rest ...

  5. 《R实战》读书笔记三

    第二章  创建数据集 本章概要 1探索R数据结构 2使用数据编辑器 3数据导入 4数据集标注 本章所介绍内容概括例如以下. 两个方面的内容. 方面一:R数据结构 方面二:进入数据或者导入数据到数据结构 ...

  6. 有效的XML: DTD(文档类型定义)介绍(转)

    文档类型定义和命名空间 有效(Valid)的XML文档: 首先,XML文档是个格式正规的(Well-formed)XML文档:(见格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节). ...

  7. java中的执行顺序

    静态,非静态,构造,先父再子另外,静态块与静态变量的顺序取决于代码中的顺序 Comparable接口应用

  8. Lenovo E46A-Win 7_无线灯亮但无法启动(耽误3天以上您信吗.....)问题: wlan autoconfig 依赖服务或组无法启动

    Lenovo E46A-Win 7_无线灯亮但无法启动(耽误3天以上您信吗.....)问题: wlan autoconfig 依赖服务或组无法启动 提示: windows7 无线连接服务wlan au ...

  9. 承诺c指针 (1)指针是地址

    (1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = & ...

  10. H264 编解码器架构简单

    看完后H264/AVC 编解码器演示,头脑是刚刚离开以下三个: 1.H264并且不明白如何指定的编解码器来实现,仅定义了一个编码视频位流的语法.和比特流进行解码,这与MPEG 类似. 2.H264而一 ...