注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Java >> 核心技术 >> 高级编程 >> Java正文

Java的“静态库链接”

文章来源:中国IT实验室收集整理 作者:佚名 更新时间:2008-6-28 20:32:21 【 】 【加入收藏

    Java的库组织方式就是“动态链接”的,从一个Java的jar包运行有可能要接一堆classpath就知道。和基于静态链接的C语言要实现动态链接要做额外的事情相似,Java要想实现类似C的静态链接也要做很多额外的事。

    用类似Fat Jar的方法,把所有的依赖库打包的最后的库中,其实不是静态链接——C的静态链接只把需要的代码复制过来,不是眉毛胡子一把抓。按说,以Java的思想,静态链接不是很必要,因此也就没有原生支持。但实践和理论毕竟差距很远,不是每个库都是标准库,假设你从别人的库中引用了几个类,为了支持你的程序,你必须提供别人的库(假设这个库并不流行)。再假设你自己写了一个库,以后再开发类似的程序就从库中派生,当然你不想把所有的代码都发行出去。这个问题在Netbeans上更为明显,Netbeans提供了一个swing框架,用起来当然很方便,但是当发行程序的时候你就会发现,Netbeans很负责任的把依赖库放到发行目录的lib下,居然有将近1M,(禁掉粗口),光写一个窗口就要1M!

    ProGuard不光是个混淆器,它也能解决静态链接的问题,用它自己的话说是 It detects and removes unused classes, fields, methods, and attributes.下面给出的是在Netbeans中用的Ant脚本,修改项目的build.xml,添加:

    <target name="-post-jar">
           <taskdef resource="proguard/ant/task.properties" classpath="${libs.proguard.classpath}" />
           <copyfile src="${dist.jar}" dest="${dist.dir}/pre.jar"/>
           <proguard warn="false" obfuscate="false">
               <libraryjar path="${java.home}/lib/rt.jar" />
               <injar path="${javac.classpath}" filter="!META-INF/MANIFEST.MF" />
               <injar path="${dist.dir}/pre.jar"/>
               <outjar path="${dist.jar}"/>
               <keep name="${main.class}">
                   <method name="main"/>
               </keep>
               <keep name="org.jdesktop.beansbinding.ext.BeanAdapterProvider"/>
               <keepclasseswithmembernames>
                   <method name="getServiceNames"/>
               </keepclasseswithmembernames>
               <keepclasseswithmembernames>
                   <method name="addPropertyChangeListener"/>
               </keepclasseswithmembernames>
           </proguard>
       </target>

     <target name="-post-jar">
            <taskdef resource="proguard/ant/task.properties" classpath="${libs.proguard.classpath}" />
            <copyfile src="${dist.jar}" dest="${dist.dir}/pre.jar"/>
            <proguard warn="false" obfuscate="false">
                <libraryjar path="${java.home}/lib/rt.jar" />
                <injar path="${javac.classpath}" filter="!META-INF/MANIFEST.MF" />
                <injar path="${dist.dir}/pre.jar"/>
                <outjar path="${dist.jar}"/>
                <keep name="${main.class}">
                    <method name="main"/>
                </keep>
                <keep name="org.jdesktop.beansbinding.ext.BeanAdapterProvider"/>
                <keepclasseswithmembernames>
                    <method name="getServiceNames"/>
                </keepclasseswithmembernames>
                <keepclasseswithmembernames>
                    <method name="addPropertyChangeListener"/>
                </keepclasseswithmembernames>
            </proguard>
        </target>Netbeans自带ProGuard混淆器,libs.proguard.classpath就是ProGuard的位置。关掉了警告,因为我的应用共享了J2ME的库。关掉了混淆,这样更能看出去掉了哪些类。后面的keep只要看着ProGuard的提示加就可以了——既然是一一对应的解决方案,为什么ProGuard不提供个自动选项,期望能早日加上。

 

  • 上一篇Java:

  • 下一篇Java:
  • 最 新 热 门
     手机开发平台指南、教程和资料介绍
     关于什么叫面向接口编程
     编写高级JavaScript应用代码
     不要验证,直接转化科学计数法
     Eclipse插件开发中实现刷新和重编译介绍
     Java开源技术:Eclipse的使用技巧详解
     配置eclipse 3.2 使用JDK1.5中文JavaAPI
     集成Windows本地应用到Eclipse RCP 程序中
     hibernate.cfg.xml配置文件的说明
     eclipse开发jface时,main.class解决方法
    最 新 推 荐
     JSP高访问量下的计数程序
     得到两个日期之间的间隔天数
     Java的“静态库链接”
     用Java的加密机制来保护你的数据
     使用Java Annotations来管理对象生命周期
     JAVA实现的AZDG加密-解密算法
     基于RSA模型转换框架的开发
     如何重构出DAO模式
     关于AOP的应用实例
     关于数字排列的一个程序
    相 关 文 章

    编写高级JavaScript应用代码
    Java开源技术:Eclipse的使用技巧详解
    配置eclipse 3.2 使用JDK1.5中文JavaAPI
    Java WebService 整理笔记
    深入探索 高效的Java异常处理框架
    怎样减小JAR文件大小
    妙用异步Servlet扩展AJAX应用程序
    java.servlet.Filter的应用
    Java多线程下载
    JAVAMAIL邮件服务器

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用