1、首先使用JarAnalyzer 开源工具rundotsummary.bat 命令对目标目录下的jar包分析生成hehe.grph文件
http://www.kirkk.com/main/zip/JarAnalyzer-1.2.zip
如使用hadoop1.1.2中wordcount的例子
digraph G { commons_beanutils_1_7_0 -> commons_collections_3_2_1; commons_beanutils_1_7_0 -> commons_logging_1_1_1; commons_configuration_1_6 -> commons_lang_2_4; commons_configuration_1_6 -> commons_logging_1_1_1; commons_configuration_1_6 -> commons_beanutils_1_7_0; commons_configuration_1_6 -> commons_collections_3_2_1; commons_configuration_1_6 -> commons_digester_1_8; commons_configuration_1_6 -> commons_codec_1_4; commons_digester_1_8 -> commons_beanutils_1_7_0; commons_digester_1_8 -> commons_logging_1_1_1; commons_httpclient_3_0_1 -> commons_logging_1_1_1; commons_httpclient_3_0_1 -> commons_codec_1_4; commons_logging_1_1_1 -> log4j_1_2_15; hadoop_core_1_1_2 -> jackson_core_asl_1_8_8; hadoop_core_1_1_2 -> commons_logging_1_1_1; hadoop_core_1_1_2 -> commons_io_2_1; hadoop_core_1_1_2 -> commons_net_3_1; hadoop_core_1_1_2 -> jetty_util_6_1_26; hadoop_core_1_1_2 -> jetty_6_1_26; hadoop_core_1_1_2 -> commons_daemon_1_0_1; hadoop_core_1_1_2 -> jasper_runtime_5_5_12; hadoop_core_1_1_2 -> commons_cli_1_2; hadoop_core_1_1_2 -> commons_codec_1_4; hadoop_core_1_1_2 -> log4j_1_2_15; hadoop_core_1_1_2 -> jackson_mapper_asl_1_8_8; hadoop_core_1_1_2 -> commons_httpclient_3_0_1; hadoop_core_1_1_2 -> commons_lang_2_4; hadoop_core_1_1_2 -> commons_configuration_1_6; hadoop_core_1_1_2 -> commons_math_2_1; hadoop_core_1_1_2 -> slf4j_api_1_4_3; jackson_mapper_asl_1_8_8 -> jackson_core_asl_1_8_8; jasper_runtime_5_5_12 -> commons_logging_1_1_1; jasper_runtime_5_5_12 -> commons_el_1_0; jetty_6_1_26 -> jetty_util_6_1_26; jetty_util_6_1_26 -> slf4j_api_1_4_3; slf4j_api_1_4_3 -> slf4j_log4j12_1_4_3; slf4j_log4j12_1_4_3 -> slf4j_api_1_4_3; slf4j_log4j12_1_4_3 -> log4j_1_2_15; }
import java.io.BufferedReader; import java.io.FileReader; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; //基于JarAnalyzer生成的grph文件分析 public class GetMinJar { private static HashMap<String, LinkedHashSet<String>> lines=new HashMap<>(); public static void main(String[] args) { try { //FileInputStream fileInputStream=new FileInputStream("hehe.grph"); String line=""; String rootData="hadoop_core_1_1_2"; String grphPath="hehe.grph"; if(args.length>1) { rootData=args[0]; grphPath=args[1]; } if(args.length!=2) { System.out.println("useage:java -jar GetMinJar hadoop_core_1_1_2 hehe.grph "); } FileReader fileReader=new FileReader(grphPath); BufferedReader bufferedReader=new BufferedReader(fileReader); while((line=bufferedReader.readLine())!=null) { String[] datas=line.split("->|;"); if(datas.length>1) { String key=datas[0].trim(); LinkedHashSet<String> val=lines.get(key); if(val!=null) { val.add(datas[1].trim()); }else{ LinkedHashSet<String> set=new LinkedHashSet<String>(); set.add(datas[1].trim()); lines.put(datas[0].trim(),set); } } } bufferedReader.close(); fileReader.close(); LinkedHashMap<String, String> results=new LinkedHashMap<>(); hehe(rootData,results); System.out.println(rootData.replaceAll("_", "-")+".jar 依赖于"+results.size()+"个jar包==========="); for(Map.Entry<String, String> entry:results.entrySet() ) { String key=entry.getKey(); key=key.replaceAll("_", "-"); //String value=entry.getValue(); System.out.println(key+".jar"); } } catch (Exception e) { e.printStackTrace(); } } private static void hehe(String data,LinkedHashMap<String, String> results) { LinkedHashSet<String> val=lines.get(data); if(val!=null) { for (String string : val) { results.put(string,""); //检测是否递归死循环 LinkedHashSet<String> tmp=lines.get(string); if(tmp!=null) { if(tmp.contains(data)) { continue; } } hehe(string,results); } } } }
得出的只是静态依赖的最小jar包,动态加载的要程序运行之后才知道。用来去除无用的jar包,自己要小心的测试。
hadoop1.1.2的wordcount例子最小依赖Jar包为:
commons-beanutils-1.7.0.jar commons-cli-1.2.jar commons-codec-1.4.jar commons-collections-3.2.1.jar commons-configuration-1.6.jar commons-daemon-1.0.1.jar commons-digester-1.8.jar commons-el-1.0.jar commons-httpclient-3.0.1.jar commons-io-2.1.jar commons-lang-2.4.jar commons-logging-1.1.1.jar commons-math-2.1.jar commons-net-3.1.jar hadoop-core-1.1.2.jar jackson-core-asl-1.8.8.jar jackson-mapper-asl-1.8.8.jar jasper-runtime-5.5.12.jar jetty-6.1.26.jar jetty-util-6.1.26.jar log4j-1.2.15.jar slf4j-api-1.4.3.jar slf4j-log4j12-1.4.3.jar