番外:将自己的工具工程打成一个jar包

本文主要说明怎么将自己的工具工程打成一个jar包,供自己后续其他项目中使用。
我们使用两种方式来打jar包:eclispe和Java命令

我们先来设计几个简单的工具类;
1,一个字符串的工具类:可以完成字符串的判空,大小写转换,分割连接等;
2,一个时间类的工具类:时间类和字符串的转化,指定时间格式的转换;
3,一个数值型的工具类:判断数值是否有效,读取字符串类型的数子的数值;
4,一个对象类的工具类:获取对象的数值或者时间值或者字符串值或者浮点型值;

我们先设计字符串的工具类StringHelper:

package com.sai.util.pub;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

/**
 * 字符串工具类
 * @author sai
 * @version 1.0
 */
public class StringHelper {
	public static final String EMPTY = "";
	/**
	 * 判断字符串是否为空字符或者null
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str) {
		if (null == str || EMPTY.equals(str)) {
			return true;
		}
		return false;
	}
	
	/**
	 * 判断字符串是否不为空字符或者null
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String str) {
		return !isEmpty(str);
	}
	
	/**
	 * 判断字符串是不是null,空,空格串
	 * @param str 待检验字符串
	 * @return 
	 * 		true || false
	 */
	public static boolean isBlank(String str) {
		if (isEmpty(str)) {
			return true;
		}
		for (int i = 0; i<str.length(); i++) {
			if (Character.isWhitespace(str.charAt(i)) == false) {
				//isWhitespace(char ch) 判断指定字符是否为空格
				//如果有不是空格的字符存在,就表示不是空格串
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 判断字符串是不是不为null,空,空格串
	 * @param str 待检验字符串
	 * @return
	 */
	public static boolean isNotBlank(String str) {
	    return !isBlank(str);	
	}
	
	/**
	 * 使用分隔符将字符串分割成一个数组
	 * @param str 要分割的字符串
	 * @param sep 分隔符
	 * @return 一个数组对象或者null
	 */
	public static String[] split2ArrayBySep(String str, String sep) {
		if (isBlank(str)) {
			return null;
		}
		String[] strs = str.split(sep);
		return strs;
	}
	
	/**
	 * 使用分隔符将一个字符串分割成一个set集合
	 * @param str 要分割的字符串
	 * @param sep 分隔符
	 * @return 一个set对象或者null
	 */
	public static Set<String> split2SetBySep(String str, String sep) {
		String[] strs = split2ArrayBySep(str, sep);
		if (strs == null || strs.length <= 0) {
			return null;
		}
		Set<String> set = new HashSet<String>();
		for (String str2 : strs) {
			set.add(str2);
		}
		return set;
	}
	
	/**
	 * 使用分隔符将几何中的元素连接起来
	 * @param collection 集合
	 * @param sep 连接分隔符
	 * @return 一个字符串或者null
	 */
	public static String unionStrBySep(Collection<?> collection, String sep) {
		if (collection == null) {
			return null;
		}
		StringBuilder sb = new StringBuilder();
		for (Object obj : collection) {
			if (null == obj) {
				continue;
			}
			if (sb.length() > 0) {
				sb.append(sep);
			}
			sb.append(obj);
		}
		return sb.toString();
	}
	
	/**
	 * 判断两个字符串是否相等(大小写敏感)
	 * @param str1 要比较的字符串1
	 * @param str2 要比较的字符串2
	 * @return 字符串是否相等
	 */
	public static boolean equals(String str1, String str2) {
		return str1 == null ? str2 == null : str1.equals(str2);
	}
	
	/**
	 * 将字符串翻译为大写字符串
	 * @param str 要翻译的字符串
	 * @return 大写的字符串或者null
	 */
	public static String str2Upper(String str) {
		if (isBlank(str)) {
			return null;
		}
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < str.length(); i++) {
			sb.append(Character.toUpperCase(str.charAt(i)));
		}
		return sb.toString();
	}
	
	/**
	 * 将字符串翻译为小写字符串
	 * @param str 要翻译的字符串
	 * @return 小写的字符串或者null
	 */
	public static String str2Lower(String str) {
		if (isBlank(str)) {
			return null;
		}
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < str.length(); i++) {
			sb.append(Character.toLowerCase(str.charAt(i)));
		}
		return sb.toString();
	}
}


时间类的工具类DateUtils:

package com.sai.util.pub;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 时间工具类
 * @author sai
 * @version 1.0.0
 */
public class DateUtils {
	private final static String YYYYMMDD         = "yyyyMMdd";
	private final static String YYYYMMDDHH24MISS = "yyyyMMddHHmmss";
	
