Java打包工具jar包详解

 更新时间:2021年10月25日 14:12:43   作者:指尖上的代码go  
这篇文章主要介绍了Java打包工具jar包详解,在本例中我们引入一个叫jaxen.jar的库,并将所有以”org.jaxen”开头的类重命名以”org.example.jaxen”开头,具体实例代码跟随小编一起看看吧

Java打包工具是Java开发工具中比较常用的一种,代码重新打包工具jarjar可以帮助你将其它用到的java库打包并嵌入到你自己的项目jar包中。这样做的原因有:

当你发布项目的时候,把用到的库打包进现有项目jar包,可以让发布的这个jar包不比依赖于其它项目的jar包;

当你所用到的java库升级了以后,它所新发布的jar包可能和你现存的项目不匹配,为了保持项目的代码稳定性,你可以把编写代码时所用到的依赖jar包,全部打包进现在的项目jar包,以避免出现这个问题。

jarjar可以通过Ant任务的方式使用,也可以单独地在命令行下使用。打包代码时,如果你要重命名某些依赖包的名字的时候,jarjar会调用字节码转换(通过ASM)来更新代码,并自动做好其他工作。

以Ant任务的形式使用jar

我们现存的Ant任务里可以用jar任务来打包代码,比如:

<target name="jar" depends="compile">
    <jar jarfile="dist/example.jar">
        <fileset dir="build/main"/>
    </jar>
</target>

为了使用jarjar工具,我们创建一个叫jarjar的任务,由于JarJarTask是Ant标准任务Jar的子类,所以如果你不需要使用jarjar的特有功能的话,完全可以像这样调用jarjar工具:

就像标准的”jar”任务一样,可以通过”zipfileset”元素来包含其它jar包。但是仅仅包含其它jar包并不能让你远离“jar包陷阱”,因为你所依赖的jar包中的类名还是没有改变,仍然有可能和其它版本的jar包里的类名相同,产生冲突。

为了重命名类名,JarJarTask引入了一个新元素”rule”。”rule”包含了”pattern”属性,你可以通过这个属性,使用通配符来选择哪些类需要重命名,通过”result”属性可以设置如何给选中的类重命名。

在本例中我们希望引入一个叫jaxen.jar的库。并将所有以”org.jaxen”开头的类重命名以”org.example.jaxen”开头:

<target name="jar" depends="compile">
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"
        classpath="lib/jarjar.jar"/>
    <jarjar jarfile="dist/example.jar">
        <fileset dir="build/main"/>
        <zipfileset src="lib/jaxen.jar"/>
        <rule pattern="org.jaxen.**" result="org.example.@1"/>
    </jarjar>
</target>

通配符**表示匹配循环所有的子包,如果你只希望匹配一个子包的话,可以使用*。

@1表示第一个**所匹配到的内容,一次类推,@2表示从左到右第二个所匹配到的*或**。@0是特殊的标志,它代表整个匹配到的类的全名。

命令行下单独使用jar

java -jar jarjar.jar [help]

打印帮助信息。

java -jar jarjar.jar strings

打印类路径classpath下的字符串信息,如果类中有debug信息的话,会打印出所在行的行号。

比如java -jar jarjar.jar strings servlet-api.jar会打印:

...
javax.servlet.http.HttpServletRequest
"BASIC"
"FORM"
"CLIENT_CERT"
"DIGEST"
javax.servlet.http.HttpUtils
"javax.servlet.http.LocalStrings"
88: "javax.servlet.http.LocalStrings"
339: "://"
341: "http"
341: "https"
145: "&amp;"
238: "err.io.short_read"
254: "8859_1"
...

java -jar jarjar.jar find []

打印出类路径下java类对类路径下类的依赖,如果省略了,那么用代替。只能取class或者jar,前者代表打印各个类之间的依赖情况,后者会打印包对包之间的依赖。

java -jar jarjar.jar process

将按照文件所指定的方法转换到里,中原有的类将被删除。

文件的写法下面将会提到。

类路径Classpath的格式

类路径classpath是用逗号或分号(具体是那种分隔符依赖操作系统)隔开的一组目录,jar包或者zip包。详细说明请看classpath的java doc。也可以使用通配符的方式来书写classpath:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6268383。

Rules规则文件格式

Rules规则文件是实际上一种文本文件,每一行代表一条规则Rule,行首和行末的空格会被忽略掉,有三种不同样式的Rule写法:

rule <pattern> <result>
zap <pattern>
keep <pattern>

第一个是用来设置jar如何重命名类文件的。所有类,只要它引用到了需要改变名字的类,其相关内容就会被自动同步改变,保证不会出现引用错误。如果一个类匹配了不同的rule,只有第一个匹配的rule会生效。 和的设定同上面讲过的Ant中一样。

zap规则中 所匹配的类将会不加入生成的新jar包。

到此这篇关于Java打包工具jar包详解的文章就介绍到这了,更多相关Java打包工具jar包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中FactoryBean的高级用法实战教程

    Spring中FactoryBean的高级用法实战教程

    FactoryBean是Spring框架的高级特性,允许自定义对象的创建过程,适用于复杂初始化逻辑,本文给大家介绍Spring中FactoryBean的高级用法实战,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Java中高效的判断数组中某个元素是否存在详解

    Java中高效的判断数组中某个元素是否存在详解

    相信大家在操作Java的时候,经常会要检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow中也是一个非常热门的问题。本文将分析几种常见用法及其时间成本,有需要的朋友们可以参考借鉴。
    2016-11-11
  • 详解idea打包jar的多种方式

    详解idea打包jar的多种方式

    本篇文章总结出用IDEA打包jar包的多种方式。项目打包Jar包可以参考如下形式:用IDEA自带的打包形式;用Maven插件maven-shade-plugin打包;用Maven插件maven-assembly-plugin打包。下面跟着小编一起来看下吧
    2017-01-01
  • spring 重复注解和aop拦截的实现示例

    spring 重复注解和aop拦截的实现示例

    本文主要介绍了spring 重复注解和aop拦截的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java实现批量导出导入数据及附件文件zip包

    Java实现批量导出导入数据及附件文件zip包

    这篇文章主要为大家详细介绍了Java实现批量导出导入数据及附件文件zip包的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一
    2022-09-09
  • 详解JavaSE中抽象类与接口的定义及使用

    详解JavaSE中抽象类与接口的定义及使用

    这篇文章主要为大家详细介绍了JavaSe的抽象类和接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-07-07
  • 解决DataInputStream read不等于-1,socket文件传输只能传输一个文件无法传输多个问题

    解决DataInputStream read不等于-1,socket文件传输只能传输一个文件无法传输多个问题

    这篇文章主要介绍了解决DataInputStream read不等于-1,socket文件传输只能传输一个文件无法传输多个问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • activiti获取流程图实例

    activiti获取流程图实例

    这篇文章主要介绍了activiti获取流程图的方法,需要的朋友可以参考下
    2014-08-08
  • 如何使用Mockito调用静态方法和void方法

    如何使用Mockito调用静态方法和void方法

    这篇文章主要介绍了如何使用Mockito调用静态方法和void方法的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java将RTF转换为PDF格式的实现

    Java将RTF转换为PDF格式的实现

    本文主要介绍了Java将RTF转换为PDF格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论