Step1:在Eclipse的资源管理器中选中你要打包的项目,右键点击,选择“导出”项,弹出导出对话框,在下面的Java目录下选择“JAR 文件”项,下一步,在导出目标路径TextField框中输入你想保存的路径,单击“完成”。
Step2:进入Step1中保存jar文件的目录下,用压缩文件管理器打开jar文件,进入META-INF\目录下,打开MINIFEST.MF文件,对MINIFEST.MF文件进行编写,(这里大家要注意,是从打包好的文件中取找MINIFEST.MF,而不是自己在打包前新建这个文件)格式如下:
请在文本格式下编写,每个空处只有一个空格,文本不能多余两个空行.
Manifest-Version: 1.0 告诉我们使用的是1.0的manifest文件,第一行定义manifest的格式
Main-Class: 主程序入口类名(注意:如果主程序带包,main函数在com包下的test.java中,则写如:com.test)
Class-Path: 引用包路径,包之间空格隔开(lib是和test.jar同目录的一个子目录,test.jar要引用的some.jar包就在这里面。例如:Class-Path: lib/some.jar lib/some2.jar)
Created-By: 创建者信息
完整实例:
Manifest-Version: 1.0
Main-Class: com.main.MyCrawler
Class-Path: lib/mysql-connector-java-5.0.6-bin.jar
Created-By: ninja
实例目录为
D:\mycrawler
D:\mycrawler\lib
D:\mycrawler\mycrawler.jar
D:\mycrawler\lib\mysql-connector-java-5.0.6-bin.jar
编写完之后保存。
Step3 :建立批处理文件.bat或.cmd如下start.cmd: cmd中开启jar程序命令: java -jar App.jar
补充1:如果项目中有用到配置文件(数据库配置等),尽量不要把配置文件打入JAR包中,打入后,直接用命令运行报空指针,为了方便修改配置文件,尽量把配置文件放到JAR包外面,如,代码中用
File file = new File(System.getProperty("user.dir")+"/dbconfig.properties");properties.load(new FileInputStream(file));
加载配置,平常用的一般是properties.load(this.getClass().getClassLoader().getResourceAsStream("././dbconfig.properties"));但是这种在myeclipse下运行正常,打包后就不行
补充2:main方法在DOS命令下可以输入参数,参数必须和代码中对参数的处理对应
2.1:main方法调用代码:
private boolean initArgs(String[] args) { ArgParser argParser = new ArgParser(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); if (argParser.parseArgs(args) == 1) { log.error("parse args error."); return false; } start = argParser.getString("start"); log.info("从参数中获取到开始时间是:"+start); if (start != null) { try { startTime = dateFormat.parse(start); } catch (ParseException e) { log.error("", e); log.error("时间格式请采用yyyy-MM-dd"); return false; } } else { Date now = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(now); calendar.add(Calendar.DAY_OF_MONTH, -1); startTime = calendar.getTime(); } start = dateFormat.format(startTime); end = argParser.getString("stop"); log.info("从参数中获取到结束时间是:"+end); if (end != null) { try { endTime = dateFormat.parse(end); } catch (ParseException e) { log.error("", e); log.error("时间格式请采用yyyy-MM-dd"); return false; } } else { Date now = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(now); endTime = calendar.getTime(); } end = dateFormat.format(endTime); return true; } /** * @param args */ public static void main(String[] args) { MainAccess access = new MainAccess(); if (!access.initArgs(args)) { log.error("初始化命令行参数失败!"); return; }
}
2.2 main方法中调用ArgParser类:用来解析dos命令下输入的参数
public class ArgParser { private Map argList = new HashMap(); /** * new 一个无参构造器,调用parseArgs进行解析(原来的方式) */ public ArgParser() { // TODO Auto-generated constructor stub } /** * 直接new一个带数组参数的构造器来解析命令行 * @param args */ public ArgParser(String[] args) { argList = new HashMap(); if (args != null && args.length > 0) { for (int index = 0; index < args.length; index++) { if (args[index].startsWith("-") && index + 1 <= args.length - 1) { if (!args[index + 1].startsWith("-")) { // -start 2009-10-10 --> [start,2009-10-10] argList.put(args[index].substring(1), args[index + 1]); } } } } } /** * @Desc: parse command line arguments to internal variable argList * @param args: command line parameter * @return 0:success; 1:failure */ public int parseArgs(String[] args) { argList = new HashMap(); if (args != null && args.length > 0) { for (int i = 0; i < args.length; i++) { if (args[i].equalsIgnoreCase("-batch") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("batch", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-start") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("start", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-stop") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("stop", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-cfgFile") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("cfgFile", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-cfgId") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("cfgId", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-f") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("f", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-cityId") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("cityId", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-areaId") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("areaId", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-bscId") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("bscId", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-mscId") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("mscId", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-omcId") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("omcId", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-timeStamp") && args.length > i + 1) { if (args[i + 1].indexOf('-') != 0) { // args[i+1] not a parameter name like -start,-stop etc. argList.put("timeStamp", args[i + 1]); } } else if (args[i].equalsIgnoreCase("-oid") && args.length > i + 1) { argList.put("oid", args[i + 1]); } else if (args[i].equalsIgnoreCase("-dur") && args.length > i + 1) { argList.put("dur", args[i + 1]); } // begin add by yuchangjiang 2009-12-22 // 解析类型(perf或其它) else if (args[i].equalsIgnoreCase("-type") && args.length > i + 1) { argList.put("type", args[i + 1]); } else if (args[i].equalsIgnoreCase("-scope") && args.length > i + 1) { argList.put("scope", args[i + 1]); } // end add by yuchangjiang 2009-12-22 else if (args[i].equalsIgnoreCase("-provinceId") && args.length > i + 1) { argList.put("provinceId", args[i + 1]); } else if (args[i].equalsIgnoreCase("-provinceName") && args.length > i + 1) { argList.put("provinceName", args[i + 1]); } // add by songjian 2010-02-04 begin else if (args[i].equalsIgnoreCase("-mark") && args.length > i + 1) { argList.put("mark", args[i + 1]); } // add by songjian 2010-02-24 end // add by songjian 2010-03-18 begin else if (args[i].equalsIgnoreCase("-taskId") && args.length > i + 1) { argList.put("taskId", args[i + 1]); //System.out.println("taskId is :" + args[i + 1]); } else if (args[i].equalsIgnoreCase("-taskName") && args.length > i + 1) { argList.put("taskName", args[i + 1]); //System.out.println("taskName is :" + args[i + 1]); } else if (args[i].equalsIgnoreCase("-fileNameList") && args.length > i + 1) { argList.put("fileNameList", args[i + 1]); System.out.println("fileNameList is :" + args[i + 1]); } // add by songjian 2010-03-18 end //lsyin 2010-11-26 else if (args[i].equalsIgnoreCase("-nDayBefore") && args.length > i + 1) { argList.put("nDayBefore", args[i + 1]); //System.out.println("nDayBefore is :" + args[i + 1]); } //lsyin 2010-11-26 } } return 0; } /** * @Desc: parse command line arguments to internal variable argList * @param name parameter name * @return null :means no specific value */ public String getString(String name) { String retValue = null; if (argList.containsKey(name)) { retValue = (String) argList.get(name); } return retValue; }// public int getInt(String name) {// int retValue = Common.INT_NULL;// if (argList.containsKey(name)) {// String value = (String) argList.get(name);// retValue = Integer.parseInt(value);// }// return retValue;// }}
2.3.调用jar包的命令可以改成:java -jar mainAccess.jar -start 2013-09-02 00:00:00 -stop 2013-09-03,当然参数可以输或不输,-start后面是第一个参数:开始时间,-stop后面是第二个参数:结束时间;参数之间是用空格分开,参数是数组类型,从0开始,第一个就是: -start 2013-09-02 00:00:00