非IDE環境下程序的運行(dos)

需求:通過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歡迎吐槽=========================

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,826評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,922評論 6 342
  • 1 小光于三個月前,也就是十月份的時候,遇見了自己小學暗戀的女孩。 時間倒流至三個月前,小光失戀,自己談了五年的女...
    二九啊閱讀 967評論 0 4
  • 從前,我的所有疑問,所有選擇都是媽媽幫助我,一直以來也成為了我的習慣,不知所措的時候,總會第一個想到媽媽。可是...
    唱起鐺哩咯鐺閱讀 242評論 0 0
  • 挖抗:總量于2140年,2100萬比特幣被全部生產出來。 每開采21萬個區塊耗費4年,每過4年,貨幣發行速度降低5...
    3公里對閱讀 108評論 0 0