本文主要说明怎么将自己的工具工程打成一个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文件有什么用呢?