	/**
	 * 
	 * @param date
	 * @return
	 */
	public static boolean isNull(Date date) {
		return null == date;
	}
	
	/**
	 * 获取当前时间,默认时间格式是"20110101"
	 * @return
	 */
	public static String getCurrentDate() {
		return date2Str(new Date(), YYYYMMDD);
	}
	
	/**
	 * 获取指定格式的当前时间
	 * @param form 时间格式
	 * @return
	 */
	public static String getCurrentDate(String form) {
		if (null == form || "".equals(form)) {
			form = YYYYMMDD;
		}
		return date2Str(new Date(), form);
	}
	
	/**
	 * 时间字符串转换为Date类型的时间
	 * @param dateStr
	 * @return
	 */
	public static Date str2Date(String dateStr) {
		if (dateStr == null || "".equals(dateStr)) {
			return null;
		}
		return str2Date(dateStr, YYYYMMDDHH24MISS);
	}
	
	/**
	 * 时间字符串转换为Date类型的时间
	 * @param dateStr
	 * @param formatPattern
	 * @return
	 */
	public static Date str2Date(String dateStr, String formatPattern) {
		if (dateStr == null || "".equals(dateStr)) {
			return null;
		}
		SimpleDateFormat format = new SimpleDateFormat(formatPattern);
		try {
			return format.parse(dateStr);
		} catch (Exception e) {
			//
		}
		return null;
	}
	
	/**
	 * Date类型时间转换为时间字符串,默认格式是"20110101"
	 * @param date
	 * @return
	 */
	public static String date2Str(Date date) {
		if (null == date) {
			return null;
		}
		return date2Str(date, YYYYMMDD);
	}
	
	/**
	 * Date类型时间转换为指定格式的时间字符串
	 * @param date
	 * @param form
	 * @return
	 */
	public static String date2Str(Date date, String form) {
		if (null == date) {
			return null;
		}
		SimpleDateFormat sf = new SimpleDateFormat(form);
		return sf.format(date);
	}
}


数值型的工具类NumberHelper:

package com.sai.util.pub;

/**
 * 数值工具类
 * @author sai
 * @version 1.0
 */
public class NumberHelper {
	/**
	 * 判断数值是否有效
	 * @param number
	 * @return true || false
	 */
	public static boolean isValideLong(Long number) {
		return null != number && number > 0;
	}
	
	/**
	 * 判断数值是否无效
	 * @param number
	 * @return true || false
	 */
	public static boolean isInValideLong(Long number) {
		return null == number || number < 0;
	}
	
	/**
	 * 获取Long数值
	 * @param str "数值"
	 * @param defaultValue 默认值,如果转换异常返回默认值
	 * @return Long
	 */
	public static Long str2Num(String str, Long defaultValue) {
		try {
			return Long.valueOf(str);
		} catch (Exception e) {
			return defaultValue;
		}
	}
}


对象类的工具类ObjectUtils:

记得导入common包:

package com.sai.util.pub;

import java.util.Date;

import org.apache.commons.lang.math.NumberUtils;

public class ObjectUtils {
	
	/**
	 * 将对象转换为时间类的对象
	 * @param obj 要转换的对象
	 * @return 一个时间类对象或者null
	 */
	public static Date toDate(Object obj){
		if (null == obj) {
			return null;
		}
		if (obj instanceof java.util.Date) {
			return (Date)obj;
		}
		if (obj instanceof java.sql.Date) {
			java.sql.Date sqlDate = (java.sql.Date)obj;
			return new Date(sqlDate.getTime());
		}
		if (obj instanceof java.lang.String) {
			return DateUtils.str2Date((String)obj);
		}
		return null;
	}
	
	/**
	 * 获取对象的int值
	 * @param obj
	 * @return int
	 */
	public static int toInt(Object obj) {
		return toInt(obj, 0);
	}
	
	/**
	 * 获取对象的int值
	 * @param obj
	 * @param defaultValue 默认值
	 * @return int值
	 */
	public static int toInt(Object obj, int defaultValue) {
		if (null == obj) {
			return defaultValue;
		}
		if (obj instanceof Number) {
			return ((Number)obj).intValue();
		}
		
		return NumberUtils.toInt(obj.toString(), defaultValue);
	}
	
