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