標籤:

開發人員學Linux(3):CentOS7中安裝JDK8和Tomcat8

題外話:本系列不是為Linux運維人員準備的,而是主要為開發人員準備的,包括但不限於:

希望了解Linux的開發人員;

需要在Linux上部署一些組件的開發人員,如Memcached/Nginx/Redis等;

需要使用一些在Linux上部署運行效果可能會更好的效果的系統,如Jetkins、SVN、JavaMelody等。

希望了解一些當前較熱的技術,想在虛擬機里搭建個環境把玩一番的,如.Net Core/Hadoop等。

因此在本系列文章中不會去講Linux及各個分支的歷史,也不會去講Linux與Windows相比的優缺點,更不會講Linux Shell如何編程,涉及到這些知識也會較快帶過,本系列文章主要是講如何在虛擬機快速搭建起一個可運行和觀察效果的環境。

1.前言

書接前兩回,前面已經講了如何安裝配置免費開源的虛擬機軟體VirtualBox以及如何在VirtualBox中安裝並配置CentOS7。在本篇將講述如何在CentOS7中安裝JDK和Tomcat,為今後的需要,本篇將介紹如何安裝Oracle JDK8和Tomcat8。

2.軟體準備

本篇採用tar.gz安裝,當然也可以採用rpm方式安裝或yum方式安裝,至於後兩種安裝方式感興趣的請自行查閱相關文章。

JDK文件:jdk-8u131-linux-x64.tar.gz

官方下載地址:oracle.com/technetwork/

Tomcat文件:apache-tomcat-8.5.15.tar.gz

官方下載地址:mirror.bit.edu.cn/apach

或:oracle.com/technetwork/

注意:因為在前兩篇文章中都是以CentOS7 x64來介紹的,所以這裡下載的壓縮包也都是x64的。

3.安裝Oracle JDK

3.1卸載OpenJDK

採用前面的方式安裝CentOS7時,默認安裝了OpenJDK1.8的,OpenJDK其實就是也是在Java規範上的另一種實現,就如同Mono也是按照微軟的.NET規範實現的一樣,在一個平台上編譯後的文件可以直接在另一個平台上運行,反正幾年前我就干過在Windows上用Microsoft Visual Studio編寫ASP.NET程序然後放在Linux系統上藉助Apache+Mono+xsp運行。

因為後面還有更多內容依賴於Java,所以這裡就卸載OpenJDK而安裝Oracle JDK了。

檢查當前系統是否安裝JDK,運行命令:

rpm -qa | grep jdk

得到結果如下:

java-1.8.0-openjdk-headless-1.8.0.131-2.b11.el7_3.x86_64

java-1.8.0-openjdk-1.8.0.131-2.b11.el7_3.x86_64

copy-jdk-configs-1.2-1.el7.noarch

卸載OpenJDK,運行命令:

yum remove java-1.8.0-openjdk-1.8.0.131-2.b11.el7_3.x86_64

yum remove java-1.8.0-openjdk-headless-1.8.0.131-2.b11.el7_3.x86_64

此時如果再運行rpm -qa | grep jdk就會看到java-1.8.0-openjdk-1.8.0.131-2.b11.el7_3.x86_64被卸載了。

3.2安裝Oracle JDK

按照本文提供的地址將jdk-8u131-linux-x64.tar.gz下載到宿主機,然後藉助SSH客戶端軟體SSHSecureShellClient上傳到/root目錄。

解壓文件到/usr/local目錄:

cd /root

tar –zxf /root/jdk-8u131-linux-x64.tar.gz –C /usr/local

解壓後會在/usr/local目錄下多出一個jdk1.8.0_131文件夾來。

注意:/usr/local/ jdk1.8.0_131這個目錄在設置JDK環境變數時會用到。

下面就需要配置環境變數了,告訴系統Java的相關信息,如安裝路徑、類庫路徑等。這裡有兩種配置方式:一種是為指定用戶配置,一種是為所有用戶配置,如果只為某個用戶配置那麼只需在該用戶目錄下的.bashrc文件中設置即可,如果需要給所有用戶設置,那麼就需要在/etc/profile中設置,這裡以全局設置為例,打開/etc/profile文件在最後添加如下內容:

