锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Java bean瀵硅薄瀹氫箟錛?/p>
Jenkins - 鎻掍歡綆$悊 鍙夋彃浠秚ab欏典笅瀹夎publish over ssh鎻掍歡銆傜敤浜嶫enkins鏈嶅姟鍣╯sh浼犺緭鏂囦歡鍒癓inux鏈嶅姟鍣ㄣ?br />瀹夎濂絧ublish over ssh鎻掍歡鍚庯紝鍒癑enkins - 閰嶇疆涓?publish over ssh欏硅緗浉鍏充笂浼燣inux鏈嶅姟鍣ㄤ俊鎭?br />
Jenkins ssh key鐨勭敓鎴愮綉涓婃湁寰堝璧勬枡錛屼笉鍐嶈繃澶氫粙緇嶃傛垜鏄嬌鐢ㄧ殑Passphrase, 鐧誨綍楠岃瘉key鎴栬卲assphrase鏂瑰紡鍙互浜岄変竴錛屽彲鏍規(guī)嵁鍏蜂綋鎯呭喌閫夋嫨銆?br />
ssh server璁劇疆錛?br />緇熶竴閰嶇疆鍙戝竷鏂囦歡鐨凩inux鏈嶅姟鍣紝濡備笅鍥俱?br />
鍏朵腑 remote directory 琛ㄧず鍙戝竷鏂囦歡鍒版湇鍔″櫒鐨勯粯璁ょ洰褰曘傝嫢涓虹┖榛樿涓哄綋鍓嶇櫥褰曠敤鎴風(fēng)洰褰曘?br />
4.欏圭洰鍙戝竷
鏈枃浠vn鐨勮鍗昽rder欏圭洰涓轟緥錛岄氳繃Jenkins宸ュ叿錛岀粡榪囩紪璇?鎵撳寘-涓婁紶-鍙戝竷榪囩▼錛屽姩鎬佺殑灝唈ava jar鍙戝竷鍒頒袱鍙版湇鍔″櫒銆?br />4.1 鏂板緩浠誨姟
Jenkins - 鏂板緩浠誨姟錛屽垱寤簅rder鍙戝竷鐨勪竴涓換鍔°傜敱浜庨」鐩槸鍩轟簬maven鐨勶紝鎵浠ラ夋嫨'鏋勫緩涓涓猰aven欏圭洰'榪涘叆閰嶇疆欏甸潰銆?br />
閰嶇疆svn浠g爜搴撲俊鎭細(xì)
post steps錛氶厤緗彂甯冩湇鍔″櫒鐨勪俊鎭傚涓嬪浘銆?br />
鐢變簬order璁㈠崟鏈嶅姟鏄泦緹ら儴緗詫紝鍒嗗埆璁劇疆浜?鍙?ssh server銆?br />source files 鏄寚涓婁紶鍒版湇鍔″櫒鐨勫彂甯冩枃浠躲侸enkins榛樿緙栬瘧鍚庢枃浠跺湪workspace鐩綍涓嬶紝榪欓噷杈撳叆target/{鍙戝竷jar鏂囦歡}. 涓婁紶鍒板彂甯冩湇鍔″櫒鍚庯紝涓嶉渶瑕乼arget鐩綍錛屾墍浠?remove prefix涓~target/銆?
Remote directory鍙互涓虹┖錛岀敱浜庢垜浠湪絎?姝ヤ腑宸茬粡璁劇疆浜嗗叏灞榛樿ssh server鐨剅emote directory 錛屾墍浠ヨ繖閲屽彲浠ヤ笉濉紝濡傝繖閲岃緗皢瑕嗙洊涔嬪墠鐨勫叏灞閰嶇疆鐩綍銆?br />exec command鏄枃浠朵笂浼犲埌鍙戝竷鏈嶅姟鍣ㄥ悗錛岄渶瑕佹墽琛岀殑shell鑴氭湰鎸囦護錛岀敤浜庡彂甯僶rder jar鍖呯殑鍚姩澶囦喚鍛戒護銆傚浘涓璦pp-deploy.sh涓哄簲鐢╦ar鏂囦歡鐨勫惎鍔ㄥ浠絪hell鑴氭湰鏂囦歡錛岄渶鏀懼埌鍙戝竷鏈嶅姟鍣ㄦ寚瀹氱洰褰曚笅銆傚叾涓瑽UILD_ID=DONTKILLME鏄負(fù)浜唊ill 鑰佺殑榪愯jar鏃墮伩鍏嶅綋鍓嶆墽琛岃繘紼嬩笉琚鏉銆?br />
app-deploy.sh鏂囦歡錛?br />
## java env
## service name
SERVICE_NAME=$1
SERVICE_DIR=/usr/service/
JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid
#function start
start(){
cd $SERVICE_DIR
source /etc/profile
## nohup java -Xms256m -Xmx512m -jar $JAR_NAME >log/$SERVICE_NAME.out 2>&1 &
nohup java -jar -Xms256m -Xmx256m $JAR_NAME >/dev/null 2>&1 &
echo $! > $SERVICE_DIR/$PID
echo "#### start $SERVICE_NAME"
}
# function stop
stop(){
cd $SERVICE_DIR
if [ -f "$SERVICE_DIR/$PID" ]; then
kill `cat $SERVICE_DIR/$PID`
rm -rf $SERVICE_DIR/$PID
fi
echo "#### stop $SERVICE_NAME"
sleep 3
PROCESS=`ps -ef|grep $JAR_NAME |grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
echo "Kill the $SERVICE_NAME process [ $i ]"
kill -9 $i
done
}
# function clean
clean(){
echo "---start do do clean phase."
cd $SERVICE_DIR
if [ ! -d "lastDeploy" ]; then
mkdir lastDeploy
fi
if [ -f "$JAR_NAME" ]; then
echo "backup $JAR_NAME"
mv $JAR_NAME lastDeploy/$JAR_NAME\_`date "+%Y%m%d%H%M%S"`
fi
if [ -d "tmp" ]; then
mv -f tmp/$JAR_NAME ./
fi
}
case "$2" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
echo "#### restart $SERVICE_NAME"
;;
clean)
stop
sleep 2
clean
echo "#### clean $SERVICE_NAME"
;;
deploy)
stop
clean
start
echo "#### deploy $SERVICE_NAME"
;;
esac
exit 0
]]>
]]>
璇誨彇jar鍖呭鐨勬柟娉曢昏緫:閫氳繃鑾峰彇綾繪枃浠舵墍鍦╟ode source鐨勮礬寰勬潵瀹氫綅jar鍖呰礬寰勩傜劧鍚庣敱"jar鍖呰礬寰?閰嶇疆鏂囦歡鍚?鐨勬柟寮忓彇寰楀搴斿睘鎬ф枃浠躲?br />
2 * 鍙栫被瀵瑰簲source婧愮洰褰曡礬寰?br /> 3 * @param clazz
4 * @author qiang.dai
5 * @return
6 */
7 public static String getCodeSourcePath(Class clazz) {
8 URL url = clazz.getProtectionDomain().getCodeSource().getLocation();
9 String path = url.getPath();
10 try {
11 if (path.toUpperCase().endsWith(".JAR")) {
12 int index = path.lastIndexOf("/");
13 path = path.substring(0, index);
14 }
15 return java.net.URLDecoder.decode(path, "UTF-8");
16 } catch (UnsupportedEncodingException e) {
17 e.printStackTrace();
18 return "";
19 }
20 }
璇誨彇閰嶇疆鏂囦歡:
2 try {
3 String classPath = URLUtil.getCodeSourcePath(ConfigManager.class);
4 Properties prop = new Properties();
5 // System.out.println("path="+classPath+File.separator+CONFIG_FILE_NAME);
6 prop.load(new FileReader(new File(new File(classPath),CONFIG_FILE_NAME)));
7 initConfigs(prop);
8 } catch (Exception e) {
9 System.out.println(String.format("******鍒濆鍖栭厤緗枃浠跺け璐?璇鋒鏌ユ枃浠禰%s]鍦ㄥ綋鍓嶇洰褰曚笅瀛樺湪******", CONFIG_FILE_NAME));
10 e.printStackTrace();
11 throw new RuntimeException(e);
12 }
13 }
]]>
2 * poi瑙f瀽excel sample
3 * 閽堝2007鍙婁互涓婄増鏈?nbsp;浣跨敤XSSF瑙f瀽
4 * @throws EncryptedDocumentException
5 * @throws InvalidFormatException
6 * @throws IOException
7 */
8 public void parseExcel() throws EncryptedDocumentException, InvalidFormatException, IOException{
9 InputStream is = new FileInputStream("e:\\excel.xlsx");
10 Workbook workbook = WorkbookFactory.create(is);
11 Sheet sheet = null;
12 for (int i = 0; i < workbook.getNumberOfSheets(); i++) {// 鑾峰彇姣忎釜Sheet琛?/span>
13 sheet = workbook.getSheetAt(i);
14 String sheetName = sheet.getSheetName();
15 if(workbook.isSheetHidden(i)){
16 //鍒ゆ柇sheet欏墊槸鍚﹁闅愯棌
17 System.out.println("sheet="+sheetName+", is hidden.");
18 continue;
19 }
20 for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) {// 鑾峰彇姣忚
21 if(j==0) //絎竴琛宼itle錛屼笉澶勭悊
22 continue;
23 Row row = sheet.getRow(j);
24 if(row == null)
25 continue;
26 //澶勭悊姣忚鏁版嵁
27 try {
28 if(row.getZeroHeight()){
29 //琛屾槸鍚﹁闅愯棌
30 System.out.println("---Sheet琛╗"+sheetName+"],絎? + j + "琛岃闅愯棌錛屼笉澶勭悊---");
31 continue;
32 }
33 int columns = row.getPhysicalNumberOfCells();
34 for(int c=0;c<columns;c++){
35 Cell cell = row.getCell(c);
36 //TODO: busyness process
37 }
38 } catch (Exception e) {
39 System.out.println("---Sheet琛╗"+sheetName+"],絎? + j + "琛屽鐞嗗嚭閿?img src="http://www.tkk7.com/Images/dot.gif" alt="" />.---");
40 e.printStackTrace();
41 throw new RuntimeException(e);
42 }
43
44 System.out.println("---Sheet琛╗"+sheetName+"],絎? + j + "琛屽鐞嗗畬姣?--");
45 }
46 }
47 }
]]>/**
* Post Http request with XML parameter
* @param requestUrl
* @param xmlData request xml parameter
* @param contentType such as "application/xml"
* @param charset such as "UTF-8" or "GBK"
* @return
*/
public static HttpRespondResult postXmlRequest(String requestUrl, String xmlData, String contentType, String charset){
HttpRespondResult revObj = new HttpRespondResult();
//init PostMethod object.
PostMethod post = new PostMethod(requestUrl);
try {
//wrape the request entity.
RequestEntity requestEntity = new StringRequestEntity(xmlData, contentType, charset);
post.setRequestEntity(requestEntity);
HttpClient httpClient = new HttpClient();
// send the post http request and reture status code.
int statusCode = httpClient.executeMethod(post);
// get reture content from server side.
String bodyContent = post.getResponseBodyAsString();
// populate the reture values to vo.
revObj.setStatusCode(statusCode);
revObj.setRespondbodyContent(bodyContent);
} catch (UnsupportedEncodingException e) {
revObj.handleExceptionMsg(e);
e.printStackTrace();
}catch (HttpException e) {
revObj.handleExceptionMsg(e);
e.printStackTrace();
} catch (IOException e) {
revObj.handleExceptionMsg(e);
e.printStackTrace();
} catch (Exception e){
revObj.handleExceptionMsg(e);
e.printStackTrace();
}finally {
//close the connection.
post.releaseConnection();
}
return revObj;
}
]]>/**
* 淇冮攢xml瀵硅薄綾?nbsp;
* @author daiqiang
* 瀵瑰簲xml鏂囦歡鍐呭濡備笅錛?br />
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<promotion>
<id>promotionId</id>
<name>鍏冩棪淇冮攢</name>
<type>CMS</type>
<typeDes>CMS涓繪帹淇冮攢</typeDes>
<startTime>2012-01-01</startTime>
<endTime>2012-01-03</endTime>
<products>
<product>
<merchantId>merchantid</merchantId>
<num>500</num>
<productCode>code1</productCode>
<productId>111</productId>
<requestId>codedata</requestId>
</product>
<product>
<merchantId>merchantid2</merchantId>
<num>800</num>
<productCode>code2</productCode>
<productId>2</productId>
<requestId>codedata</requestId>
</product>
</products>
</promotion>
*
*/
@XmlRootElement(name="promotion")
@XmlAccessorType(XmlAccessType.FIELD)
public class Promotion implements Serializable{
private static final long serialVersionUID = 870036805093867083L;
private String id;
private String name;
private String type;
private String typeDes;
private String startTime;
private String endTime;
@XmlElementWrapper(name="products")
@XmlElement(name="product")
private List<Product> products;
/*@XmlTransient
the field is not binded to xml
private String testHiddenFields;*/
//姝ゅ鐪佺暐鍏蜂綋set get 鏂規(guī)硶銆?br />
璇存槑錛氫笂鏂囧畾涔変簡涓涓績閿瀵硅薄綾?/span>Promotion.
綾繪爣娉ㄨ〃紺猴細(xì)
@XmlRootElement錛氱敤浜庡畾涔夎瀵硅薄鏄犲皠鎴?/span>xml鏍硅妭鐐瑰厓绱犲悕錛岄粯璁や笌綾誨悕涓鑷淬傚彲閫氳繃@XmlRootElement(name="otherRootElement")鏂瑰紡鎸囧畾鍏蜂綋鍚嶇О銆?/span>
@XmlAccessorType: 鐢ㄤ簬鏍囪瘑璇?/span>java瀵硅薄涓?/span>xml鏄犲皠鐨勮闂柟寮忋傛湁濡備笅灞炴у箋?/span>
PROPERTY/FIELD/PUBLIC_MEMBER/NONE
PROPERTY: 鎵鏈?/span>set/get鏂規(guī)硶瀵瑰皢琚槧灝勪負(fù)xml鍏冪礌.闄ら潪琚?/span>XmlTransient鏍囨敞渚嬪.
FIELD:鎵鏈夊璞″睘鎬у皢琚槧灝勪負(fù)xml鍏冪礌銆傞櫎闈炶XmlTransient鏍囨敞渚嬪.
PUBLIC_MEMBER錛?/span>姣忎釜public鐨?/span>get/set瀵規(guī)柟娉曟垨public field灝嗚鏄犲皠涓?/span>xml鍏冪礌銆傞櫎闈炶XmlTransient鏍囨敞渚嬪.
NONE錛?/span>娌℃湁fields 鎴?/span> property琚槧灝勶紝闄ら潪鏄劇ず鎸囧畾鍏蜂綋fields鎴?/span>property銆?/span>
灞炴ф爣娉ㄨ〃紺猴細(xì)
@XmlTransient:鎸囧搴斿睘鎬т笉鍋?/span>xml鏄犲皠銆?/span>
@XmlElement(name="product")錛氭寚瀹氬睘鎬ф槧灝勬椂瀵瑰簲xml鍏冪礌鍚嶇О
@XmlElementWrapper(name="products")錛氬湪鏌愪簺鍦烘櫙涓嬶紝闇瑕佸鏄犲皠鐨勫睘鎬у仛鍖呰澶勭悊銆傚渚嬪瓙涓?/span>products List瀵硅薄灞炴э紝鍦?/span>xml涓垜鎯沖湪鏄犲皠瀵規(guī)墍鏈夌殑product鍏冪礌鍐嶅仛涓涓?/span>products 鍏冪礌鍖呰錛屽涓嬫墍紺猴紝灝卞彲浠ユ寜姝ょ鏂瑰紡瀹炵幇銆?/span>
<products>
<product> … </product>
<product> … </product>
…
</products>
Java涓?/span>xml鏄犲皠鏂規(guī)硶
Java瀵硅薄鍒?/span>XML
XML鍒?/span>Java瀵硅薄