天天看点

java项目打JAR包详解1

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