一个项目使用多个第三方的库,这些库都是jar文件形式提供。在自己的项目产生jar的时候,如何去掉上述依赖库中不需要的内容?手工方式基本不可能,过于复杂,是否有自动工具?谢谢!

解决方案 »

  1.   

    file->export->Java->Jar file 自己选择要打包进jar文件的class
      

  2.   

    up---------------------------------------------------------------------------------------------
    腰缠70元到月入近10万
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=453IT工程师 毕业4年我年薪涨到30万 
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=51126岁青年坐拥千万域名资产 从小玩家变成CEO 
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=515程序员的酸甜苦辣:告别Coding 
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=341从月薪3500到700万(一)
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=170网络草根月赚3000的十种方法
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=517如果我是女的 我肯定不会嫁给做网站的
    http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=512
      

  3.   

    记得当初用 JBuilder 的时候,好像里面有个打包工具有类似的功能。现在用 Eclipse 了,虽说插件很多,但没仔细去研究,不知道有没有做这个的。楼主有兴趣可以去找找。不过,我认为,不做也罢。所谓“不需要的内容”,都清除掉也未必能省太多的尺寸。何况,Java class 之间的依赖关系满复杂的,有些通过反射的方式来加载,理论上没有绝对准确的方法来判定一个 class 是否被依赖。
      

  4.   

    JB能自己识别因此也带来弊端,比如只有Class.forName(...)用到的类需要手动打包
      

  5.   

    你先确实你要包里面的哪些CLASS文件,把它们解压出来,再打包成JAR文件不就可以了吗?
    又不是很复杂
    并且全部用JAR文件也可以啊,CLASS文件都是挺小一个的,整个包放进来也没什么很大的关系
      

  6.   

    先重述一下你的问题:
     
    你不知道那些类是被整个应用引用的?两种方法解决:
    1,静态的引用检查
       0.揭开你的JAR 文件到文件目录中。
       a,看一下JAVA的CLASS 文件的定义规范,每一个CLASS都定义了引用了那些类
         所以你可以得到一个CLASS它引用的所有的类。
       b,通过递归搜索可以得到引用的所有的类。
       c,去掉没有引用的类,打包
       优点:快捷
       缺点:把实际运行态没有引用的类加入进来了,有可能你一个类也去不掉
             可能把Class.forname()的类去掉了而不能正确运行2,动态探测
       a,作一个CLASSLOADER,替换掉系统的CLASSLOADER
       B,当加载一个类记录一下类被引用了
       c,运行所有的功能
       d,去掉记录清单中没有引用的类   优点:没有遗漏
       缺点:时间长
      

  7.   

    XiXiangHou(西乡侯) 的回答给了一些启示,但是很吃惊,居然没有现成的工具。主要我的程序要做成web start,让用户在web上点击一下就能开始工作,现在压缩以后的jar大概12M左右,如果能缩小体积则会很有帮助。如果哪位知道自动剥离不需要的class文件的方法,麻烦请指教告知,谢谢!
      

  8.   

    有的话,我也下一个。
    帮你DING!!!
      

  9.   

    用jbuilder打包试一下吧,肯定是可以的,不过效果不好,可能会缺这个类那个类,到时候你再把缺的类再打进去就可以了
    现在在eclispe一直用fatjar的插件,不知道有没有这个功能,去试一下吧
      

  10.   

    我知道jbuilder可以,不会缺类,但是你的里面不能使用反射机制
    Class.forName(XX),否则,需要把XX也打进包中。
      

  11.   

    to XiXiangHou(西乡侯):第一种方法:只能去掉一些在一个包里完全“隔离”并且没有被使用的一群类。事实上,既然在一个包里,很少会有完全隔离无依赖关系的两组类。所以,这种方法真的极有可能一个类都没去掉。而且,无法解决反射方式引用的类。第二种方法:系统稍微有点规模,遗漏将会是必然的。因为即使你有源代码做白盒测试,也难保证必定执行到了代码的每一个分支,更何况是“运行每项功能”这种黑盒测试方式。更况且,一个根本未被使用的private方法或者一个if(false){}代码段引用了一个庞大的包,那你的classloader还是会记录下来这个依赖,虽然实际上它是不必要的。
      

  12.   

    To :nasco(倪磊) 关于:
    主要我的程序要做成web start,让用户在web上点击一下就能开始工作,现在压缩以后的jar大概12M左右,如果能缩小体积则会很有帮助。如果哪位知道自动剥离不需要的class文件的方法,麻烦请指教告知,谢谢!
    可以采用的策略:
    1,分目录压缩,比如:一个包一个 jar 文件
    2,自己做客户端的CLASS LOADER ,
       当用到这个类时 下载这个jar 文件作解析它,自己加载相关的类。
       完成这个工作需要一些技和水平了。好处:不用去管哪些类被引用了
          客户端动态的发现需要的类然后下载。
          那么:你使用到了哪个模块就下载该模块需要的类。
          日常应用可以你只下载了 12M的 很小一部分 可能只有 2M。