	/**
	 * 获取long值
	 * @param obj
	 * @return
	 */
	public static long toLong (Object obj) {
		return toLong(obj, 0);
	}
	
	/**
	 * 获取long值
	 * @param obj
	 * @param defaultValue 默认值
	 * @return
	 */
	public static long toLong(Object obj, long defaultValue) {
		if (null == obj) {
			return defaultValue;
		}
		if (obj instanceof Number) {
			return ((Number)obj).longValue();
		}
		return NumberUtils.toLong(obj.toString(), defaultValue);
	}
	
	/**
	 * 获取浮点值
	 * @param obj
	 * @return
	 */
	public static float toFloat(Object obj) {
		return toFloat(obj, 0);
	}
	
	/**
	 * 获取浮点值
	 * @param obj
	 * @param defaultValue 默认值
	 * @return
	 */
	public static float toFloat(Object obj, float defaultValue) {
		if (null == obj) {
			return defaultValue;
		}
		if (obj instanceof Number) {
			return ((Number)obj).floatValue();
		}
		return NumberUtils.toFloat(obj.toString(), defaultValue);
	}
	
	/**
	 * 获取双精度值
	 * @param obj
	 * @return
	 */
	public static double toDouble(Object obj) {
		return toDouble(obj, 0);
	}
	
	/**
	 * 获取双精度值
	 * @param obj
	 * @param defaultValue 默认值
	 * @return
	 */
	public static double toDouble(Object obj, double defaultValue) {
		if (null == obj) {
			return defaultValue;
		}
		if (obj instanceof Number) {
			return ((Number)obj).doubleValue();
		}
		return NumberUtils.toDouble(obj.toString(), defaultValue);
	}
	
	/**
	 * 获取String值
	 * @param obj
	 * @return
	 */
	public static String toString(Object obj) {
		return toString(obj, StringHelper.EMPTY);
	}
	
	/**
	 * 获取字符串值
	 * @param obj
	 * @param defaultValue 默认值
	 * @return
	 */
	public static String toString(Object obj, String defaultValue) {
		if (null == obj) {
			return defaultValue;
		}
		
		String value = null;
		if (obj instanceof String) {
			return (String)obj;
		} else if (obj instanceof Date) {
			return DateUtils.date2Str((Date)obj);
		} else if (obj instanceof java.sql.Date) {
			Date date = toDate(obj);
			return DateUtils.date2Str(date);
		} else {
			value = obj.toString();
		}
		return value == null ? defaultValue : value;
	}
}

我们先使用eclipse来打一个jar包:
<1>右键工程,选择export导出;

<2>选择要导出的工程资源,然后填写jar名称;


<3>next,next,记得主类不要选,我们实在工程项目里面,不需要选择这个:

完成.
我们解压文件,进入包目录,我们发现里面的文件全部是.class文件,那么这些文件是我们打包时候生成的呢,还是说我们打包的本来就是class文件?

我们先引入刚刚生成的jar包做个测试看看。
新建一个简单的Java工程,引入jar包,并记得右键jar包——>build path——>add to build path.
我们点开外部资源库,打开刚才我们引入的工具资源:
我们发现引入的资源都是class文件,同时文件目录是包工程的显示:

我们写一个简单的输出——判断一个字符串是否为空:

说明引入的jar是正常使用的。
我们现在使用另外一种方式打包————jar命令。
进入cmd黑框框:
先输入jar看输出和示例:

我们进入到工作空间,将对应的工程打包,然后引入到测试工程中:

jar cvf my-tool2.jar my-jar

引入:


同样的我们打开外部资源库,和我们第一次生成的jar包比较发现,文件虽然都是class文件,但是一个是工程结构,一个是目录结构视图。
目录结构视图的包是不能正常使用的。
那么我们用java命令再次打包————这次我们打包工程下的bin文件,也就是class文件:



我们引入jar包,查看资源,是工程结构,并且可以正常使用。
那么我们可以得出结论,我们打包时候打包的其实就是class文件。
.java文件和.class文件我们经常见到,有什么区别呢?
.java文件我们能阅读,.class文件我们是看不懂的,当然机器是可以识别的。
.java文件是Java源文件,.class文件是Java编译后的文件,也就是javac命令后会生成class文件。
而程序运行时候,JVM运行的是Java文件还是class文件呢?
显然是class文件,如果如果不是class文件,那么Java提供javac命令生成class文件有什么用呢?

猜你喜欢

转载自blog.csdn.net/OASsai/article/details/82877681