需求:通過dos的方式運行可以在IDE(這里使用的是IntelliJ IDEA)中正常運行的java程序。
程序如下:MyHttpClient.java(文件名)
//package com.yf.service;在IDE下就要加上這個,不然會提示丟失包的錯誤 ?在dos下運行就需
//要注釋這個 ?為什么要注釋這里,我下面有說明 ???當然在生產環境下是不允許注釋的 ??如何帶包//運行,我下面也給出了方法說明
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importjavax.swing.text.html.parser.Entity;
importjava.io.IOException;
importjava.io.UnsupportedEncodingException;
importjava.util.ArrayList;
importjava.util.List;
public classMyHttpClient {
/*通過slf4j的LoggerFactory工廠方法獲取日志對象*/
private Logger logger= LoggerFactory.getLogger(MyHttpClient.class);
public static void main(String[] args) {
//創建httpClient對象
HttpClient httpClient =newDefaultHttpClient();
//使用post請求方式
HttpPost httpPost =newHttpPost("http://131.129.212.164:8007/statisticsService/count!getUserCareerDate.do");
//創建parms集合 添加參數
List parms =newArrayList();
parms.add(newBasicNameValuePair("accessToken","18682009779"));
UrlEncodedFormEntity entity =null;
try{
//將Parma封裝成使用utf8編碼格式的實體
entity =newUrlEncodedFormEntity(parms,"utf-8");
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
//Post提交格式獨有的設置參數的方式
httpPost.setEntity(entity);
try{
//獲取httpResponse
HttpResponse httpResponse = httpClient.execute(httpPost);
//如果狀態碼正常則輸出響應成功并輸出內容
if(200== httpResponse.getStatusLine().getStatusCode()) {
System.out.println("post方式請求響應成功");
HttpEntity entity1 = httpResponse.getEntity();
String response = EntityUtils.toString(entity1);
System.out.println(response);
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
本機的JDK的位置為:E:\Jdk8
程序的位置為:D:\develop_practice\test_20170705\src\main\java\com\yf\service
本來以為這還不簡單,配置好java環境變量(以下會介紹如何配置),直接在dos下編譯(javac),運行(java)不就ok了嘛!!!So easy!
結果我艸首先編譯的過程就懵逼了.提示亂碼錯誤!(如下圖所示)
原因是:IDE中采用的是UTF-8的編碼格式,而這里默認采用的是GBK的編碼解析,當然會亂碼!最簡單的解決方案是采用帶選項編譯(不清楚可以通過javac? Enter查看),如下:
好了,現在應該編譯沒問題了吧,不就一個編碼問題嘛,就是干!結果如下:
我屮艸芔茻...Double Kill!!!提示一大堆的各種包找不到(25個找不到)!原因是因為在IDE中通過maven配置的方式,IDE會自動到本地倉庫(maven中配置的)去找從遠程倉庫(remote repository)下載下來的jar包。而沒有了IDE,系統就會到配置好的JDK路徑下去找,更具體一點是到安裝的JDK下面的jre下面的lib下的ext路徑下去找(本機是E:\Jdk8\jre\lib\ext這個路徑)。所以上面問題本質是在默認路徑下找不到包!默認路徑下!包!
通過我的阿拉丁神燈(陰險表情),終于讓我找到了答案。解決方案有兩個:1.直接通過帶選項編譯,比如我的其中一個jar包路徑在C:\Users\ClearWang\.m2\repository\commons-logging\commons-logging\1.1.1(其實這種方式找運行所需的jar包很SB,如果對maven比較熟悉的話,可以通過maven打包,之后會生成一個war包,這個war包放在tomcat服務器的webapps下會自動部署成對應的應用(可以理解為解壓的過程),前提是tomcat是打開的親,這個應用下的\WEB-INF\lib目錄下就是工程所需要的所有jar包,這樣找你會發現so easy!),那么我編譯的時候寫法如下圖所示:
你會發現,還是會有問題,只不過問題要少了一些(25個變成了14個),如下圖所示。
說明這個方法是管用的,我只要把所有的jar路徑全部添加上去不就歐了么!但是!但是!但是!我缺了那么多包(具體來說,我這里是4個jar包),我總不至于一個一個的添加上去吧(傻X啊),于是老子又求了一下阿拉丁,她(嗯,你沒沒錯,就是她)給出了一種更加簡單的方法:2.將需要的jar包拷貝到默認的路徑下(E:\Jdk8\jre\lib\ext上面紅色字體部分的思路,既然已經有了默認路徑,不就是缺包么,那么老子給你不就得了),于是:
編譯成功后會在當前目錄下生成一個.class的字節碼文件。
好了,我的太陽(太陽:日,嘖嘖我的太陽即:我。。咳咳發泄一下),現在編譯ok了 ,應該就不會有問題了吧,于是直接java MyHttpClient(或者java MyHttpClient.java),結果如下:
恩,恩好......好....好簡單!(硬氣裝逼!)
對了,最上面那個為什么在dos下運行要注釋包的問題,原因是如果不注釋的話,運行的時候(java MyHttpClient)(編譯沒有問題)就會提示找不到或者無法下載主類的問題(當然,如果你的這個程序里面本來就沒有主類的話也會提示這個錯誤),如下圖所示:
====================================環境變量=============================
恩,問題解決了,現在說一下如何配置環境變量,以及為什么要配置環境變量,先來說下為什么要配置環境變量吧:這里通過不配置環境變量運行編譯和運行以上程序來體會配置環境變量的好處(自己體會):
在不配置任何環境變量(Java_Home,ClassPath)的情況下,編譯和運行該程序(直接上圖):
關鍵點:1.進入jdk的javac環境
2.帶選項編譯和運行(如果不清楚選項的作用可以直接javac回車或者java回車查看)
通過以上對比,也深刻體會了配置環境變量的好處了!最后想說句,我擦嘞,就是干!!!
那如何配置呢?很簡單,直接上圖:
在系統變量那里直接添加上JDK下的bin路徑即可。當然也可以使用其它的方式配置環境變量,比如說在系統變量(注意一定是系統變量那里新建,不能建錯了,建在用戶變量那里)新建一個JAVA_HOME(個人認為大小寫都可以,我習慣大寫),然后添加到系統變量中Path中去,比如這里的JAVA_HOME如果配置的路徑為:E:\Jdk8那么Path中就應該寫成:%JAVA_HOME%\bin(%括起來表示引用這個路徑)
對于CLASSPATH,如果不配置的話默認會從當前路徑加載字節碼文件(本機就沒配置,當然,網上有說最好配置的,因為有的IDE可能會需要之類的,這個看個人情況處理),如果配置的話配置方法為:.;D:\develop_practice\test_20170705\src\main\java\com\yf\service或者D:\develop_practice\test_20170705\src\main\java\com\yf\service;.(直接配置在系統變量那里就好了,不需要再添加到Path路徑,點寫在前面表示先在當前目錄查找.class文件,找不到再在配置的路徑下查找,反之,點加在后面表示先在配置的路徑下查找找不到再在當前目錄下查找)
最后,配好了可以在dos下,使用echo命令查看配置的環境變量的路徑,比如說要查看配好的JAVA_HOME路徑可以這樣寫:echo %JAVA_HOME%。
最后對Path和CLASSPATH做個比較:
Path:Path環境變量記錄的是可執行文件,例如:.exe。對可執行文件,先在當前路徑去找,如果沒找到就到配置的路徑下去查找。
CLASSPATH:CLASSPATH里配置的是java的運行文件所在路徑(即.class的字節碼文件)。
然而,然而,然而(重要的事情說三遍):生產環境下不允許先打開源代碼,然后注釋掉其中的包(類似于package com.yf.service),這時候怎么辦呢?
方法如下:
編譯的時候使用帶-d選項編譯(會根據程序中的包名在-d后指定的文件夾下生成指定的帶包的文件),然后運行的時候一定要以帶包的形式訪問,如下圖所示:
不帶包運行就會出現“找不到或無法加載主類MyHttpClient”這樣的錯誤。如下所示:
然而,然而,然而(重要的事情再說三遍):生產環境下,你不能指望我每次都將對應的第三方jar包全部拷貝到jdk下面的ext目錄下吧?(我的機子是E:\Jdk8\jre\lib\ext)
處理方式:如下圖
這種方式顯然很不好,我這里有4個jar包都已經這么長了,如果我有更多的外在依賴jar包,豈不是很長??那怎么辦呢,在jdk 1.6之后(也就是說如果你是之前的版本,就不支持這種方式了),提供了一種新的方式(如下圖):
其中-Djava.ext.dirs=jar包的存放路徑
這樣的話,不管我外在依賴的jia包是多少個,我只需要將它放在對應的目錄下就OK了(我這里是D:\develop_practice\test_20170705\lib目錄,一般生產環境下打出的war包自動部署之后都會有一個lib目錄專門存放這些程序依賴的第三方jar包的)
注意:javac的常用選項及其作用:
1》-classpath+路徑(.表示當前路徑): 指定當前工程的classpath路徑 ??(這里為什么不說是當前類的classpath路徑,因為如果以javac -classpath c:\ClearWang\Develop Demo.java就會在指定的c:\ClearWang\Develop下對指定的當前類Demo.java生成對應的class字節碼文件,但是如果是javac -classpath c:\ClearWang\Develop *.java就會對所有的類同時生成字節碼文件 ?所以說成當前工程要更準確)
2》-d+路徑:在指定的路徑下將生成的字節碼文件以帶包名的形式存放,要求運行時要帶包運行。
3》-encoding+編碼類型(例如utf8、gbk等):以指定的編碼格式編譯文件。當調用javac命令時,會把源文件進行一次編碼轉換,如果沒有指定字符集,就從操作系統默認的字符集(Windows默認是GBK)轉換成Java內部默認的unicode字符集,然后再將源文件編譯成class文件,并且以unicode的編碼形式保存到硬盤上。
4》-cp+jar包路徑:以指定的jar包運行當前的類(如果當前類只需要依賴一兩個jar,可以使用這種方式運行)
補充下dos下對一個應用打成war包的命令(雖然不常用,因為很多工具都可以幫我們自動完成這個功能,比如maven):
jar -cvf yftech.war yftech
將yftech打成yftech.war包(對,你沒看錯,如果你寫成jar -cvf yftech yftech.war)就寫錯了,因為老外的腦袋被驢踢過,想法總是反正來,簡直了。。。我的太陽!)
=================================OVER歡迎吐槽=========================