export JAVA_HOME=/usr/local/jdk1.8.0_131

export JRE_HOME=/usr/local/jdk1.8.0_131

export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

然後使配置生效,執行如下命令:

source /etc/profile

現在可以檢查Java環境變數是否配置正確了,通過java –version命令,在本人機器上得到如下輸出:

[root@localhost ~]# java -version

java version "1.8.0_131"

Java(TM) SE Runtime Environment (build 1.8.0_131-b11)

Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

至此,Oracle JDK已正確安裝。

4.安裝Tomcat8

按照本文提供的地址將apache-tomcat-8.5.15.tar.gz下載至本地宿主機(註:也可在能訪問互聯網的虛擬機上直接用wget下載到虛擬機上),然後藉助SSH客戶端軟體SSHSecureShellClient上傳到/root目錄。

解壓文件到/usr/local目錄:

tar –zxf /root/apache-tomcat-8.5.15.tar.gz –C /usr/local

解壓後會在usr/local目錄下多出一個apache-tomcat-8.5.15文件夾來。

注意:/usr/local/ apache-tomcat-8.5.15這個目錄在設置Tomcat環境變數時會用到。當然,也可以不設置Tomcat相關的環境變數,使用相關腳本對Tomcat進行操作時會自動檢測這些環境變數。

至此,Tomcat已經安裝完成。

通過如下命令啟動Tomcat:

/usr/local/ apache-tomcat-8.5.15/bin/startup.sh

如果要關閉Tomcat也很簡單,執行如下命令:

/usr/local/ apache-tomcat-8.5.15/bin/stop.sh

注意:使用/usr/local/apache-tomcat-8.5.15/bin/catalina.sh加上參數也可以啟動或者停止Tomcat,如 /usr/local/ apache-tomcat-8.5.15/bin/catalina.sh start來啟動Tomcat,/usr/local/ apache-tomcat-8.5.15/bin/catalina.sh stop來停止Tomcat,除此之外還可以使用debug/run/configtest/version參數,不過沒有restart參數來重啟Tomcat。

可以在虛擬機打開http://localhost:8080觀看那個屬性的Tomcat起始頁了,在宿主機中則要以虛擬機的IP地址來訪問了(前提是虛擬機至少有一個網卡是橋接模式),在本人機器上虛擬機有個網卡是橋接的,IP地址為:192.168.60.198,與宿主機在一個網段,因此可以以192.168.60.198:8080來查看了,如下圖所示:

注意:如果可以通過ssh連接虛擬機但不能打開192.168.60.198:8080,那麼很有可能是防火牆問題,執行如下命令關閉防火牆:

systemctl disable firewalld

重啟後即可訪問。

5.在CentOS7為Tomcat添加服務(使用systemd來操作Tomcat)

為了能讓Tomcat能夠隨CentOS7啟動,其實就是能夠通過systemctl start/stop/restart來控制Tomcat。在網上有不少在CentOS7以前版本中的例子,都是通過在/etc/rc.d/init.d或/etc/init.d目錄中添加腳本來實現的,在CentOS7中提供了另外一種方式,使用systemd來替代了service,具體就是在/usr/lib/systemd/system或/etc/systemd/system/目錄添加控制命令,Systemd約定,服務的Unit文件需放置在 /etc/systemd/system 或 /usr/lib/systemd/system 目錄中,通常將其放在/etc/systemd/system目錄中。

5.1Systemctl用法

在CentOS7中有關係統服務的命令有:

systemctl list-units(等同於systemctl):列出激活的服務

systemctl --failed:列出運行失敗的服務

systemctl daemon-reload:掃描新的或有變動的服務

systemctl status A.serivice:查看A這個服務的啟動信息(注意在運行時需要將A這個名稱改為具體的service的名字,下同,如SSH服務對應的sshd.service),這個命令在啟動服務失敗時查看原因非常有用

systemctl enable A.service:設置A這個service隨系統一起啟動

systemctl disable A.service:禁止A這個service隨系統一起啟動

systemctl start A.service:啟動A這個service

systemctl stop A.service:停止A這個service

