java 如何遠(yuǎn)程控制tomcat啟動(dòng)關(guān)機(jī)
最近我在考慮如何遠(yuǎn)程控制tomcat的啟動(dòng)和關(guān)機(jī),最后是有友好的界面,能夠?qū)崿F(xiàn)一鍵式操作的,這樣會(huì)肯定是會(huì)很方便的,網(wǎng)上找了半天,沒(méi)找到,有說(shuō)使用sheel腳本的,有在tomcat服務(wù)器上面安裝個(gè)客戶端的,這些都不是我所需要的,后來(lái)不經(jīng)意在網(wǎng)上找到一篇文章稍微講述了下,但是他寫(xiě)的不完整,一些關(guān)鍵的地方?jīng)]提到,還有一些地方寫(xiě)錯(cuò)了,我重新整理了下,在這里分享給大家。
首先,我下載了一個(gè)嶄新的tomcat,我選擇的是7版本的。
解壓后的界面如下圖所示:
這里我們先來(lái)說(shuō)2個(gè)需要注意的問(wèn)題:
1. webapps下面有個(gè)文件夾叫**manager**,很多時(shí)候我們會(huì)把webapps下面的東西都刪了,然后再放我們的工程,其實(shí)這個(gè)文件夾是用來(lái)做tomcat管理的,我們要留著。
2. conf文件夾下面有個(gè)文件叫tomcat-users.xml,它是來(lái)做tomcat管理的用戶權(quán)限的
我們就是利用這兩塊內(nèi)容來(lái)實(shí)現(xiàn)對(duì)tomcat的遠(yuǎn)程控制的。
tomcat提供的manager項(xiàng)目提供了一些api,我們用到的有下面四個(gè):
1. http://localhost:9000/manager/text/list:可以得到此tomcat正在運(yùn)行的項(xiàng)目以及它們的狀態(tài)。
2. http://localhost:9000/manager/text/reload?path=/ROOT:重新部署一個(gè)項(xiàng)目ROOT項(xiàng)目
3. http://localhost:9000/manager/text/start?path=/ROOT:?jiǎn)?dòng)ROOT項(xiàng)目
4. http://localhost:9000/manager/text/stop?path=/ROOT:關(guān)閉ROOT項(xiàng)目
ROOT是我們控制的項(xiàng)目名稱,你可以根據(jù)你實(shí)際需要去改為你的項(xiàng)目名。
首先,我們通過(guò)http://localhost:9000/manager/text/list得到正在運(yùn)行的項(xiàng)目列表,得到的結(jié)果大概如下:
我們來(lái)分析下這段結(jié)果,第一行我們忽略,代表的是tomcat在運(yùn)行,下面有一些項(xiàng)目在正常運(yùn)行。
我們來(lái)項(xiàng)目看看下面這些,以/examples:running:0:examples為例子,它有三個(gè):號(hào),第一個(gè):前的內(nèi)容我們忽略,running為正在運(yùn)行中(若為stopped則代表已經(jīng)停止),0代表狀態(tài)為正常(其他為異常)。
分析好我們就可以用java代碼來(lái)操作這些了。
具體代碼如下:
package com.baibin.utils; import sun.misc.BASE64Encoder; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; public class TomcatHTMLUtil { public static String message(String operateURL) { StringBuffer dataResult = new StringBuffer(); URL url = null; try { url = new URL(operateURL); URLConnection conn = (URLConnection) url.openConnection(); /** * 這里的用戶名和密碼是由tomcat的%tomcat_home%/conf/tomcat-users.xml里所配置的用戶 */ String username = "tomcat"; String password = "tomcat"; String configuration = username + ":" + password; // manager角色的用戶 String encodedPassword = new BASE64Encoder().encode(configuration.getBytes()); conn.setRequestProperty("Authorization", "Basic " + encodedPassword); InputStream is = conn.getInputStream(); BufferedReader bufreader = new BufferedReader(new InputStreamReader(is)); String line = null; while ((line = bufreader.readLine()) != null) { dataResult.append(line); } } catch (Exception e) { e.printStackTrace(); } return dataResult.toString(); } /** * 獲取tomcat正在運(yùn)行的webApp的參數(shù) * * @return */ public List<WebApp> getTomcatWebAppData() { List<WebApp> webAppArrayList = new ArrayList<WebApp>(); String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/list"); String[] oldDataStrs = data.split("/"); if (oldDataStrs[0].startsWith("OK")) { for (int i = 1; i < oldDataStrs.length; i++) { String[] names = oldDataStrs[i].split(":");//長(zhǎng)度為4 0 :忽略 1:狀態(tài) 2:0 狀態(tài) 3:名稱 WebApp webApp = new WebApp(); webApp.setName(names[3]); if (names[1].equals("running")) { if (oldDataStrs[i].split(":")[2].equals("0")) { webApp.setStatus("運(yùn)行"); } else { webApp.setStatus("異常"); } } else if (names[1].equals("stopped")) { if (oldDataStrs[i].split(":")[2].equals("0")) { webApp.setStatus("停止"); } else { webApp.setStatus("異常"); } } else { webApp.setStatus("異常"); } webAppArrayList.add(webApp); } //} } return webAppArrayList; } /** * 重新部署一個(gè)項(xiàng)目 * * @param webAppName * @return */ public boolean reloadWebApp(String webAppName) { String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/reload?path=/" + webAppName); if (data.startsWith("OK")) { return true; } else { return false; } } /** * 停止一個(gè)項(xiàng)目 * * @param webAppName * @return */ public boolean stopWebApp(String webAppName) { String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/stop?path=/" + webAppName); if (data.startsWith("OK")) { return true; } else { return false; } } /** * 開(kāi)始一個(gè)項(xiàng)目 * * @param webAppName * @return */ public boolean startWebApp(String webAppName) { String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/start?path=/" + webAppName); if (data.startsWith("OK")) { return true; } else { return false; } } } package com.baibin.utils; /** * Created by ibm on 2017/3/22. */ public class WebApp { /** * 項(xiàng)目名稱 */ private String name; /** * 運(yùn)行狀態(tài) "成功" or "停止" */ private String status; @Override public String toString() { return "WebApp{" + "name='" + name + '\'' + ", status='" + status + '\'' + '}'; } public String getName() { return name; } public String getStatus() { return status; } public void setName(String name) { this.name = name; } public void setStatus(String status) { this.status = status; } }
調(diào)用方式如下:
<body> <% TomcatHTMLUtil util = new TomcatHTMLUtil(); /*啟動(dòng)ROOT項(xiàng)目*/ util.startWebApp("ROOT"); /*關(guān)閉ROOT項(xiàng)目*/ util.stopWebApp("ROOT"); %> </body>
這樣就可以遠(yuǎn)程控制了,前臺(tái)寫(xiě)的比較簡(jiǎn)單,還可以繼續(xù)優(yōu)化,當(dāng)然那不是重點(diǎn),這里就不寫(xiě)了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
spring data jpa @Query注解中delete語(yǔ)句報(bào)錯(cuò)的解決
這篇文章主要介紹了spring data jpa @Query注解中delete語(yǔ)句報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12SpringBoot如何優(yōu)雅的整合Swagger Api自動(dòng)生成文檔
在多人協(xié)作的開(kāi)發(fā)過(guò)程中,API文檔不僅可以減少等待,也能保證開(kāi)發(fā)的持續(xù)進(jìn)行,這篇文章主要給大家介紹了關(guān)于SpringBoot如何優(yōu)雅的整合Swagger Api自動(dòng)生成文檔的相關(guān)資料,需要的朋友可以參考下2021-07-07在Linux上搭建一個(gè)Java部署環(huán)境的詳細(xì)步驟
這篇文章主要介紹了在Linux上搭建一個(gè)Java部署環(huán)境,安裝jdk有很多種方式,但是我們這里推薦的是使用yum直接安裝openjdk,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01使用synchronized關(guān)鍵字實(shí)現(xiàn)信號(hào)量的方法
在Java中,信號(hào)量(Semaphore)是一種常用的同步工具,它可以用來(lái)控制對(duì)共享資源的訪問(wèn)數(shù)量,下面,我們將使用Synchronized關(guān)鍵字來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的信號(hào)量,我們的目標(biāo)是實(shí)現(xiàn)一個(gè)計(jì)數(shù)信號(hào)量,其中信號(hào)量的計(jì)數(shù)指示可以同時(shí)訪問(wèn)某一資源的線程數(shù),需要的朋友可以參考下2024-04-04form-data與x-www-form-urlencoded的區(qū)別以及知識(shí)延伸
這篇文章主要給大家介紹了關(guān)于form-data與x-www-form-urlencoded的區(qū)別以及知識(shí)延伸,form-data和x-www-form-urlencoded都是HTTP請(qǐng)求中用于傳輸表單數(shù)據(jù)的編碼格式,需要的朋友可以參考下2023-11-11SpringBoot參數(shù)驗(yàn)證的幾種方式小結(jié)
在日常的接口開(kāi)發(fā)中,為了防止非法參數(shù)對(duì)業(yè)務(wù)造成影響,經(jīng)常需要對(duì)接口的參數(shù)進(jìn)行校驗(yàn),例如登錄的時(shí)候需要校驗(yàn)用戶名和密碼是否為空,所以本文介紹了SpringBoot參數(shù)驗(yàn)證的幾種方式,需要的朋友可以參考下2024-07-07Java中調(diào)用第三方接口的幾種方法詳細(xì)指南
在Java開(kāi)發(fā)中調(diào)用第三方接口是常見(jiàn)需求,本文介紹如何使用Java進(jìn)行接口調(diào)用,重點(diǎn)講解HttpURLConnection類、OkHttp庫(kù)和ApacheHttpClient的使用,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10