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會自動加載它。