解决jar引用冲突问题
2013-11-21 15:01
429 查看
经常会用到导入很多jar的情况,很多时候会因为jar的冲突而调很久很久,。
网上有一个比较不错的类,可以解决这个问题,我贴出来大加可以研究一下:
package test;
import java.io.File;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class JarSearcherUtil {
private File[] jarFileArray;
HashMap<String, Object[]> hash = new HashMap<String, Object[]>();
private JarSearcherUtil() {
}
public JarSearcherUtil(File[] jarFileArray) {
this.jarFileArray = jarFileArray;
}
public void searchClassFileName() {
JarFile jarFile = null;
try {
for (int i = 0; i < jarFileArray.length; i++) {
try {
jarFile = new JarFile(jarFileArray[i]);
searchClassFileNameToMap(jarFile);
} catch (Exception e) {
e.printStackTrace();
} finally {
jarFile.close();
}
}
} catch (Exception ioe) {
ioe.printStackTrace();
}
}
private void searchClassFileNameToMap(JarFile jarFile) {
Enumeration<JarEntry> enumJar = jarFile.entries();
String matchFileName, tmpStr;
while (enumJar.hasMoreElements()) {
matchFileName = String.valueOf(enumJar.nextElement());
if (matchFileName.endsWith(".class")) {
tmpStr = matchFileName.replace('/', '.');
tmpStr = tmpStr.substring(0, tmpStr.length() - ".class".length());
Object[] obj = hash.get(tmpStr);
if (obj == null) {
ArrayList<String> lst = new ArrayList<String>();
lst.add(jarFile.getName());
hash.put(tmpStr, new Object[] { new Integer(1), lst });
} else {
ArrayList<String> lst = (ArrayList<String>) obj[1];
lst.add(jarFile.getName());
hash.put(tmpStr, new Object[] { new Integer((Integer) obj[0] + 1), lst });
}
}
}
}
public String getSearchResult() {
StringBuilder str = new StringBuilder();
Object[] key = (Object[]) hash.keySet().toArray();
for (int i = 0; i < key.length; i++) {
Object[] obj = hash.get(key[i].toString());
if ((Integer) obj[0] > 1) {
str.append(key[i].toString());
str.append("\r\n");
ArrayList<String> lst = (ArrayList<String>) obj[1];
for (Iterator iterator = lst.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
str.append(string);
str.append("\r\n");
}
str.append("--------------------------");
}
}
return str.toString();
}
public static void main(String[] args) {
File file=new File("D:\\libs\\");
File[] myjars = file.listFiles();
// for (File file2 : myjars) {
// System.out.println(file2.getName());
// }
JarSearcherUtil jsu = new JarSearcherUtil(myjars);
jsu.searchClassFileName();
String relt = jsu.getSearchResult();
System.out.println(relt);
}
}
但是,虽然后这种办法,可以解决一些jar冲突问题,但这个并不是一定的,最好使用maven来构建项目。,因为spring也再提倡大家使用maven来下载jar.这样依赖问题就可以解决了。
网上有一个比较不错的类,可以解决这个问题,我贴出来大加可以研究一下:
package test;
import java.io.File;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class JarSearcherUtil {
private File[] jarFileArray;
HashMap<String, Object[]> hash = new HashMap<String, Object[]>();
private JarSearcherUtil() {
}
public JarSearcherUtil(File[] jarFileArray) {
this.jarFileArray = jarFileArray;
}
public void searchClassFileName() {
JarFile jarFile = null;
try {
for (int i = 0; i < jarFileArray.length; i++) {
try {
jarFile = new JarFile(jarFileArray[i]);
searchClassFileNameToMap(jarFile);
} catch (Exception e) {
e.printStackTrace();
} finally {
jarFile.close();
}
}
} catch (Exception ioe) {
ioe.printStackTrace();
}
}
private void searchClassFileNameToMap(JarFile jarFile) {
Enumeration<JarEntry> enumJar = jarFile.entries();
String matchFileName, tmpStr;
while (enumJar.hasMoreElements()) {
matchFileName = String.valueOf(enumJar.nextElement());
if (matchFileName.endsWith(".class")) {
tmpStr = matchFileName.replace('/', '.');
tmpStr = tmpStr.substring(0, tmpStr.length() - ".class".length());
Object[] obj = hash.get(tmpStr);
if (obj == null) {
ArrayList<String> lst = new ArrayList<String>();
lst.add(jarFile.getName());
hash.put(tmpStr, new Object[] { new Integer(1), lst });
} else {
ArrayList<String> lst = (ArrayList<String>) obj[1];
lst.add(jarFile.getName());
hash.put(tmpStr, new Object[] { new Integer((Integer) obj[0] + 1), lst });
}
}
}
}
public String getSearchResult() {
StringBuilder str = new StringBuilder();
Object[] key = (Object[]) hash.keySet().toArray();
for (int i = 0; i < key.length; i++) {
Object[] obj = hash.get(key[i].toString());
if ((Integer) obj[0] > 1) {
str.append(key[i].toString());
str.append("\r\n");
ArrayList<String> lst = (ArrayList<String>) obj[1];
for (Iterator iterator = lst.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
str.append(string);
str.append("\r\n");
}
str.append("--------------------------");
}
}
return str.toString();
}
public static void main(String[] args) {
File file=new File("D:\\libs\\");
File[] myjars = file.listFiles();
// for (File file2 : myjars) {
// System.out.println(file2.getName());
// }
JarSearcherUtil jsu = new JarSearcherUtil(myjars);
jsu.searchClassFileName();
String relt = jsu.getSearchResult();
System.out.println(relt);
}
}
但是,虽然后这种办法,可以解决一些jar冲突问题,但这个并不是一定的,最好使用maven来构建项目。,因为spring也再提倡大家使用maven来下载jar.这样依赖问题就可以解决了。
相关文章推荐
- eclipse运行代码时——类路径引用的归档不存在"XXXXX.jar"问题解决
- ClassLoader解决jar包冲突问题
- 解决Spring4整合Hibernate5的jar冲突问题
- axis2和cxf冲突解决,主要是XmlSchema排除掉,以下是axis2引用的jar包
- Groovy引用Jar包冲突问题
- Eclipse插件开发中对于Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)(转)
- 怎么解决maven管理jar包冲突问题
- 在myEclipse中开发J2ME程序,引用外部jar文件的问题解决
- 解决android-support-v4.jar引用外部项目冲突问题
- 解决weblogic下jar包冲突的问题
- 【原】Maven解决jar冲突调试步骤:第三方组件引用不符合要求的javassit导致的相关异常
- 【问题处理】arcgis运行在android studio上jar包冲突解决
- 解决Android引用多个库的jni架构平台支持冲突的问题
- OC 静态库.a引用第三方框架冲突解决问题
- maven解决jar冲突问题
- JAVA war包部署到tomcat,jar包冲突问题的解决办法,以及原理剖析。
- Maven打包方式,以及jar包冲突问题的解决方法
- 正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
- 解决 java 中引用的jar包乱码问题
- 解决Weblogic与Hibernate的antlr-x.x.jar冲突引起的ClassNotFoundException: org.hibernate.hql.ast.HqlToken问题