systemctl restart A.service:重新啟動A這個service

注意:在實際操作中,上述命令中A.service可簡化為A,如systemctl enable A.service可簡化為systemctl enable A。

5.2給Tomcat增加啟動參數

前面的講述了如何安裝Oracle JDK8和Tomcat8.5,並展示了使用Tomcat安裝位置下的bin目錄中的startup.sh/stop.sh或catalina.sh start/catalina.sh stop來啟動或者關閉Tomcat。但在實際開發中我們還是希望Tomcat能夠在系統啟動的時候自動啟動,而不是手工通過命令行來啟動,下面就講述如何將Tomcat添加到CentOS7的啟動服務中。

首先我們記住以下三點:

1.Oracle JDK8安裝目錄:/usr/local/jdk1.8.0_131

2.Tomcat8安裝目錄:/usr/local/apache-tomcat-8.5.15

3.並且在/etc/profile中配置了Java相關的環境變數:

export JAVA_HOME=/usr/local/jdk1.8.0_131

export JRE_HOME=/usr/local/jdk1.8.0_131

export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

首先需要在Tomcat的安裝目錄下的bin目錄下增加setenv.sh文件,可以通過vim /usr/local/ apache-tomcat-8.5.15/bin/setenv.sh來創建文件,並將如下內容粘貼進去後保存:

#set JAVA_HOME and JRE_HOME and CATALINA_HOME and CATALINA_BASE

export JAVA_HOME=/usr/local/jdk1.8.0_131

export JRE_HOME=/usr/local/jdk1.8.0_131/jre

export CATALINA_HOME=/usr/local/apache-tomcat-8.5.15

export CATALINA_BASE=/usr/local/apache-tomcat-8.5.15

#set JAVA_HOME and JRE_HOME and CATALINA_HOME and CATALINA_BASE

#add tomcat pid

CATALINA_PID="$CATALINA_BASE/tomcat.pid"

#add Java opts

JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m"

也就是設置JAVA_HOME /JRE_HOME/CATALINA_HOME/CATALINA_BASE/CATALINA_PID五個環境變數。

注意:

1.剛剛建立的setenv.sh文件會在通過執行catalina.sh來啟動Tomcat時被自動調用。

2.因為在Linux中存在著互動式shell和非互動式shell,互動式shell顧名思義就是在與用戶的交互過程中執行的shell,通常是通過SSH登錄到Linux系統之後輸入shell腳本或命令等待用戶輸入或者確認然後執行的shell,而非互動式shell則是無需用戶干預的shell,如一些service的啟動等。互動式shell從/etc/profile中讀取所有用戶的環境變數設置,非互動式shell則從/etc/bashrc中讀取所有用戶的環境變數設置。因此可能會出現在互動式環境下執行shell腳本沒有問題,在非互動式環境下執行shell腳本則會出現找不到環境變數配置信息的問題。

3.另外因為配置了tomcat.pid文件,所以在啟動Tomcat時會在Tomcat根目錄自動生成tomcat.pid文件,停止Tomcat之後tomcat.pid文件會自動被刪除。使用tomcat.pid可以做到防止多次執行catalina.sh或startup.sh啟動Tomcat時會啟動多個實例的情形。

5.3創建tomcat.service文件

接著增加tomcat.service文件,可以通過vim /usr/lib/systemd/system/tomcat.service來創建文件並下以下內容粘貼進去,然後保存:

[Unit]

Description=Apache Tomcat 8.5.15

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

PIDFile=/usr/local/apache-tomcat-8.5.15/tomcat.pid

ExecStart=/usr/local/apache-tomcat-8.5.15/bin/startup.sh

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target

chmod 755 /usr/lib/systemd/system/tomcat.service

別忘了給這個文件增加執行許可權:

然後可以執行如下命令來檢驗是否配置正確:

systemctl enable tomcat.service:設置tomcat這個service隨系統一起啟動

systemctl disable tomcat.service:禁止tomcat這個service隨系統一起啟動

systemctl start tomcat.service:啟動tomcat這個service

systemctl stop tomcat.service:停止tomcat這個service

