Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发
目录:
1.eclipse创建Java项目(带jar包的)
2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的)
打jar包
1)class2json1.jar (把引入的json相关的jar包转换成class,还有自己的类)
2)class2json2.jar (引入的json相关的jar包保留在该jar包内,还有自己的类)
3)class2json3.jar (只有自己的类)
3. 用该jar包进行二次开发
命令行测试
Java变成测试jar包
1) 新建TestClass2Json1项目,测试第一个jar包
2) 还是在TestClass2Json1项目中,测试第二个jar包 (先把引入的jar包去掉)
3) 还是在TestClass2Json1项目中,测试第三个jar包(先把引入的jar包去掉)
1.eclipse创建Java项目(带jar包的)
eclipse,创建java Project项目后,右键项目new一个名为lib的file Folder,用来存放需要的额外jar包,本项目需要用到JSON,所以需要引入相关jar包。
我设计了三个类,分别是 PersonData.java、DataClass2Json.java以及 TestDataClass2Json.java,具体代码如下所示:
PersonData.java是个人员数据类,主要存储人员数据的。
package com.zc.dataclass.main; import java.io.Serializable; public class PersonData implements Serializable { private static final long serialVersionUID = 1L; private String xm; //姓名 private String xb; //性别 private String sr; //生日 public String getXm() { return xm; } public void setXm(String xm) { this.xm = xm; } public String getXb() { return xb; } public void setXb(String xb) { this.xb = xb; } public String getSr() { return sr; } public void setSr(String sr) { this.sr = sr; } }
DataClass2Json.java 主要是将数据类转换成JSON
package com.zc.class2json.trans.main; import java.util.List; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** * @author zhangchao * @date 2018-08-22 * 将数据类转换成Json格式数据 */ public class DataClass2Json { public JSONObject data2JsonObj(Object obj) { JSONObject jsonObj = JSONObject.fromObject(obj); return jsonObj; } public JSONArray data2JsonArr(Object obj) { JSONArray jsonArr = JSONArray.fromObject(obj); return jsonArr; } public JSONArray data2JsonArr(List<Object> list) { JSONArray jsonArr = JSONArray.fromObject(list); return jsonArr; } }
TestDataClass2Json.java 测试
package com.zc.class2json.trans.test; import java.util.ArrayList; import java.util.List; import com.zc.class2json.trans.main.DataClass2Json; import com.zc.dataclass.main.PersonData; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class TestDataClass2Json { public static void main(String[] args) { // TODO Auto-generated method stub List<PersonData> listPD = getPersonData(); DataClass2Json dcj = new DataClass2Json(); JSONArray jsonArr = dcj.data2JsonArr(listPD); System.out.println(jsonArr.toString()); //System.out.println(dcj.data2JsonObj(listPD).toString()); PersonData pd1 = new PersonData(); pd1.setXm("张三"); pd1.setXb("男"); pd1.setSr("1988-07-20"); JSONObject jsonObj = dcj.data2JsonObj(pd1); System.out.println(jsonObj.toString()); JSONArray jsonArr1 = dcj.data2JsonArr(pd1); System.out.println(jsonArr1.toString()); } /* * 获取类数据 */ public static List<PersonData> getPersonData() { PersonData pd1 = new PersonData(); pd1.setXm("李四"); pd1.setXb("男"); pd1.setSr("1991-01-12"); PersonData pd2 = new PersonData(); pd2.setXm("张楠"); pd2.setXb("女"); pd2.setSr("1995-05-10"); List<PersonData> pd = new ArrayList<PersonData>(); pd.add(pd1); pd.add(pd2); //System.out.println(""); return pd; } }
运行结果如下所示:
[{"sr":"1991-01-12","xb":"男","xm":"李四"},{"sr":"1995-05-10","xb":"女","xm":"张楠"}] {"sr":"1988-07-20","xb":"男","xm":"张三"} [{"sr":"1988-07-20","xb":"男","xm":"张三"}]
2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的)
右键该项目选择Export,弹出的对话框,选择Java中的Runnable JAR File
点击next
Launch configuration 选择jar包默认运行的主类(包含main方法),Export destination 选择jar包的存放位置以及名称。
之后是3种打Runnable JAR file方式的方式,我们每个都试了下,分别对应class2json1.jar、class2json2.jar以及 ( class2json3.jar 和 class2json3_lib)
library handling中,(自己这三种都试一下) 第一个为提取extract需要的依赖的库或jar合成到jar文件里; (把自己的项目class以及lib中jar包中的class,混合在一起); 其它项目中直接引用该jar包,不需要加入它所需的额外jar包,就可以执行我们的类(但可能和项目引入的额外jar包引起jar包冲突);命令行也可以直接运行 java -jar XXX.jar 第二个则仅仅打包依赖库到jar文件; (把依赖的外部jar包,引入我们jar文件中) 其它项目中直接引用该jar包,但需要加入它所需的额外jar包,才可以执行我们的类,造成jar包重复;命令行也可以直接运行 java -jar XXX.jar 第三个则把依赖库放到一个文件夹中。 (没有外部依赖的jar包,只有自己的类) 其它项目中直接引用该jar包,需要加入它所需的额外jar包,就可以执行我们的类;命令行也需要引入依赖jar包,才能运行 java -jar XXX.jar
由项目可知,运行我们的项目包括3部分:
1: 我们自己编写的java 2: java运行jdk中的jar包 3.:我们引入的额外的jar包
1)class2json1.jar (把引入的json相关的jar包转换成class,还有自己的类)
com:中都是我自己写的类编译后的class文件 META-INF: net:引入的JSON相关jar包中的类,转化成class org:引入的JSON相关jar包中的类,转化成class
2)class2json2.jar (引入的json相关的jar包保留在该jar包内,还有自己的类)
com:中都是我自己写的类编译后的class文件 META-INF: org:是eclipse自动生成的jar包加载类 下面就是引入的相关jar包
3)class2json3.jar (只有自己的类)
com:中都是我自己写的类编译后的class文件
META-INF:
class2json3_lib
所以class2json3.jar 和class2json3_lib在一个文件下,命令行才可以执行,因为META-INF/MANIFEST.MF,即该jar包会关联class2json3_lib中这些相关jia包
Manifest-Version: 1.0 Class-Path: . class2json3_lib/commons-beanutils-1.8.0.jar class2json3_ lib/commons-collections-3.2.1.jar class2json3_lib/commons-lang-2.4.ja r class2json3_lib/commons-logging-1.1.3.jar class2json3_lib/ezmorph-1 .0.6.jar class2json3_lib/json-lib-2.3-jdk15.jar Main-Class: com.zc.class2json.trans.test.TestDataClass2Json
3. 用该jar包进行二次开发
命令行测试:
我们现在命令行测试一下:
java -jar class2json1.jar
java -jar class2json2.jar
java -jar class2json3.jar
结果:
其实:
class2json1.jar和class2json2.jar都可以单独运行;
而 class2json3.jar不能单独运行,必须和class2json3_lib放在一起。
Java变成测试jar包
1) 新建TestClass2Json1项目,测试第一个jar包
TestJar1.java 和最开始的项目的主类一样,只是类名不一样
import java.util.ArrayList; import java.util.List; import com.zc.class2json.trans.main.DataClass2Json; import com.zc.dataclass.main.PersonData; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class TestJar1 { public static void main(String[] args) { // TODO Auto-generated method stub List<PersonData> listPD = getPersonData(); DataClass2Json dcj = new DataClass2Json(); JSONArray jsonArr = dcj.data2JsonArr(listPD); System.out.println(jsonArr.toString()); //System.out.println(dcj.data2JsonObj(listPD).toString()); PersonData pd1 = new PersonData(); pd1.setXm("张三"); pd1.setXb("男"); pd1.setSr("1988-07-20"); JSONObject jsonObj = dcj.data2JsonObj(pd1); System.out.println(jsonObj.toString()); JSONArray jsonArr1 = dcj.data2JsonArr(pd1); System.out.println(jsonArr1.toString()); } /* * 获取类数据 */ public static List<PersonData> getPersonData() { PersonData pd1 = new PersonData(); pd1.setXm("李四"); pd1.setXb("男"); pd1.setSr("1991-01-12"); PersonData pd2 = new PersonData(); pd2.setXm("张楠"); pd2.setXb("女"); pd2.setSr("1995-05-10"); List<PersonData> pd = new ArrayList<PersonData>(); pd.add(pd1); pd.add(pd2); //System.out.println(""); return pd; } }
结果:
[{"sr":"1991-01-12","xb":"男","xm":"李四"},{"sr":"1995-05-10","xb":"女","xm":"张楠"}] {"sr":"1988-07-20","xb":"男","xm":"张三"} [{"sr":"1988-07-20","xb":"男","xm":"张三"}]
结论:
我们只是引入了class2json1.jar,就可以运行。
注意,不要再在项目里引入json相关jar包,会冲突
2) 还是在TestClass2Json1项目中,测试第二个jar包 (先把引入的jar包去掉)
因此,只引入class2json2.jar会报错,因为不识别头部的json包。原因是该jar包内部的json相关的jar包不能被外部的Java文件识别。
所以还要再引入json相关jar包,如下。因此这种方法不适合Java二次开发。
这时就没有报错,结果如下:
结果:
[{"sr":"1991-01-12","xb":"男","xm":"李四"},{"sr":"1995-05-10","xb":"女","xm":"张楠"}]
{"sr":"1988-07-20","xb":"男","xm":"张三"}
[{"sr":"1988-07-20","xb":"男","xm":"张三"}]
结论:
我们只是引入了class2json2.jar,不可以执行,因为该jar包内部的json相关的jar包不能被外部的Java文件识别。必须再引入json相关jar包,才可以运行。
3) 还是在TestClass2Json1项目中,测试第三个jar包(先把引入的jar包去掉)
因此,只引入class2json3.jar会报错,因为不识别头部的json包。原因是jar文件只有自己的class文件,没有json相关jar包的class。
所以还要再引入json相关jar包,如下。
这时就没有报错,结果如下:
结果:
[{"sr":"1991-01-12","xb":"男","xm":"李四"},{"sr":"1995-05-10","xb":"女","xm":"张楠"}] {"sr":"1988-07-20","xb":"男","xm":"张三"} [{"sr":"1988-07-20","xb":"男","xm":"张三"}]
结论:
我们只是引入了class2json3.jar,不可以执行,因为缺少json相关jar包。必须再引入json相关jar包,才可以运行。