Java打包工具jar包详解

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包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在idea中将java项目中的单个类打包成jar包操作

    JAR文件的全称是Java Archive File,即Java档案文件.JAR文件是一种压缩文件,与常见的ZIP压缩文件兼容,被称为JAR包. JAR文件与zip文件的主要区别是在JAR文件中默认包含了一个名为META-INF/MANIFEST.MF的清单文件,这个清单文件是在生成JAR文件时系统自动创建的. 打包jar包 1.先创建一个要打包成jar包的类 2.File -> Project Structrue -> Artifacts -> + -> JAR -> fr

  • Java jar打包工具使用方法步骤解析

    java的jar是一个打包工具,用于将我们编译后的class文件打包起来,这里面主要是举一个例子用来说明这个工具的使用. 在C盘下的temp文件夹下面: 有一个com.pack.surfront的package 这个package下面有一些已经class文件如:Test1.class,Test2.class,Test3.class,其中Test1.class下有一个可执行文件. 我们打开cmd,然后cd temp到temp文件夹下面,因为com.pack.surfront是包路径,不需要再进去然

  • Java命令行下Jar包打包小结

    jar包打包实现 jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件.第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行.这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件

  • idea打包java程序(包含依赖的所有jar包)

    Intellij Idea打包Java项目 打开模块设置 如下图所示,选中需要打包的模块,右键点击,即会出现如下图所示的内容,点击Open Module Settings. 创建Artifacts 配置Jar包信息 注意配置输出路径 Output directory: 移动依赖Jar包到指定文件夹中并配置路径 如下图所示,将项目依赖的Mysql驱动包移动到library文件夹中.方法是只需要在上右键点击创建文件夹,然后将第三方的Jar包拖动进入此文件夹即可. 并且点击图中马赛克部分的那个Jar文

  • java打包成jar并执行jar包中指定的main方法

    java打包成jar jar -cvf [jar包的名字] [需要打包的文件] 执行jar包中的main方法 java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 main 方法,那么如何运行指定的 main 方法呢? 用下面的命令试试看: java -classpath ****.jar ****.****.className [args] "****.****"表示"包名": "className"表示&q

  • Java打包工具jar包详解

    Java打包工具是Java开发工具中比较常用的一种,代码重新打包工具jarjar可以帮助你将其它用到的java库打包并嵌入到你自己的项目jar包中.这样做的原因有: 当你发布项目的时候,把用到的库打包进现有项目jar包,可以让发布的这个jar包不比依赖于其它项目的jar包; 当你所用到的java库升级了以后,它所新发布的jar包可能和你现存的项目不匹配,为了保持项目的代码稳定性,你可以把编写代码时所用到的依赖jar包,全部打包进现在的项目jar包,以避免出现这个问题. jarjar可以通过Ant

  • Java实用工具之StringJoiner详解

    背景 在平时的业务开发中,我们可能会遇到字符串列表根据分隔符进行拼接的需求.比如: 输入: 数组:["a","b","c"]分隔符:"," 输出: "a,b,c" 处理 通常我们可以使用StringBuilder根据下标位置决定是否需要添加分隔符以达到目的,比如: public static void main(String[] args) { StringBuilder sb = new StringBu

  • 前端必会的轻量打包工具gulp使用详解

    目录 一. 安装Node和gulp 二.使用gulp压缩Js 2.1 方法 2.2 步骤 三. 压缩CSS文件 3.1 步骤 四. 压缩图片 五. 编译Less文件 六. 编译Sass文件 一. 安装Node和gulp gulp 是基于 node 实现 Web 前端自动化开发的工具,利用它能够极大的提高开发效率. 在 Web 前端开发工作中有很多“重复工作”,比如压缩CSS/JS文件.而这些工作都是有规律的.找到这些规律,并编写 gulp 配置代码,让 gulp 自动执行这些“重复工作”. 安装

  • java Arrays工具类实例详解

    Arrays工具类属于java中常用的工具类 public static void sort(int[] a) public static void sort(int[] a,int fromIndex, int toIndex) public static void sort(long[] a) public static void sort(long[] a,int fromIndex, int toIndex) public static void sort(short[] a) publ

  • Java手机号码工具类示例详解(判断运营商、获取归属地)

    所需引用Jar包 <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>geocoder</artifactId> <version>2.15</version> </dependency> <dependency> <groupId>com.googlecode.libphonenumber&

  • Java Arrays工具类用法详解

    本文实例讲述了Java Arrays工具类用法.分享给大家供大家参考,具体如下: Arrays类 功能描述 Arrays类是一个工具类,其中包含了数组操作的很多方法,比如搜索和排序: Arrays类中的方法均为static修饰的,可以直接通过Arrays.xxx(xxx)的形式调用方法. 几个重要方法   1.asList(T... a) 由给定的数组a,返回一个固定大小的List对象.在这里,着重解释一下前面这句话的深层含义,我们可以看Arrays类的源码,来帮助我们理解. 生成的List对象

  • Java数学工具类MathUtil详解

    本文实例为大家分享了Java数学工具类MathUtil的具体代码,供大家参考,具体内容如下 package cn.xbz.util.math; import java.math.BigDecimal; /** * @title 数学计算工具类 * @description 提供常用的数值加减乘除计算 , 及多个数值的求和 , 平均值 , 最大最小值计算 */ public class XMathUtil { /** 默认的除法精确度 */ private static final int DEF

  • java数学工具类Math详解(round方法)

    数学工具类Math,供大家参考,具体内容如下 1. 概述 java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. 2. 基本的方法 public static double abs(double num);获取绝对值.有多种重载,absolutely绝对地 public static double ceil(double num);向上取整,ceil是天花板的意思 public static double floor(double num);向下取

  • 新手快速上手webpack4打包工具的使用详解

    一直使用webpack,上次也分享过webpack配置es6~9的语法参考链接,但是对于一些小白童鞋来说,最基本的配置都不太知道,刚好利用春节休假期间对webpack4的知识点梳理一次.方便一些刚刚入行的人学习,也是对自己的一种总结与提高 一.几个盲点的解释 1.全局安装与局部安装 对于一般的新手都有一个疑惑我是全局安装还是本项目中安装(局部安装),个人建议,现在前端发展那么快,我们使用局部安装的方式更好(使用最新的技术栈). 我们知道javascript是弱语言,有局部变量和全局变量,其实全局

  • 如何将java或javaweb项目打包为jar包或war包

    目录 一.为什么打包 二.如何打包 1.打成jar包 1.1.使用jar手动打包 1. 2.使用IDEA进行打包 2.打成war包 一.为什么打包 关于此问题,网上众说纷纭.结合个人理解以及网上说法,打成jar包是为了方便别人使用. 如果是运行java程序,就不需要在寻找包含main方法的类去执行:如果是使用第三方jar包,直接在自己项目中导入jar包,而不是复制一堆类文件.打成war包是真实生产环境选择的web应用部署方式,网上说这样不会像直接复制文件夹那样可能造成文件丢失,而且服务器会对应用

随机推荐