Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产三级小视频,日韩精品久久久毛片一区二区,日韩免费小视频

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          「AWEI」Tomcat部署java Web項目的常用方法!

          omcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發(fā)而成。由于有了Sun 的參與和支持,最新的Servlet 和JSP 規(guī)范總是能在Tomcat 中得到體現(xiàn),Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規(guī)范。因為Tomcat 技術(shù)先進、性能穩(wěn)定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發(fā)商的認可,成為目前比較流行的Web 應(yīng)用服務(wù)器。

          Tomcat 服務(wù)器是一個免費的開放源代碼的Web 應(yīng)用服務(wù)器,屬于輕量級應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選。對于一個初學(xué)者來說,可以這樣認為,當在一臺機器上配置好Apache 服務(wù)器,可利用它響應(yīng)HTML(標準通用標記語言下的一個應(yīng)用)頁面的訪問請求。實際上Tomcat 部分是Apache 服務(wù)器的擴展,但它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的。

          訣竅是,當配置正確時,Apache 為HTML頁面服務(wù),而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務(wù)器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態(tài)HTML的能力不如Apache服務(wù)器。目前Tomcat最新版本為9.0。

          官網(wǎng)下載:https://www.apache.org/







          因為下載的是解壓版本,解壓到相應(yīng)的位置即可;



          • TOMCAT的目錄結(jié)構(gòu)

          o/bin:存放windows或Linux平臺上啟動和關(guān)閉Tomcat的腳本文件

          o/conf:存放Tomcat服務(wù)器的各種全局配置文件,其中最重要的是server.xml和web.xml

          o/doc:存放Tomcat文檔

          o/server:包含三個子目錄:classes、lib和webapps

          o/server/lib:存放Tomcat服務(wù)器所需的各種JAR文件

          o/server/webapps:存放Tomcat自帶的兩個WEB應(yīng)用admin應(yīng)用和 manager應(yīng)用

          o/common/lib:存放Tomcat服務(wù)器以及所有web應(yīng)用都可以訪問的jar文件

          o/shared/lib:存放所有web應(yīng)用都可以訪問的jar文件(但是不能被Tomcat服務(wù)器訪問)

          o/logs:存放Tomcat執(zhí)行時的日志文件

          o/src:存放Tomcat的源代碼

          o/webapps:Tomcat的主要Web發(fā)布目錄,默認情況下把Web應(yīng)用文件放于此目錄

          o/work:存放JSP編譯后產(chǎn)生的class文件

          • WEB應(yīng)用的目錄結(jié)構(gòu):假設(shè)在webapps下有miximsweb應(yīng)用

          • /mixims:Web應(yīng)用的根目錄,所有的jsp文件和html文件都在此目錄下

          • /mixims/WEB_INF:存放該web應(yīng)用發(fā)布時的描述文件web.xml

          • /mixims/WEB_INF/class:存放各種class文件,Servlet文件也存放于此目錄下

          • /mixims/WEB_INF/lib:存放各鐘Web應(yīng)用所需要的jar文件。比如可以存放JDBC驅(qū)動程序的JAR文件

          筆者帶你創(chuàng)建自己的第一個web項目吧!

          第一步 打開Eclipse



          設(shè)置運行環(huán)境









          創(chuàng)建動態(tài)Web項目





          為項目創(chuàng)建一個測試主頁:





          添加tomcat服務(wù)





          啟動服務(wù);



          使用內(nèi)置瀏覽器打開項目:





          至此,簡單的Web項目就建立完成了,接下帶你去簡單部署剛才制作的Web項目!

          創(chuàng)建部署WEB項目

          • 第一種WAR包方式:









          開啟tomcat服務(wù)



          本地瀏覽器輸入http://localhost:8080/AWEI/ 測試Web項目



          此時,tomcat 的webapps文件夾內(nèi)如下:



          找到web項目的根目錄將其復(fù)制到tomcat的webapps文件夾下:如圖



          并將根目錄名稱改為項目名稱



          本地瀏覽器輸入http://localhost:8080/mixims/ 測試Web項目



          請點擊此處輸圖片描述

          至此,兩種部署web項目方法已結(jié)束。

          本號所有文章都經(jīng)筆者親自測驗后整理成稿,期間耗費了很多精力,如果有朋友想收錄自己的博客中請聯(lián)系筆者「壘碼大叔」;

          初入IT世界的小白,歡迎大神留言交流,你的互動,是我成長的動力;

          如果覺得分享內(nèi)容還不錯,就推薦到你的朋友圈吧,讓更多人一起交流和分享;

          用IntelliJ IDEA配置Tomcat服務(wù)啟動

          一、前言

          • 1.首先你本機得有JDK環(huán)境,下載JDK地址,配置好本機環(huán)境變量http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
          • 2.下載相應(yīng)的idea版本,下載地址 https://www.jetbrains.com/idea/,網(wǎng)上找個序列號激活一下就好
          • 3.下載符合自己系統(tǒng)環(huán)境的tomcat版本

          tomcat官網(wǎng)下載

          二、在IntelliJ IDEA配置Tomcat

          1.點擊Run-Edit Configurations...

          idea 配置tomcat

          2.選擇左側(cè)“+”,選擇Tomcat Server--Local

          idea -->tomcat -->local

          3.在Tomcat Server -> Unnamed -> Server -> Application server項目下,點擊 Configuration ,找到本地 Tomcat 服務(wù)器,再點擊 OK按鈕

          4.至此,IntelliJ IDEA配置Tomcat完成。

          啟動Tomcat后,打開瀏覽器,鍵入 http://localhost:8080

          tomcat 原始啟動頁面

          startup.sh入手

          os400=false
          case "`uname`" in
          OS400*) os400=true;;
          esac
          
          PRG="$0"
          
          while [ -h "$PRG" ] ; do
            ls=`ls -ld "$PRG"`
            link=`expr "$ls" : '.*-> \(.*\)$'`
            if expr "$link" : '/.*' > /dev/null; then
              PRG="$link"
            else
              PRG=`dirname "$PRG"`/"$link"
            fi
          done
          
          PRGDIR=`dirname "$PRG"`
          EXECUTABLE=catalina.sh
          
          
          if $os400; then
            eval
          else
            if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
              echo "Cannot find $PRGDIR/$EXECUTABLE"
              echo "The file is absent or does not have execute permission"
              echo "This file is needed to run this program"
              exit 1
            fi
          fi
          
          exec "$PRGDIR"/"$EXECUTABLE" start "$@" 

          整個腳本核心就是最后一句代碼, EXECUTABLE變量是catalina.sh, 代表執(zhí)行catalina.sh, 參數(shù)是start, 再去對比了shutdown.sh, 兩個腳本的核心都是調(diào)用catalina.sh傳遞的變量不同。

          瀏覽catalina.sh腳本

          整個腳本很長,我這里之截圖了我們關(guān)心的腳本內(nèi)容。 這段代碼里, 除了能看到參數(shù)傳遞start, 最后會輸出Tomcat started外,能看到調(diào)用了org.apache.catalina.startup.Bootstrap, 也就是說找到我們的程序入口,或者說找到了我們的程序的main函數(shù)。

              shift
              eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
                -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
                -classpath "\"$CLASSPATH\"" \
                -Djava.security.manager \
                -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
                -Dcatalina.base="\"$CATALINA_BASE\"" \
                -Dcatalina.home="\"$CATALINA_HOME\"" \
                -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
                org.apache.catalina.startup.Bootstrap "$@" start \
                >> "$CATALINA_OUT" 2>&1 "&"
          
            else
              eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
                -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
                -classpath "\"$CLASSPATH\"" \
                -Dcatalina.base="\"$CATALINA_BASE\"" \
                -Dcatalina.home="\"$CATALINA_HOME\"" \
                -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
                org.apache.catalina.startup.Bootstrap "$@" start \
                >> "$CATALINA_OUT" 2>&1 "&"
          
            fi
          
            if [ ! -z "$CATALINA_PID" ]; then
              echo $! > "$CATALINA_PID"
            fi
          
            echo "Tomcat started."

          看到這里我們做個小小的總結(jié):Tomcat本質(zhì)上也是一個java程序,因此startup.sh會啟動一個jvm來運行tomcat的啟動類Bootstrap.java。

          Bootstrap類核心功能

          • 靜態(tài)構(gòu)造器部分, 主要初始化了CATALINA_HOME和CATALINA_BASE兩個變量內(nèi)容
          • main函數(shù)方法部分一,創(chuàng)建和初始化daemon, 創(chuàng)建三個類加載器
          • main函數(shù)方法部分二,控制tomcat的啟動和停止

          從Bootstrap.main方法開始

          開始main方法之前,首先看兩個關(guān)鍵屬性.

          /*************
          守護進程對象
          **********/
          private static volatile Bootstrap daemon = null;
          
          /***
          守護程序用的catalina對象
          ***/
          private Object catalinaDaemon = null;

          Bootstrap#main

           public static void main(String args[]) {
          	synchronized (daemonLock) {
          		if (daemon == null) {
          			//初始化完成之前,不要對daemon賦值
          			Bootstrap bootstrap = new Bootstrap();
          			try {
          			    //調(diào)用初始化方法, 完成加載器的配置和初始化器的準備
          				bootstrap.init();
          			} catch (Throwable t) {
          				handleThrowable(t);
          				t.printStackTrace();
          				return;
          			}
          			daemon = bootstrap;
          		} else {
          			//當作為服務(wù)正在運行時,如果調(diào)用停止方法,這將在一個新線程上進行,以確保使用正確的類加載器,防止出現(xiàn)未找到類的異常
          			Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);
          		}
          	}
          
          	String command = "start";
          	if (args.length > 0) {
          		command = args[args.length - 1];
          	}
          
          	if (command.equals("startd")) {
          		args[args.length - 1] = "start";
          		daemon.load(args);
          		daemon.start();
          	} else if (command.equals("stopd")) {
          		args[args.length - 1] = "stop";
          		daemon.stop();
          	} else if (command.equals("start")) {
          		daemon.setAwait(true);
                  //Bootstrap加載
          		daemon.load(args);
                  //Bootstrap啟動
          		daemon.start();
          		if (null == daemon.getServer()) {
          			System.exit(1);
          		}
          	} else if (command.equals("stop")) {
          		daemon.stopServer(args);
          	} else if (command.equals("configtest")) {
          		daemon.load(args);
          		if (null == daemon.getServer()) {
          			System.exit(1);
          		}
          		System.exit(0);
          	} else {
          		
          	}      
          }
          //Bootstrap.init
          public void init() throws Exception {
              //初始化類的三個加載器
          	initClassLoaders();
          	//設(shè)置線程類加載器, 將容器的加載器傳入
          	Thread.currentThread().setContextClassLoader(catalinaLoader);
          	//加載安全類加載器
          	SecurityClassLoad.securityClassLoad(catalinaLoader);
          	//通過反射加載catalina
          	Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
          	//創(chuàng)建對象
          	Object startupInstance = startupClass.getConstructor().newInstance();
          
          	String methodName = "setParentClassLoader";
          	Class<?> paramTypes[] = new Class[1];
          	//將類加載器作為參數(shù)傳遞
          	paramTypes[0] = Class.forName("java.lang.ClassLoader");
          	Object paramValues[] = new Object[1];
          	paramValues[0] = sharedLoader; //共享加載器
          	Method method = startupInstance.getClass().getMethod(methodName, paramTypes); //對類加載器進行初始化賦值
          	//調(diào)用catalina類內(nèi)部的setParentClassLoader方法對catalina類內(nèi)部的類加載賦值
          	method.invoke(startupInstance, paramValues);
          	//將創(chuàng)建好的startupInstance對象賦值給catalinaDaemon
          	catalinaDaemon = startupInstance;
          }

          Catalina#load

          Catalina類的load方法核心就解析config/server.xml并創(chuàng)建Server組件實例, 也就是我們在tomcat整體架構(gòu)章節(jié)里了解的一個tomcat只有一個Server實例。 這部分代碼塊,我刪掉了注釋代碼,try...catch, 只留下了核心業(yè)務(wù)代碼。

          public void load() {
          	loaded = true;
          	long t1 = System.nanoTime();
          	initDirs();
          	initNaming();
              //利用digester類解析server.xml,得到容器的配置
          	Digester digester = createStartDigester();
          
          	InputSource inputSource = null;
          	InputStream inputStream = null;
          	File file = null;
          	
          	file = configFile();
          	inputStream = new FileInputStream(file);
          	inputSource = new InputSource(file.toURI().toURL().toString());
          	
          	if (inputStream == null) {
          		inputStream = getClass().getClassLoader().getResourceAsStream(getConfigFile());
          		inputSource = new InputSource(getClass().getClassLoader().getResource(getConfigFile()).toString());	
          	}
          
          	if (inputStream == null) {
          		inputStream = getClass().getClassLoader().getResourceAsStream("server-embed.xml");
          		inputSource = new InputSource(getClass().getClassLoader().getResource("server-embed.xml").toString());
          	}
          
          	if (inputStream == null || inputSource == null) {
          		return;
          	}
          
          	try {
          		inputSource.setByteStream(inputStream);
          		digester.push(this);
          		digester.parse(inputSource);
          	} catch (SAXParseException spe) {
          		return;
          	} catch (Exception e) {
          		return;
          	}
          	
          	getServer().setCatalina(this);
          	getServer().setCatalinaHome(Bootstrap.getCatalinaHomeFile());
          	getServer().setCatalinaBase(Bootstrap.getCatalinaBaseFile());
          
          	initStreams();
              //服務(wù)器執(zhí)行初始化 開始調(diào)用的Server的初始化方法注意Server是一個接口
          	getServer().init();
          }

          Catalina#start

          public void start() {
          	if (getServer() == null) {
          		load();
          	}
          
          	if (getServer() == null) {
          		return;
          	}
          
          	long t1 = System.nanoTime();
          
          	//開始一個Server實例
          	try {
          		getServer().start();
          	} catch (LifecycleException e) {
          		log.fatal(sm.getString("catalina.serverStartFail"), e);
          		try {
          			getServer().destroy();
          		} catch (LifecycleException e1) {
          			log.debug("destroy() failed for failed Server ", e1);
          		}
          		return;
          	}
          
          	long t2 = System.nanoTime();
          	if(log.isInfoEnabled()) {
          		log.info("Server startup in " + ((t2 - t1) / 1000000) + " ms");
          	}
          
          	if (useShutdownHook) {
          		if (shutdownHook == null) {
          			shutdownHook = new CatalinaShutdownHook();
          		}
          		Runtime.getRuntime().addShutdownHook(shutdownHook);
          
          		LogManager logManager = LogManager.getLogManager();
          		if (logManager instanceof ClassLoaderLogManager) {
          			((ClassLoaderLogManager) logManager).setUseShutdownHook(false);
          		}
          	}
          
          	if (await) {
          		await();
          		stop();
          	}
          }

          從Bootstrap#createStartDigester方法中可以看到Server接口的實現(xiàn)類是StandardServer.

          digester.addObjectCreate("Server","org.apache.catalina.core.StandardServer","className");

          Server接口繼承了Lifecycle接口

          StandardServer類繼承了抽象類LifecycleMBeanBase,同時實現(xiàn)了Server接口

          LifecycleMBeanBase抽象類又繼承了抽象類LifecycleBase, 而LifecycleBase抽象類又實現(xiàn)了Lifecycle接口

          通過前面的調(diào)用鏈看出來Catalina.start會調(diào)用Server接口的start方法,而StandardServer實現(xiàn)類的start方法就追溯到了LifeCycleBase抽象的start方法, 這個類里定義了抽象方法startInternal讓子類去實現(xiàn)。 在start方法中也調(diào)用了startInternal方法。

          StandardServer類圖

          StandardServer#startInternal

          protected void startInternal() throws LifecycleException {
          	fireLifecycleEvent(CONFIGURE_START_EVENT, null);
          	setState(LifecycleState.STARTING);
          
          	globalNamingResources.start();
          
          	synchronized (servicesLock) {
          	    //這里啟動定義的多個service
          		for (Service service : services) {
          			service.start();
          		}
          	}
          }

          根據(jù)Server的實現(xiàn)類StandardServer類,我順便查看了其所在包, 看到了整個tomcat用到的核心組件的實現(xiàn)類都在這里了,比如StandardEngine, StandardService,StandardHost, 可以查看其他的實現(xiàn)類結(jié)構(gòu)。

          總結(jié)

          結(jié)合上面的兩張圖片,以及上述的源碼分析,我們就能總結(jié)出來整個startup.sh過程中完成的任務(wù)

          1. Tomcat本質(zhì)上是一個java程序,因此startup腳本會啟動一個jvm來運行tomcat的啟動類Bootstrap.
          2. Bootstrap的主要任務(wù)就是初始化tomcat的類加載器,并且創(chuàng)建Catalina.
          3. Catalina是一個啟動類,通過解析Server.xml創(chuàng)建相應(yīng)組件,通過調(diào)用Server接口實現(xiàn)類去啟動Server.
          4. StandardServer通過調(diào)用父類LifecycleBase的start方法,并且重寫startInternal方法來啟動Server和啟動Service.
          5. Service組件的職責就是管理連接器和頂層容器,他會調(diào)用連接器和頂層容器的start方法.
          6. 容器組件負責啟動管理子容器,并且調(diào)用Host的start方法, 將各層容器啟動起來。

          參考資料

          https://juejin.cn/post/7155750621864263716

          https://2i3i.com/tomcat-code-3.html

          https://juejin.cn/post/7082681444182523934

          https://time.geekbang.org/column/article/97603

          https://zhuanlan.zhihu.com/p/344635709


          主站蜘蛛池模板: 亚洲日本一区二区一本一道 | 69久久精品无码一区二区| 无码人妻一区二区三区在线水卜樱 | 国产精久久一区二区三区| 亚洲成AV人片一区二区| 国产丝袜无码一区二区视频| 末成年女A∨片一区二区| 中文字幕不卡一区| 国产精品免费一区二区三区| 精品国产免费观看一区| 亚洲一区无码中文字幕乱码| 国产丝袜视频一区二区三区| 一区二区三区高清视频在线观看| 无码人妻av一区二区三区蜜臀| 国产精品久久一区二区三区| 精品国产鲁一鲁一区二区| 国产丝袜视频一区二区三区| 久久se精品一区二区| 伊人久久精品无码av一区| 色老板在线视频一区二区| 国产福利一区二区在线视频| 精品国产一区二区三区久久蜜臀| 国产在线一区二区三区av| 国产一区二区三区露脸| 夜夜精品无码一区二区三区| 免费在线视频一区| 一区二区三区视频观看| 中文字幕一区日韩在线视频| 久草新视频一区二区三区| 久久亚洲AV午夜福利精品一区| 国产成人无码一区二区三区 | 中文无码一区二区不卡αv| 亚洲国产一区在线观看| 亚洲av无码片vr一区二区三区| 日韩一区二区a片免费观看| 日韩精品一区二区三区老鸦窝| 国产a久久精品一区二区三区| 亚洲高清偷拍一区二区三区| 亲子乱AV视频一区二区| 久久综合亚洲色一区二区三区| 国产精品福利一区二区|