這標題實在有點拗口,不知道怎么寫好,但看了標題也就明白文本的內容。最近幾天在折騰這些玩意兒,所以寫寫總結。除了環境搭建,本文還是一篇入門級的上手教程。
去下載一些東西
老樣子,先廢話幾句,IntelliJ IDEA,這個名字不知道誰想出來的,也真夠拗口的,發音大致如此:[in 'te li dʒei ai di: i: ei],我還是簡稱之為IntelliJ吧,“Intel”有“智能”的意思,IntelliJ也自稱最智能的Java集成開發環境。我這次使用的是最新的版本——13.1,可以在jetbrains.com的官方網站上下載:http://www.jetbrains.com/idea/
Tomcat是Java的web服務器,目前最新版是8.0.5,可以從這里下載到:http://tomcat.apache.org/download-80.cgi
當然了,搞Java開發,JDK是必須的,JDK的最新版是8u5,也就是Java8的第5個更新版本,可以從這里下載到:http://www.oracle.com/technetwork/java/javase/downloads/index.html
這次全部搞到最新的了!不要跟我說什么新版本不穩定不成熟,我不聽。:)
JDK安裝
JDK的安裝是很簡單的,裝載dmg鏡像,然后雙擊圖標運行安裝程序,會安裝到這個位置:/Library/Java/JavaVirtualMachines,貌似不需要什么額外的其它配置了。
Tomcat安裝
Tomcat並不區分Linux版和Mac版(但Windows版卻是要區分的),下載下來就是一個tar.gz包,真正的綠色軟件,解壓,放到合適的位子去,就算完成安裝了。一般來說,是放到/usr/local去,/usr目錄就相當於Windows的“program files”目錄嘛。但這次我不知道咋搞的(忘了當時參考了個啥文檔了),居然弄到/Library下面去了:/Library/Tomcat/apache-tomcat-8.0.5。(如果遇到權限問題的話,就用root賬號上去chmod一下)
我習慣性地不修改默認的目錄名,依然叫“apache-tomcat-8.0.5”,但我會做一個軟鏈接指向這個目錄:
$cd /Library/Tomcat $ln -s apache-tomcat-8.0.5 Home
這樣就能輕易用/Library/Tomcat/Home去訪問tomcat了。這樣做還有一個好處,哪天Tomcat更新的新版本,我直接把Home指向新版本的目錄即可,其它關於對Tomcat的路徑引用的配置不用改,舊的版本可以繼續保留用於測試,要換回去也很簡單,改一下Home的指向即可。
啟動Tomcat:
$cd /Library/Tomcat/Home/bin $./startup.sh
立即用瀏覽器訪問一下:http://localhost:8080/,你應該能看到:
這個默認的頁面包括了很多有用的東西,不過我想最有用的應該是Documentation,有空的話,真的值得看看,大多數問題都能在那里找到答案。也許你還想點“Server Status”按鈕看看服務器狀態,但你馬上發現不行,你沒有設置管理員的用戶名/密碼,它不讓你看。(后面我會講如何弄)
如果你看不到這個頁面,一定是哪里出了什么問題,要查看Tomcat的的日志去找原因,日志在這個目錄下:/Library/Tomcat/Home/logs,日志文件名與日期相關,比如:“catalina.2014-05-12.log”。
停止Tomcat:
$./shutdown.sh
可能你還注意到bin目錄下有一些bat文件,那是給Windows准備的,可以刪除掉。
另外,重啟tomcat的方法是:先shutdown,然后再startup,不能直接startup,貌似沒有一個直接restart的腳本(也許你可以自己寫一個)。
Tomcat的配置
配置管理員賬號
配置管理員用戶名密碼,剛才你不是想查看服務器狀態結果不行嗎?在這里配:
$vim /Library/Tomcat/Home/conf/tomcat-users.xml
在<tomcat-users>節點中加這么一行:
<user username="admin" password=“123456" roles="manager-gui" />
就設置好了一個叫admin的管理員,密碼是123456。(這也能叫密碼?)重啟Tomcat生效。
配置Tomcat端口
需要在localhost后面加上8080會讓你感到不爽,你想把這個去掉,使用默認端口號80,可以在這里配置:
$vim /Library/Tomcat/Home/conf/server.xml
找到這一行:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
把8080改為80即可。但!且慢,由於系統權限的問題,80端口不是隨隨便便誰都能開啟的,你需要root權限來運行Tomcat,否則綁定端口就會失敗。我建議是放棄,畢竟誰會用自己的Mac來做服務器呢?但我會把8080改為8079,這是因為后面用IntelliJ調試程序的時候,IntelliJ會啟動新的Tomcat實例,大家都習慣性地使用8080這個端口,為了避免這個沖突,把默認的8080改一下是有必要的。
順便提一下,在Mac下想知道哪些端口被占用了,可以用:
$sudo lsof -i | grep LISTEN
在Linux下可以用netstat,但Mac下的netstat命令貌似跟Linux下的出入蠻大,不知道為什么會這樣。
配置HTTPS
雖然沒有絕對的安全,但大牛們說“不用SSL的安全都是‘假裝安全’”。所以……
先來看看Tomcat的結構圖(此圖來自於傳智播客的教學視頻,所以不太清晰,湊合看看):
從圖中可以看出,我們要配置https其實就是要配置Connector,Connector在之前配置端口的地方已經接觸過了,有印象吧?當然,我們還得准備些材料。那就是密鑰,准備方法如下圖:
如果你的個人目錄(即“cd ~”轉到的目錄)已經有“.keystore”,那么還要提示你輸入密鑰庫的口令,我這里秘鑰庫的口令是654321,tomcat這個密鑰的口令也是654321。
這樣一來,就在你的密鑰庫中創建了一個叫tomcat的密鑰,其中只指明了“名字與姓氏”的信息為localhost,別的都可以留空。完之后你可以看看.keystore到底是個什么玩意兒:
$od ~/.keystore
其實啥都看不出來,一堆加密的二進制碼。
接着就是Tomcat的server.xml文件了:
$vim /Library/Tomcat/Home/conf/server.xml
在<Service>節點中加一個<Connector>節點:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystorePass="654321" />
注意,一點都不能寫錯,包括字母大小寫都要完全寫正確方可。保存,重啟服務器,打開:https://localhost:8443/
Safari瀏覽器提示你無法驗證localhost身份,這是很顯然的,你的證書是你自己造的,沒有CA(證書頒發機構)的擔保,所以瀏覽器默認是不信任你的,但你可以選擇“繼續”。
提示:https在實際生產環境中是非常有用的東西,但在開發環境中沒什么用,我們只需要知道有這回事,這里先把這個配置拿掉。不拿掉的話后面運行程序的時候可能會出現一個8443端口被占用的錯誤提示。(盡管此錯誤其實也無關痛癢)。
添加web應用
有兩種方法:
第一是直接把應用放在webapps目錄下,Tomcat會自動解釋;
另一種是在conf/Catalina/localhost下面放入一個xml文件,如放一個叫test.xml的文件,內容是:
<Context docBase="/Users/guogangj/test" />
然后在/Users/guogangj/test下創建一個index.html,隨便寫點內容:
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> test </title> </head> <body> <h1>test</h1> </body> </html>
然后訪問:http://localhost:8079/test/index.html,就能看到test這幾個大字了。
IntelliJ的安裝
下載的安裝包是個dmg,安裝無壓力,打開並拽入“應用程序”中即可。直接運行,根據提示進行一些默認的配置即可。
創建Java Web項目
說實在的,IntelliJ的項目創建方式不如其它IDE的直觀,反正我一開始是沒搞懂(其實搞懂也很簡單),另外IntelliJ的不同版本之間是有差異的,網上找的一些資料並不准確,最好還是直接看官方文檔,根據它的Tutorial走走,這次我看的官方文檔是針對IntelliJ v12的,而現在我用的是v13,所幸的是差別並不大。
New Project,然后這樣選:
那個Versions只能選3.1,貌似之前還能選3.0,這個版本其實是Servlet的版本,最新的版本是3.1,需要用Tomcat8來承載,如果你選擇用Tomcat7來承載的話,會有一個warning說不認識這個版本,使用默認版本雲雲,忽略這個warning就是。
在下一步中指定項目名,SDK果斷選擇最新的1.8(Java8):
這樣一來你的服務器的運行環境得部署為Java8,不過這個也沒啥壓力,Java8多了不少很有用的新特性,如果沒有什么歷史負擔的話干嘛不用?
Finish,我們現在來看看整個project的結構:
.idea這是IntelliJ的相關東西,我們不用管,src目錄用於放java源文件,web目錄用於放web資源,WEB-INF是java web應用固定的存放配置及類庫的目錄,index.jsp是我們首頁,HelloWorld.iml是IntelliJ的項目文件,打開工程就是打開它了,External Library是一些外部引用的庫,展開看看好多。
現在我們來創建一個Servlet,Servlet是Java的服務器端小程序(其實也可以不小),右擊src目錄:
然后命名為SayHello:
展開,打開SayHello.java的時候卻發現IntelliJ提示找不到符號:
這一定是因為某些包沒引用。如何引用?一般都是設置CLASSPATH,告訴java如何去找它的包,而這里我們可以直接指定包的位置。
打開Project Struture設置對話框(快捷鍵為<Cmd>+<;>),如圖:
點加號,選“Jars or directories…”,再找到Tomcat下的servlet-api.jar。
這樣就可以了,我們把doPost刪掉,用不到,再在doGet方法中寫點東西輸出,SayHello.java就變成這樣:
package com.mycompany; import java.io.IOException; import java.io.PrintWriter; /** * Created by guogangj on 14-5-13. */ public class SayHello extends javax.servlet.http.HttpServlet { protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } }
java的代碼寫好了,配置文件也要加點東西,打開web.xml,加上一個“<servlet-mapping>”節點,改完后的web.xml變成這樣:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>SayHello</servlet-name> <servlet-class>com.mycompany.SayHello</servlet-class> </servlet> <servlet-mapping> <servlet-name>SayHello</servlet-name> <url-pattern>/sayhello</url-pattern> </servlet-mapping> </web-app>
編譯(<Cmd>+<F9>),通過無壓力。但,怎么運行?
運行Java Web項目
Java Web項目無法單獨運行,它需要一個程序來承載(Host)它,這和微軟體系的東西是很類似的,ASP.net程序需要IIS來承載對不?而現在我們很明顯需要用Tomcat來承載這個Web程序。
首先我們要配置好Tomcat,<Cmd>+<,>打開IntelliJ的配置。
如上圖那樣配置好Tomcat。
然后打開Project的運行配置:
繼續看圖:
再看圖,如此般設置:
這里它提示你有個問題,說缺乏artifacts配置,你可以順着它的指引,fix一下即可。點OK。
這次可以跑了,<Shift>+<F10>。注意看IntelliJ的輸出窗口里有什么提示信息,如果有,想想看是什么原因,我常常會碰到一些端口無法打開的問題,一般都是端口被占用了。
IntelliJ運行Java Web程序的時候會開啟新的Tomcat實例,很可能會和之前運行的Tomcat實例發生沖突,解決沖突的最快的辦法通常是直接把之前運行的Tomcat shutdown掉。
現在看看運行的成果吧:http://localhost:8080/sayhello
是不是看到“Hello World!”?這是用Java代碼輸出的“頁面”,而不是靜態頁面。
打成war包
工程編譯后生成的內容在/work/HelloWorld/out/production/下,我們要對其中的內容進行打包的話,可以這樣:
$tar cvf HelloWorld.war /work/HelloWorld/out/production
IntelliJ當然也可以幫助你做這個動作,如圖:在工程配置中選擇artifact的類型,artifact不知道中文怎么翻譯好,在很多游戲中,它都被翻譯為“神器”,但這里可以簡單把它理解為Java的發布包。
這樣你就能在其中指定的Output directory中找到那個War包了,把War包直接丟到Tomcat的webapps目錄下,Tomcat會自動加載它。
希望本文對讀者起到拋磚引玉的作用。