天天看點

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