systemctl restart tomcat.service:重新啟動tomcat這個service

5.4service文件結構說明

上面講述的tomcat.service文件包含[unit]、[service]、[install]三部分,其中:

5.4.1[unit]

Unit部分描述服務的基本信息和啟動順序,在本實例中規定了在network啟動之後執行,unit部分可包含如下內容:

Description : 服務的簡單描述

Documentation : 服務文檔

Before、After:定義啟動順序。Before=xxx.service,代表本服務在xxx.service啟動之前啟動。After=xxx.service,代表本服務在xxx.service之後啟動。

Requires:這個單元啟動了,它需要的單元也會被啟動;它需要的單元被停止了,這個單元也停止了。

Wants:推薦使用。這個單元啟動了,它需要的單元也會被啟動;它需要的單元被停止了,對本單元沒有影響。

5.4.2[service]

在這部分我們配置tomcat服務的pid,服務的啟動,停止,重啟命令,service部分可包含如下內容:

Type=simple(默認值):systemd認為該服務將立即啟動。服務進程不會fork。如果該服務要啟動其他服務,不要使用此類型啟動,除非該服務是socket激活型。

Type=forking:systemd認為當該服務進程fork,且父進程退出後服務啟動成功。對於常規的守護進程(daemon),除非你確定此啟動方式無法滿足需求,使用此類型啟動即可。使用此啟動類型應同時指定 PIDFile=,以便systemd能夠跟蹤服務的主進程。

Type=oneshot:這一選項適用於只執行一項任務、隨後立即退出的服務。可能需要同時設置 RemainAfterExit=yes 使得 systemd 在服務進程退出之後仍然認為服務處於激活狀態。

Type=notify:與 Type=simple 相同,但約定服務會在就緒後向 systemd 發送一個信號。這一通知的實現由 libsystemd-daemon.so 提供。

Type=dbus:若以此方式啟動,當指定的 BusName 出現在DBus系統匯流排上時,systemd認為服務就緒。

Type=idle: systemd會等待所有任務(Jobs)處理完成後,才開始執行idle類型的單元。除此之外,其他行為和Type=simple 類似。

PIDFile:pid文件路徑

ExecStart:指定啟動單元的命令或者腳本,ExecStartPre和ExecStartPost節指定在ExecStart之前或者之後用戶自定義執行的腳本。Type=oneshot允許指定多個希望順序執行的用戶自定義命令。

ExecReload:指定單元重新載入時執行的命令或者腳本。

ExecStop:指定單元停止時執行的命令或者腳本。

PrivateTmp:True表示給服務分配獨立的臨時空間

Restart:這個選項如果被允許,服務重啟的時候進程會退出,會通過systemctl命令執行清除並重啟的操作。

RemainAfterExit:如果設置這個選擇為真,服務會被認為是在激活狀態,即使所以的進程已經退出,默認的值為假,這個選項只有在Type=oneshot時需要被配置。

5.4.3[install]

在這部分我們配置了tomcat運行時的使用用戶。在這部分可包含如下內容:

Alias:為單元提供一個空間分離的附加名字。

RequiredBy:單元被允許運行需要的一系列依賴單元,RequiredBy列表從Require獲得依賴信息。

WantBy:單元被允許運行需要的弱依賴性單元,Wantby從Want列表獲得依賴信息。

Also:指出和單元一起安裝或者被協助的單元。

DefaultInstance:實例單元的限制,這個選項指定如果單元被允許運行默認的實例。

6.總結

本篇講述了如何在CentOs7上安裝Oracle JDK和Tomcat,同時也對互動式shell和非互動式shell讀取環境變數的不同之處做了比較,互動式shell從/etc/profile中讀取所有用戶的環境變數設置,非互動式shell則從/etc/bashrc中讀取所有用戶的環境變數設置。最後還演示了如何將Tomcat配置成service,保持和系統一起啟動。


推薦閱讀:

如何說服後端技術人員放棄 SQL Server 轉向 MySQL?
2017 年 Linux 在桌面平台上有前景嗎?
systemd 是不是管的太多了?
什麼是 Linux 下最好的錄屏方法?

TAG:Linux | CentOS | JDK |