- 浏览: 341620 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
javer:
xiaoxuan1130 写道 ...
解决 - java.lang.OutOfMemoryError: unable to create new native thread -
xiaoxuan1130:
解决 - java.lang.OutOfMemoryError: unable to create new native thread -
wtnbmy_aaaeau:
class Solution {public: int ...
leetcode : Best Time to Buy and Sell Stock -
williamxww:
mark
解决 - java.lang.OutOfMemoryError: unable to create new native thread -
zxjlwt:
学习了,非常好。http://surenpi.com
解决 - java.lang.OutOfMemoryError: unable to create new native thread
最近因为因为web容器升级,而容器自带了很多jar,发现和应用中的jar有冲突(相同的类,不同的版本),导致出现NoSuchMethon异常什么的。需求来了,需要比较两个目录下有那些相同的类。这个需求前人已经写烂了,可上网搜索一时找不到合适的,就再写了一遍,并作下记录,方便后来人和将来的自己再用。
不多说,上代码(一次性代码,1小时搞定,如有编程风格问题,敬请谅解):
package com.mikegu.tools.jardiff; import java.io.File; import java.io.IOException; /** * 启动入口类 * * @author haiquan.guhq */ public class JarDiffMain { /** * 输入要比较的两个目录,目录下包含jar,结果输出到控制台。 */ public static void main(String[] args) throws IOException { if (args.length != 2) { System.out.println("please input two compare dirs"); System.exit(1); } String firstInputPath = args[0]; String secondInputPath = args[1]; File file = new File(firstInputPath); File[] listFiles = file.listFiles(); for (File oneFile : listFiles) { if (oneFile.isFile() && oneFile.getAbsolutePath().endsWith(".jar")) { String jarName = oneFile.getName(); ZipDecompression.decompression(oneFile.getAbsolutePath(), firstInputPath + "/tmp/" + jarName); // 解压 ClassNameFinder.find(jarName, firstInputPath + "/tmp/" + jarName, 1); // 查找 } } file = new File(secondInputPath); listFiles = file.listFiles(); for (File oneFile : listFiles) { if (oneFile.isFile() && oneFile.getAbsolutePath().endsWith(".jar")) { String jarName = oneFile.getName(); ZipDecompression.decompression(oneFile.getAbsolutePath(), secondInputPath + "/tmp/" + jarName); ClassNameFinder.find(jarName, secondInputPath + "/tmp/" + jarName, 2); } } ClassNameFinder.compare(); } }
package com.mikegu.tools.jardiff; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; /** * 搜索和比较相同的类 */ public class ClassNameFinder { private static Map<String, List<ClassInfosDO>> firstMap = new HashMap<String, List<ClassInfosDO>>(); private static Map<String, List<ClassInfosDO>> secondMap = new HashMap<String, List<ClassInfosDO>>(); public static void find(String jarName, String path, int order) { List<String> allClassName = new ArrayList<String>(); //根据路径取得全类 getAllClassName(path, allClassName, path.length() + 1); if (allClassName != null) { for (String one : allClassName) { ClassInfosDO classInfosDO = new ClassInfosDO(one, jarName); List<ClassInfosDO> list = getOrderMap(order).get(one); if (list == null) { List<ClassInfosDO> arrayList = new ArrayList<ClassInfosDO>(); arrayList.add(classInfosDO); getOrderMap(order).put(one, arrayList); } else { list.add(classInfosDO); } } } } public static void compare() { Set<String> keySet = firstMap.keySet(); List<String> keyList = new ArrayList<String>(); keyList.addAll(keySet); Collections.sort(keyList); Map<String, List<String>> jarViewResult = new TreeMap<String, List<String>>(); List<String> classViewResult = new ArrayList<String>(); for (String fullClassName : keyList) { List<ClassInfosDO> list = secondMap.get(fullClassName); if (list != null) { //目录1 StringBuffer input1SB = new StringBuffer(); List<ClassInfosDO> value = firstMap.get(fullClassName); for (ClassInfosDO oneClassInfosDO : value) { input1SB.append(" " + oneClassInfosDO.getJarName() + ","); } //目录2 StringBuffer input2SB = new StringBuffer(); for (ClassInfosDO oneClassInfosDO : list) { input2SB.append(" " + oneClassInfosDO.getJarName() + ","); } classViewResult.add(fullClassName + "\tInput1: " + input1SB.toString() + "\t input2: " + input2SB.toString()); String jarKey = input1SB.toString() + " vs " + input2SB.toString(); if (jarViewResult.get(jarKey) != null) { jarViewResult.get(jarKey).add(fullClassName); } else { List<String> classes = new ArrayList<String>(); classes.add(fullClassName); jarViewResult.put(jarKey, classes); } } } writeResult(jarViewResult, classViewResult); } /** * 从jar的纬度和class的纬度分别输出结果 */ private static void writeResult(Map<String, List<String>> jarViewResult, List<String> classViewResult) { System.out.println("View From jar start....."); System.out.println("Total conflict jar num is " + jarViewResult.size()); Set<Entry<String, List<String>>> entrySet = jarViewResult.entrySet(); for (Entry<String, List<String>> one : entrySet) { String key = one.getKey(); System.out.println("conflict jar name is" + key); for (String oneClassName : one.getValue()) { System.out.println("\t\t" + oneClassName); } System.out.println(); } System.out.println("View From jar end!!!!"); System.out.println("View From class start....."); System.out.println("Total conflict class num is " + classViewResult.size()); for (String abc : classViewResult) { System.out.println(abc); } System.out.println("View From class end!!!!"); } public static Map<String, List<ClassInfosDO>> getOrderMap(int order) { if (order == 1) { return firstMap; } else { return secondMap; } } public static void getAllClassName(String dir, List<String> allClassName, int length) { File file = new File(dir); File[] listFiles = file.listFiles(); if (listFiles == null || listFiles.length == 0) { return; } for (File oneFile : listFiles) { String absolutePath = oneFile.getAbsolutePath(); if (oneFile.isDirectory()) { getAllClassName(absolutePath, allClassName, length); } else { if (absolutePath.endsWith(".class")) { allClassName.add(absolutePath.substring(length)); } } } } // public static void main(String[] args) { // List<String> allClassName = new ArrayList<String>(); // getAllClassName("/tmp/1", allClassName, "/tmp/1".length() + 1); // System.out.println(allClassName); // System.out.println(allClassName.size()); // // } }
package com.mikegu.tools.jardiff; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class ZipDecompression { // public static void main(String[] args) throws IOException { // String fileName = "toolkit.common.lang-1.0-sources.jar"; // decompression("C:/" + fileName, "C:/test"); // } public static void decompression(String zipFile, String destination) throws IOException { ZipFile zip; try { zip = new ZipFile(zipFile); } catch (IOException e) { System.out.println("error name " + zipFile); throw e; } Enumeration en = zip.entries(); ZipEntry entry = null; byte[] buffer = new byte[8192]; int length = -1; InputStream input = null; BufferedOutputStream bos = null; File file = null; while (en.hasMoreElements()) { entry = (ZipEntry) en.nextElement(); if (entry.isDirectory()) { continue; } input = zip.getInputStream(entry); file = new File(destination, entry.getName()); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } bos = new BufferedOutputStream(new FileOutputStream(file)); while (true) { length = input.read(buffer); if (length == -1) break; bos.write(buffer, 0, length); } bos.close(); input.close(); } zip.close(); } }
package com.mikegu.tools.jardiff; /** * 类信息DO */ public class ClassInfosDO { private String classFullName; private String jarName; /** * @param classFullName * @param jarName */ public ClassInfosDO(String classFullName, String jarName) { this.classFullName = classFullName; this.jarName = jarName; } /** * @return the classFullName */ public String getClassFullName() { return classFullName; } /** * @param classFullName the classFullName to set */ public void setClassFullName(String classFullName) { this.classFullName = classFullName; } /** * @return the jarName */ public String getJarName() { return jarName; } /** * @param jarName the jarName to set */ public void setJarName(String jarName) { this.jarName = jarName; } }
发表评论
-
论坛图片爬虫的一种实现
2011-05-14 17:35 31301背景 经常上贴图的论坛(Discuz!),每次打开 ... -
Visitor Design Pattern(访问者设计模式)
2011-02-10 21:44 2769Visitor Design Pattern(访问者设计模式 ... -
大对象导致JVM Crash (Jboss) 分析及解决 - JDK 已知bug
2010-11-01 19:32 9439最近在一个项目中,web 应用跑一段时间后, JBoss J ... -
一场内存异常的虚惊
2010-08-19 11:35 2234经过: 对一个应用作性能测试,发现内存曲线很恐怖,内存不 ... -
解决 - java.lang.OutOfMemoryError: unable to create new native thread
2010-03-23 23:11 165795工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有 ... -
Diagnosing Leaks in Native Code
2008-06-01 14:26 1739本文摘自sun.com网站分析Diagnosing ... -
java GC 内存变化浅析
2008-06-01 14:29 1604在指定jvm的运行参数-Xms1024m -Xmx102 ... -
windows linux jdk配置
2008-06-01 14:34 2113Windows 一个jdk的设置: CLASSPA ... -
JDK中LinkedBlockingQueue 内存泄漏问题
2008-06-01 14:38 11164昨天晚上跑的程序,今早来的时候发现抛了个Java Heap: ... -
Swing中 设置整个Application的字体
2008-06-01 15:05 1713一般通过UIManager去设置各个参数。 用这个类: ... -
Java Performance - When 4294967296 bytes of address space isn't enough
2008-06-01 15:33 1792the more memory you give to the ... -
如何分析Java虚拟机死锁
2008-06-01 15:38 8751英文资料: Thread Dump and Concur ... -
剖析JVM 内存系列------之JVM的内存机制介绍(理论篇)
2009-03-22 20:42 3503本文分为两个部分: 1,JVM specification ...
相关推荐
它的工作原理可能是通过遍历指定路径下的所有jar文件,然后对比每个jar中的类文件,找出具有相同全限定名(即包括包名和类名)但内容不同的类,从而确定冲突的存在。 `CallJars.exe` 可能是该工具的执行文件,它是...
当多个`jar`包引入到同一个项目中时,可能会出现`jar`包冲突问题。这种冲突通常发生在不同`jar`包包含相同类或方法但实现不同的版本时。这种情况可能导致运行时错误、功能缺失或者不可预知的行为。以下是一些关于...
在将一个已经在Tomcat上正常运行的应用迁移到WebLogic时,可能会遇到各种问题,其中最常见的是配置问题和JAR包冲突。 标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能...
在Java开发过程中,jar包冲突是一个常见的问题,尤其是在大型项目或者依赖复杂的系统中。jar包冲突指的是多个不同的jar包中包含相同类的情况,这可能导致运行时错误或不可预测的行为。"jar包冲突检测工具"正是为了...
OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许在单个JVM上运行多个版本的相同库或服务,从而解决了不同版本jar包冲突的问题。本示例通过一个名为“myself”的工程,展示了如何...
在Java开发过程中,"jar包冲突"是一个常见的问题,它主要出现在项目中引用了多个库,而这些库可能包含了相同类的不同版本。这种情况可能导致运行时错误或者程序行为不一致,因为JVM在加载类时可能会遇到混淆。"检测...
解决jar包冲突的工具类jarjar-1.4.rar,jar包冲突解决方法,解决jar与jar冲突,jar与aar冲突,不想删除任何一个包,只能修改其中一个jar包包名即可解决,解决方法详细请看这篇文章: ...
pom示例:项目中存在冲突再 exclusion 添加即可 <groupId>com.customize</groupId> <artifactId>easyexcel <version>2.2.6 <groupId>javax.servlet <artifactId>servlet-api 再引用com.customize poi...
5. **合理组织类加载器**:在应用服务器如Tomcat中,可以通过调整类加载策略,比如使用`WEB-INF/classes`优先加载,避免不同模块重复引入的jar包产生冲突。 6. **使用jar包管理工具**:例如,使用FatJar或者One-Jar...
在企业级应用开发与部署的过程中,经常会遇到各种技术挑战,其中之一就是在WebSphere Application Server (WAS) 上部署应用程序时遇到的JAR包冲突问题。这种冲突通常发生在不同组件或者库之间对相同JAR的不同版本有...
在大型 Java 软件开发中,jar 包冲突问题是一个常见的问题,系统开发人员经常会为解决类似的问题耗费大量的时间进行调试和测试。为了解决这个问题,本文将从 WebSphere 中类加载器入手,讨论几种解决 jar 包冲突问题...
在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件
标题中的“asm.jar包冲突”指的是在开发或运行Java应用程序时遇到的问题,ASM是一个Java字节码操控和分析框架,常用于动态代理、字节码增强等场景。当多个库或者项目引用了不同版本的asm.jar,就可能出现版本冲突,...
1. **排除冲突的类**:正如描述中所述,可以直接删除"commons-beanutils-1.7.0.jar"中的`org/apache/commons/collections`目录及其下的所有class文件。这样可以避免与JSONObject中的类发生冲突。但这样做可能会导致...
解决 jar 包冲突问题需要深入了解 WAS 中类加载器的工作机制,并根据实际情况选择合适的解决方法。 本文还详细介绍了 WAS 中类加载器的层次结构,包括 JVM Class loader、WebSphere Extensions Class loader、...
在Java开发过程中,我们经常会遇到一个头疼的问题:jar包冲突。这是因为不同的库或者框架可能会包含相同类的不同版本,导致运行时出现错误。为了解决这个问题,开发者们开发了一款名为"jarjar"的工具,其核心功能是...
本文将针对"关于Myeclipse使用mybatis出现Jar包冲突的解决办法"这一主题,详细解释如何解决这类问题。 首先,我们需要理解为什么会出现Jar包冲突。在MyEclipse中,可能由于内置的库或插件与我们手动引入的库之间...
这个jar文件通常包含在应用服务器(如Tomcat、Glassfish或JBoss)的类路径中,为开发者提供了一整套开发企业级应用的接口和类。然而,它并不直接包含JavaMail相关的API,这部分功能是由`mail.jar`提供的。 `mail....