Quá trình khởi động Tomcat qua startup.bat

Giới thiệu

Thông thường để khởi động Tomcat, người dùng thường tìm đến tệp startup.bat (trên Windows) hoặc startup.sh (trên Linux) trong thư mục bin. Vì vậy, để nghiên cứu quá trình khởi động của Tomcat, không thể bỏ qua các tệp khởi động này. Bài viết dưới đây sẽ phân tích tệp startup.bat trên hệ điều hành Windows.

Tệp bat

Để hiểu rõ startup.bat, trước hết cần có kiến thức cơ bản về tệp bat.

Tệp bat là tệp xử lý hàng loạt (batch file) trong môi trường DOS. Tệp xử lý hàng loạt là tệp văn bản không định dạng, trong đó mỗi dòng là một lệnh DOS. Tệp này có phần mở rộng là .bat hoặc .cmd. Khi nhập tên tệp xử lý hàng loạt trong dấu nhắc lệnh hoặc nháy đúp vào tệp này, hệ thống sẽ gọi cmd.exe để thực thi các lệnh theo thứ tự xuất hiện trong tệp. Sử dụng tệp xử lý hàng loạt (còn được gọi là chương trình hoặc tập lệnh xử lý hàng loạt) có thể đơn giản hóa các tác vụ hàng ngày hoặc lặp đi lặp lại.

Cú pháp đơn giản của xử lý hàng loạt:

rem: Lệnh dùng để ghi chú, các dòng bắt đầu bằng rem sẽ không được thực thi như mã nguồn pause: Lệnh dùng để tạm dừng việc thực thi tệp xử lý hàng loạt và yêu cầu người dùng nhấn phím, sau đó chương trình tiếp tục thực thi echo: Lệnh dùng để hiển thị một đoạn văn bản trên console DOS, tương đương với print, nếu muốn hiển thị biến môi trường cần đặt biến trong cặp %%, ví dụ hiển thị hệ điều hành echo %OS% echo off: Lệnh này ngăn việc in các lệnh cụ thể trong tệp xử lý hàng loạt, chỉ hiển thị kết quả thực thi. @echo off: Tương tự như echo off, nhưng khác biệt là @echo off không chỉ ẩn các lệnh cụ thể mà còn ẩn chính lệnh 'echo off'. set: Thiết lập biến môi trường, ví dụ set A = 100 đặt biến A bằng 100 label: Sử dụng ':' (dấu hai chấm) để đặt một nhãn, phục vụ cho lệnh goto, ví dụ ":init" đại diện cho nhãn init. goto: Lệnh buộc việc thực thi lệnh nhảy đến nhãn được chỉ định. Ví dụ cần nhảy đến lệnh dưới nhãn A, thực hiện như sau: goto A not: Lệnh dùng để phủ định, tương đương với toán tử NOT logic. if: Lệnh biểu thị điều kiện exist: Lệnh thường dùng để kiểm tra sự tồn tại của tệp, thường được sử dụng với if shift: Lệnh dùng để dịch các tham số sang trái một vị trí, tức là gán %2% cho %1%, %3% cho %2%, có thể hiểu là danh sách tham số dịch trái tức xóa phần tử đầu tiên của danh sách tham số hiện tại. call: Lệnh dùng để gọi một lệnh khác. setLocal: Lệnh biểu thị các biến môi trường được sửa đổi trong tệp xử lý hàng loạt chỉ có hiệu lực trong tệp này, hoặc cho đến khi gặp lệnh endLocal, các biến môi trường được sửa đổi sẽ khôi phục lại trạng thái ban đầu. start: Mở một cửa sổ DOS mới.

Tệp startup.bat

Mở tệp startup.bat bằng trình soạn thảo, nội dung như sau:

 1 @echo off
 2 rem Được cấp phép cho Apache Software Foundation (ASF) theo một hoặc nhiều
 3 thỏa thuận cấp phép người đóng góp. Xem tệp NOTICE được phân phối cùng
 4 công việc này để biết thêm thông tin về quyền sở hữu bản quyền.
 5 ASF cấp phép tệp này cho Bạn theo Giấy phép Apache, Phiên bản 2.0
 6 ("Giấy phép"); bạn không thể sử dụng tệp này nếu không tuân thủ
 7 Giấy phép. Bạn có thể nhận được một bản sao của Giấy phép tại
 8
 9     http://www.apache.org/licenses/LICENSE-2.0
10
11 Trừ khi được luật pháp yêu cầu hoặc bằng văn bản, phần mềm
12 được phân phối theo Giấy phép được phân phối trên cơ sở "AS IS",
13 KHÔNG CÓ BẢO HÀNH HAY ĐIỀU KIỆN NÀO, dù được nêu rõ hay ngụ ý.
14 Xem Giấy phép để biết ngôn ngữ cụ thể về quyền và
15 giới hạn của Giấy phép.
16 
17 rem ---------------------------------------------------------------------------
18 rem Tập lệnh khởi động cho Server CATALINA
19 rem ---------------------------------------------------------------------------
20 
21 setlocal
22 
23 rem Đoán CATALINA_HOME nếu chưa được định nghĩa
24 set "CURRENT_DIR=%cd%"
25 if not "%CATALINA_HOME%" == "" goto gotHome
26 set "CATALINA_HOME=%CURRENT_DIR%"
27 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
28 cd ..
29 set "CATALINA_HOME=%cd%"
30 cd "%CURRENT_DIR%"
31 :gotHome
32 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
33 echo Biến môi trường CATALINA_HOME không được định nghĩa chính xác
34 echo Biến môi trường này cần thiết để chạy chương trình này
35 goto end
36 :okHome
37 
38 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
39 
40 rem Kiểm tra tệp thực thi mục tiêu có tồn tại không
41 if exist "%EXECUTABLE%" goto okExec
42 echo Không thể tìm thấy "%EXECUTABLE%"
43 echo Tệp này cần thiết để chạy chương trình này
44 goto end
45 :okExec
46 
47 rem Lấy các tham số dòng lệnh còn lại và lưu chúng
48 set CMD_LINE_ARGS=
49 :setArgs
50 if ""%1""=="""" goto doneSetArgs
51 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
52 shift
53 goto setArgs
54 :doneSetArgs
55 
56 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
57 
58 :end

@echo off, câu lệnh này thường được dùng ở đầu, không hiển thị tất cả thông tin dòng lệnh, bao gồm cả câu lệnh này.

Tiếp theo là một đoạn lớn các dòng rem, là phần ghi chú, giải thích về giấy phép phần mềm, phần tiếng Anh không dịch.

setlocal, khởi động việc bản địa hóa biến môi trường trong tệp xử lý hàng loạt, việc bản địa hóa sẽ tiếp tục cho đến khi gặp lệnh endlocal tương ứng hoặc đến cuối tệp xử lý hàng loạt.

Bây giờ hãy chia tệp xử lý hàng loạt thành một vài đoạn để phân tích:

Đoạn 1: Kiểm tra xem CATALINA_HOME đã được định nghĩa chưa

 1 setlocal
 2 
 3 rem Đoán CATALINA_HOME nếu chưa được định nghĩa
 4 set "CURRENT_DIR=%cd%"
 5 if not "%CATALINA_HOME%" == "" goto gotHome
 6 set "CATALINA_HOME=%CURRENT_DIR%"
 7 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 8 cd ..
 9 set "CATALINA_HOME=%cd%"
10 cd "%CURRENT_DIR%"
  1. Thiết lập biến CURRENT_DIR là thư mục hiện tại, thường là thư mục bin của Tomcat, ./apache-tomcat-x.x.xx/bin;
  2. Kiểm tra biến hệ thống CATALINA_HOME có phải là chuỗi rỗng không (thường khi cài đặt Tomcat, chúng ta sẽ cấu hình biến môi trường CATALINA_HOME, có còn nhớ không), nếu là chuỗi rỗng thì nhảy đến nhãn gotHome để thực thi, giả sử biến môi trường CATALINA_HOME chưa được định nghĩa, thì tiếp tục thực hiện;
  3. Thiết lập CATALINA_HOME là thư mục mà CURRENT_DIR trỏ đến, tức là thư mục bin (./apache-tomcat-x.x.xx/bin);
  4. Kiểm tra tệp CATALINA_HOME\bin\catalina.bat có tồn tại không, tức là ./apache-tomcat-x.x.xx/bin/bin/catalina.bat, nếu tồn tại thì nhảy đến nhãn okHome, rõ ràng là không tồn tại, nên không nhảy đến okHome, tiếp tục thực hiện;
  5. Nếu không tồn tại, CATALINA_HOME lấy giá trị của thư mục cấp trên, tức là (./apache-tomcat-x.x.xx/);
  6. Thiết lập CATALINA_HOME trỏ đến thư mục hiện tại, tức là thư mục gốc của Tomcat;
  7. Vào thư mục CURRENT_DIR (./apache-tomcat-x.x.xx/bin);

Đoạn 2: Thực thi nhãn gotHome

1 :gotHome
2 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
3 echo Biến môi trường CATALINA_HOME không được định nghĩa chính xác
4 echo Biến môi trường này cần thiết để chạy chương trình này
5 goto end

Qua việc thiết lập ở trên, giá trị của CATALINA_HOME đã là: ./apache-tomcat-x.x.xx/, lúc này kiểm tra tệp ./apache-tomcat-x.x.xx/catalina.bat có tồn tại không, nếu không tồn tại thì in một số thông tin và kết thúc, thông thường lúc này có thể tìm thấy, nên nhảy đến nhãn okHome;

Đoạn 3: Thực thi nhãn okHome

1 :okHome
2 
3 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"

Thiết lập biến EXECUTABLE trỏ đến tệp script catalina.bat;

Đoạn 4: Kiểm tra lại catalina.bat có tồn tại không

1 rem Kiểm tra tệp thực thi mục tiêu có tồn tại không 2 if exist "%EXECUTABLE%" goto okExec 3 echo Không thể tìm thấy "%EXECUTABLE%" 4 echo Tệp này cần thiết để chạy chương trình này 5 goto end

Tiếp tục kiểm tra lại tệp catalina.bat mà EXECUTABLE trỏ đến có tồn tại không, nếu không tồn tại thì in thông báo và kết thúc, nếu tồn tại thì nhảy đến nhãn okExec:

Đoạn 5:

 1 :okExec
 2 
 3 rem Lấy các tham số dòng lệnh còn lại và lưu chúng
 4 set CMD_LINE_ARGS=
 5 :setArgs
 6 if ""%1""=="""" goto doneSetArgs
 7 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
 8 shift
 9 goto setArgs
10 :doneSetArgs
11 
12 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
  1. set CMD_LINE_ARGS= nghĩa là xóa biến CMD_LINE_ARGS;
  2. Thực thi nhãn setArgs;
  3. Biến đầu tiên (%1%) là chuỗi rỗng, thì nhảy đến nhãn doneSetArgs, thông thường khi chạy trực tiếp startup.bat, không truyền bất kỳ tham số nào, nên sẽ nhảy đến nhãn doneSetArgs, từ đây cũng có thể đoán ra rằng nếu không sử dụng nháy đúp để thực thi, mà sử dụng dòng lệnh để khởi động startup.bat thì có thể truyền tham số;
  4. Nhảy đến doneSetArgs, gọi tệp mà EXECUTABLE trỏ đến, tức là tệp catalina.bat, đồng thời truyền tham số start, vì CMD_LINE_ARGS là rỗng, nên chỉ truyền một tham số start

Cuối cùng: nhãn end

1 :end

Nhãn được nhảy đến khi kiểm tra thất bại, là dấu hiệu kết thúc khi tham số không chính xác.

catalina.bat

Nếu startup.bat thực thi đúng, thì tương đương với việc chạy catalina.bat start, vào trong tệp script catalina.bat, xóa bỏ đoạn ghi chú lớn ở đầu tệp, như sau:

  1 setlocal
  2 
  3 rem Ngăn chặn việc dừng công việc batch khi nhấn CTRL+C
  4 if not ""%1"" == ""run"" goto mainEntry
  5 if "%TEMP%" == "" goto mainEntry
  6 if exist "%TEMP%\%~nx0.run" goto mainEntry
  7 echo Y>"%TEMP%\%~nx0.run"
  8 if not exist "%TEMP%\%~nx0.run" goto mainEntry
  9 echo Y>"%TEMP%\%~nx0.Y"
 10 call "%~f0" %* <"%TEMP%\%~nx0.Y"
 11 rem Sử dụng errorlevel được cung cấp
 12 set RETVAL=%ERRORLEVEL%
 13 del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
 14 exit /B %RETVAL%
 15 :mainEntry
 16 del /Q "%TEMP%\%~nx0.run" >NUL 2>&1
 17 
 18 rem Đoán CATALINA_HOME nếu chưa được định nghĩa
 19 set "CURRENT_DIR=%cd%"
 20 if not "%CATALINA_HOME%" == "" goto gotHome
 21 set "CATALINA_HOME=%CURRENT_DIR%"
 22 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 23 cd ..
 24 set "CATALINA_HOME=%cd%"
 25 cd "%CURRENT_DIR%"
 26 :gotHome
 27 
 28 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 29 echo Biến môi trường CATALINA_HOME không được định nghĩa chính xác
 30 echo Biến môi trường này cần thiết để chạy chương trình này
 31 goto end
 32 :okHome
 33 
 34 Sao chép CATALINA_BASE từ CATALINA_HOME nếu chưa được định nghĩa
 35 if not "%CATALINA_BASE%" == "" goto gotBase
 36 set "CATALINA_BASE=%CATALINA_HOME%"
 37 :gotBase
 38 
 39 Đảm bảo rằng CATALINA_HOME và CATALINA_BASE không chứa dấu chấm phẩy
 40 vì đây là dấu phân cách trong classpath và Java không cung cấp
 41 cơ chế thoát nếu cùng một ký tự xuất hiện trong đường dẫn. Kiểm tra
 42 bằng cách thay thế tất cả các occurrence của ';' bằng '' và kiểm tra
 43 rằng cả CATALINA_HOME và CATALINA_BASE đều không thay đổi
 44 if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon
 45 echo Sử dụng CATALINA_HOME:   "%CATALINA_HOME%"
 46 echo Không thể khởi động vì CATALINA_HOME chứa ký tự chấm phẩy (;)
 47 goto end
 48 :homeNoSemicolon
 49 
 50 if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon
 51 echo Sử dụng CATALINA_BASE:   "%CATALINA_BASE%"
 52 echo Không thể khởi động vì CATALINA_BASE chứa ký tự chấm phẩy (;)
 53 goto end
 54 :baseNoSemicolon
 55 
 56 Đảm bảo rằng bất kỳ biến CLASSPATH do người dùng định nghĩa nào cũng không được sử dụng khi khởi động,
 57 nhưng cho phép chúng được chỉ định trong setenv.bat, trong trường hợp hiếm khi cần.
 58 set CLASSPATH=
 59 
 60 Lấy các biến môi trường tiêu chuẩn
 61 if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
 62 call "%CATALINA_BASE%\bin\setenv.bat"
 63 goto setenvDone
 64 :checkSetenvHome
 65 if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
 66 :setenvDone
 67 
 68 Lấy các biến môi trường Java tiêu chuẩn
 69 if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
 70 echo Không thể tìm thấy "%CATALINA_HOME%\bin\setclasspath.bat"
 71 echo Tệp này cần thiết để chạy chương trình này
 72 goto end
 73 :okSetclasspath
 74 call "%CATALINA_HOME%\bin\setclasspath.bat" %1
 75 if errorlevel 1 goto end
 76 
 77 Thêm tệp jar bổ sung vào CLASSPATH
 78 Lưu ý rằng không có dấu ngoặc kép vì chúng ta không muốn
 79 đưa các dấu ngoặc kép ngẫu nhiên vào CLASSPATH
 80 if "%CLASSPATH%" == "" goto emptyClasspath
 81 set "CLASSPATH=%CLASSPATH%;"
 82 :emptyClasspath
 83 set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
 84 
 85 if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
 86 set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
 87 :gotTmpdir
 88 
 89 Thêm tomcat-juli.jar vào classpath
 90 tomcat-juli.jar có thể bị ghi đè cho mỗi instance
 91 if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
 92 set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
 93 goto juliClasspathDone
 94 :juliClasspathHome
 95 set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
 96 :juliClasspathDone
 97 
 98 if not "%JSSE_OPTS%" == "" goto gotJsseOpts
 99 set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
100 :gotJsseOpts
101 set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
102 
103 Đăng ký các trình xử lý URL tùy chỉnh
104 Thực hiện điều này ở đây để các trình xử lý URL tùy chỉnh (cụ thể là 'war:...') có thể được sử dụng trong chính sách bảo mật
105 set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
106 
107 if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
108 set LOGGING_CONFIG=-Dnop
109 if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
110 set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
111 :noJuliConfig
112 
113 if not "%LOGGING_MANAGER%" == "" goto noJuliManager
114 set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
115 :noJuliManager
116 
117 Cấu hình các tham số khởi động cụ thể cho JAVA 9
118 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.lang=ALL-UNNAMED"
119 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.io=ALL-UNNAMED"
120 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"
121 
122 Java 9 không còn hỗ trợ thuộc tính hệ thống java.endorsed.dirs
123 Chỉ cố gắng sử dụng nó nếu JAVA_ENDORSED_DIRS được đặt rõ ràng
124 hoặc CATALINA_HOME/endorsed tồn tại.
125 set ENDORSED_PROP=ignore.endorsed.dirs
126 if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar
127 set ENDORSED_PROP=java.endorsed.dirs
128 goto doneEndorsed
129 :noEndorsedVar
130 if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed
131 set ENDORSED_PROP=java.endorsed.dirs
132 :doneEndorsed
133 
134 ----- Thực Thi Lệnh Yêu Cầu ---------------------------------------
135 
136 echo Sử dụng CATALINA_BASE:   "%CATALINA_BASE%"
137 echo Sử dụng CATALINA_HOME:   "%CATALINA_HOME%"
138 echo Sử dụng CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
139 if ""%1"" == ""debug"" goto use_jdk
140 echo Sử dụng JRE_HOME:        "%JRE_HOME%"
141 goto java_dir_displayed
142 :use_jdk
143 echo Sử dụng JAVA_HOME:       "%JAVA_HOME%"
144 :java_dir_displayed
145 echo Sử dụng CLASSPATH:       "%CLASSPATH%"
146 
147 set _EXECJAVA=%_RUNJAVA%
148 set MAINCLASS=org.apache.catalina.startup.Bootstrap
149 set ACTION=start
150 set SECURITY_POLICY_FILE=
151 set DEBUG_OPTS=
152 set JPDA=
153 
154 if not ""%1"" == ""jpda"" goto noJpda
155 set JPDA=jpda
156 if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
157 set JPDA_TRANSPORT=dt_socket
158 :gotJpdaTransport
159 if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
160 set JPDA_ADDRESS=localhost:8000
161 :gotJpdaAddress
162 if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
163 set JPDA_SUSPEND=n
164 :gotJpdaSuspend
165 if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
166 set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
167 :gotJpdaOpts
168 shift
169 :noJpda
170 
171 if ""%1"" == ""debug"" goto doDebug
172 if ""%1"" == ""run"" goto doRun
173 if ""%1"" == ""start"" goto doStart
174 if ""%1"" == ""stop"" goto doStop
175 if ""%1"" == ""configtest"" goto doConfigTest
176 if ""%1"" == ""version"" goto doVersion
177 
178 echo Cách sử dụng:  catalina ( các lệnh ... )
179 echo lệnh:
180 echo   debug             Khởi động Catalina trong trình gỡ lỗi
181 echo   debug -security   Gỡ lỗi Catalina với trình quản lý bảo mật
182 echo   jpda start        Khởi động Catalina dưới trình gỡ lỗi JPDA
183 echo   run               Khởi động Catalina trong cửa sổ hiện tại
184 echo   run -security     Khởi động trong cửa sổ hiện tại với trình quản lý bảo mật
185 echo   start             Khởi động Catalina trong một cửa sổ riêng biệt
186 echo   start -security   Khởi động trong một cửa sổ riêng biệt với trình quản lý bảo mật
187 echo   stop              Dừng Catalina
188 echo   configtest        Chạy kiểm tra cú pháp cơ bản trên server.xml
189 echo   version           Bạn đang chạy phiên bản tomcat nào?
190 goto end
191 
192 :doDebug
193 shift
194 set _EXECJAVA=%_RUNJDB%
195 set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"
196 if not ""%1"" == ""-security"" goto execCmd
197 shift
198 echo Sử dụng Trình Quản Lý Bảo Mật
199 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
200 goto execCmd
201 
202 :doRun
203 shift
204 if not ""%1"" == ""-security"" goto execCmd
205 shift
206 echo Sử dụng Trình Quản Lý Bảo Mật
207 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
208 goto execCmd
209 
210 :doStart
211 shift
212 if "%TITLE%" == "" set TITLE=Tomcat
213 set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
214 if not ""%1"" == ""-security"" goto execCmd
215 shift
216 echo Sử dụng Trình Quản Lý Bảo Mật
217 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
218 goto execCmd
219 
220 :doStop
221 shift
222 set ACTION=stop
223 set CATALINA_OPTS=
224 goto execCmd
225 
226 :doConfigTest
227 shift
228 set ACTION=configtest
229 set CATALINA_OPTS=
230 goto execCmd
231 
232 :doVersion
233 %_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo
234 goto end
235 
236 
237 :execCmd
238 rem Lấy các tham số dòng lệnh còn lại và lưu chúng
239 set CMD_LINE_ARGS=
240 :setArgs
241 if ""%1""=="""" goto doneSetArgs
242 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
243 shift
244 goto setArgs
245 :doneSetArgs
246 
247 Thực thi Java với các thuộc tính phù hợp
248 if not "%JPDA%" == "" goto doJpda
249 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
250 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
251 goto end
252 :doSecurity
253 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
254 goto end
255 :doJpda
256 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
257 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
258 goto end
259 :doSecurityJpda
260 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
261 goto end
262 
263 :end

Đoạn 1:

 1 rem Ngăn chặn việc dừng công việc batch khi nhấn CTRL+C
 2 if not ""%1"" == ""run"" goto mainEntry
 3 if "%TEMP%" == "" goto mainEntry
 4 if exist "%TEMP%\%~nx0.run" goto mainEntry
 5 echo Y>"%TEMP%\%~nx0.run"
 6 if not exist "%TEMP%\%~nx0.run" goto mainEntry
 7 echo Y>"%TEMP%\%~nx0.Y"
 8 call "%~f0" %* <"%TEMP%\%~nx0.Y"
 9 rem Sử dụng errorlevel được cung cấp
10 set RETVAL=%ERRORLEVEL%
11 del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
12 exit /B %RETVAL%
13 :mainEntry
14 del /Q "%TEMP%\%~nx0.run" >NUL 2>&1
  1. Đầu tiên ghi chú nói rằng, không cho phép sử dụng CTRL+C để kết thúc công việc batch;
  2. if not ""%1"" == ""run"" goto mainEntry, tham số đầu tiên không phải là run, thì nhảy đến nhãn mainEntry, thông qua việc gọi startup.bat để khởi động, tham số đầu tiên nên là start;
  3. if "%TEMP%" == "" goto mainEntry, %TEMP% là giá trị của biến môi trường hệ thống, thường sau khi cài đặt hệ điều hành windows, hệ thống sẽ tự động cấu biến này, thường là C:\Users\Tên người dùng\AppData\Local\Temp (AppData là một thư mục ẩn). Câu lệnh này nói rằng, nếu %TEMP% là chuỗi rỗng, thì nhảy đến nhãn mainEntry;
  4. if exist "%TEMP%%~nx0.run" goto mainEntry, trong batch, %1 biểu thị tham số đầu tiên sau chương trình, %0 biểu thị tên của chương trình thực thi, %~nx0 thì là tên + phần mở rộng của chương trình, ở đây là catalina.bat (có thể viết một script để kiểm tra);
  5. echo Y>"%TEMP%%~nx0.run", ghi ký tự Y vào tệp %TEMP%\catalina.bat.run;
  6. if not exist "%TEMP%%~nx0.run" goto mainEntry, lại kiểm tra tệp %TEMP%\catalina.bat.run có tồn tại không;
  7. echo Y>"%TEMP%%~nx0.Y", ghi Y vào %TEMP%\catalina.bat.Y, nếu tệp không tồn tại, thì tạo một tệp mới;
  8. call "%~f0" %* &1, lệnh del, dễ liên tưởng đến delete, vậy /Q là gì? Xóa im lặng, không đưa ra bất kỳ thông báo nào, giống như linux của rm -f. Ở đây là xóa tệp %TEMP%%~nx0.Y. Phần sau >NUL 2>&1 lại là gì? 2: lỗi xuất, &1: xuất chuẩn, ý nghĩa là xuất thông báo lỗi ra xuất chuẩn, rồi lại xuất ra NUL; >NUL 2>&1: chính là先把错误消息输出到标准输出中,然后再输出到 NUL 中;
  9. exit /B %RETVAL%, thoát khỏi batch hiện tại, /B chỉ định số thoát khi thoát, lấy RETVAL làm mã thoát, tức là mã thoát của lệnh call ở trên;
  10. :mainEntry del /Q "%TEMP%%~nx0.run" >NUL 2>&1, định nghĩa một nhãn mainEntry, sau đó xóa tệp catalina.bat.run trong thư mục tạm thời.

Đoạn code này có tác dụng là gọi chính nó, kiểm tra tệp trong thư mục tạm thời có tồn tại để tránh việc gọi lại chính nó

Đoạn 2:

 1 rem Đoán CATALINA_HOME nếu chưa được định nghĩa
 2 set "CURRENT_DIR=%cd%"
 3 if not "%CATALINA_HOME%" == "" goto gotHome
 4 set "CATALINA_HOME=%CURRENT_DIR%"
 5 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
 6 cd ..
 7 set "CATALINA_HOME=%cd%"
 8 cd "%CURRENT_DIR%"
 9 :gotHome
10 
11 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
12 echo Biến môi trường CATALINA_HOME không được định nghĩa chính xác
13 echo Biến môi trường này cần thiết để chạy chương trình này
14 goto end
15 :okHome
16 
17 Sao chép CATALINA_BASE từ CATALINA_HOME nếu chưa được định nghĩa
18 if not "%CATALINA_BASE%" == "" goto gotBase
19 set "CATALINA_BASE=%CATALINA_HOME%"
20 :gotBase
  1. set "CURRENT_DIR=%cd%", thiết lập CURRENT_DIR là thư mục hiện tại bin (nếu bạn khởi động trong thư mục bin);
  2. if not "%CATALINA_HOME%" == "" goto gotHome, CATALINA_HOME không phải là chuỗi rỗng thì nhảy đến gotHome;
  3. set "CATALINA_HOME=%CURRENT_DIR%", thiết lập CATALINA_HOME trỏ đến thư mục của CURRENT_DIR, tức là thư mục bin;
  4. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome, nếu tồn tại %CATALINA_HOME%\bin\catalina.bat, thì nhảy đến nhãn okHome, nếu không thì thoát đến thư mục cấp trên, (rõ ràng là không tồn tại bin\bin\catalina.bat);
  5. set "CATALINA_HOME=%cd%", thiết lập CATALINA_HOME là thư mục hiện tại (tức là thư mục gốc của Tomcat);
  6. cd "%CURRENT_DIR%", vào thư mục CURRENT_DIR trỏ đến, tức là thư mục bin, thực hiện nhãn gotHome;
  7. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome, tại nhãn gotHome, nếu tồn tại %CATALINA_HOME%\bin\catalina.bat, thì nhảy đến nhãn okHome, vì lúc này CATALINA_HOME trỏ đến thư mục cài đặt Tomcat, nên tệp \bin\catalina.bat là tồn tại, nên nhảy đến nhãn okHome;
  8. if not "%CATALINA_BASE%" == "" goto gotBase, nếu biến CATALINA_BASE không phải là chuỗi rỗng, thì nhảy đến nhãn gotBase (rõ ràng là rỗng);
  9. set "CATALINA_BASE=%CATALINA_HOME%", thiết lập giá trị của CATALINA_BASE bằng với giá trị của CATALINA_HOME (lúc này CATALINA_BASE cũng trỏ đến thư mục gốc của Tomcat).

Đoạn này chủ yếu thiết lập hai biến môi trường CATALINA_HOME và CATALINA_BASE. Nếu không cấu biến CATALINA_BASE, thì sẽ lấy giá trị của CATALINA_HOME.

Đoạn 3:

 1 Đảm bảo rằng CATALINA_HOME và CATALINA_BASE không chứa dấu chấm phẩy
 2 vì đây là dấu phân cách trong classpath và Java không cung cấp
 3 cơ chế thoát nếu cùng một ký tự xuất hiện trong đường dẫn. Kiểm tra
 4 bằng cách thay thế tất cả các occurrence của ';' bằng '' và kiểm tra
 5 rằng cả CATALINA_HOME và CATALINA_BASE đều không thay đổi
 6 if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon
 7 echo Sử dụng CATALINA_HOME:   "%CATALINA_HOME%"
 8 echo Không thể khởi động vì CATALINA_HOME chứa ký tự chấm phẩy (;)
 9 goto end
10 :homeNoSemicolon
11 
12 if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon
13 echo Sử dụng CATALINA_BASE:   "%CATALINA_BASE%"
14 echo Không thể khởi động vì CATALINA_BASE chứa ký tự chấm phẩy (;)
15 goto end
16 :baseNoSemicolon

Chủ yếu kiểm tra giá trị của biến môi trường CATALINA_HOME và CATALINA_BASE có kết thúc bằng dấu chấm phẩy không, nếu kết thúc bằng dấu chấm phẩy thì sẽ báo lỗi thoát.

Đoạn 4:

 1 Đảm bảo rằng bất kỳ biến CLASSPATH do người dùng định nghĩa nào cũng không được sử dụng khi khởi động,
 2 nhưng cho phép chúng được chỉ định trong setenv.bat, trong trường hợp hiếm khi cần.
 3 set CLASSPATH=
 4 
 5 Lấy các biến môi trường tiêu chuẩn
 6 if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
 7 call "%CATALINA_BASE%\bin\setenv.bat"
 8 goto setenvDone
 9 :checkSetenvHome
10 if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
11 :setenvDone
12 
13 Lấy các biến môi trường Java tiêu chuẩn
14 if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
15 echo Không thể tìm thấy "%CATALINA_HOME%\bin\setclasspath.bat"
16 echo Tệp này cần thiết để chạy chương trình này
17 goto end
18 :okSetclasspath
19 call "%CATALINA_HOME%\bin\setclasspath.bat" %1
20 if errorlevel 1 goto end

Chủ yếu nói rằng, nếu thư mục bin của Tomcat có tồn tại tệp setenv.bat (setenv.bat là gì? Ghi chú ở trên nói là biến môi trường do người dùng tự định nghĩa, nhưng không phải là biến bắt buộc phải định nghĩa trong setenv.bat khi khởi động), thì thực thi nó, thông thường là không có, lại tiếp tục kiểm tra tệp setclasspath.bat có tồn tại không, nếu không tồn tại thì báo lỗi và dừng khởi động Tomcat. Nếu tồn tại thì gọi nó và truyền tham số đầu tiên vào.

Có thể vào tệp setclasspath.bat xem, chủ yếu thiết lập các biến môi trường sau:

  • JAVA_HOME
  • JRE_HOME
  • JAVA_ENDORSED_DIRS = %CATALINA_HOME%\endorsed
  • _RUNJAVA = %JRE_HOME%\bin\java.exe
  • _RUNJDB = %JAVA_HOME%\bin\jdb.exe

Vì vậy đoạn này là thiết lập một biến môi trường tạm thời: CLASSPATH.

Đoạn 5:

 1 Thêm tệp jar bổ sung vào CLASSPATH
 2 Lưu ý rằng không có dấu ngoặc kép vì chúng ta không muốn
 3 đưa các dấu ngoặc kép ngẫu nhiên vào CLASSPATH
 4 if "%CLASSPATH%" == "" goto emptyClasspath
 5 set "CLASSPATH=%CLASSPATH%;"
 6 :emptyClasspath
 7 set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
 8 
 9 if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
10 set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
11 :gotTmpdir
12 
13 Thêm tomcat-juli.jar vào classpath
14 tomcat-juli.jar có thể bị ghi đè cho mỗi instance
15 if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
16 set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
17 goto juliClasspathDone
18 :juliClasspathHome
19 set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
20 :juliClasspathDone

Đoạn code này chủ yếu làm ba việc:

  • Thêm tệp bootstrap.jar trong thư mục bin của Tomcat vào biến môi trường;
  • Thiết lập giá trị của biến môi trường CATALINA_TMPDIR là thư mục temp trong thư mục Tomcat;
  • Thêm tệp tomcat-juli.jar trong thư mục bin của Tomcat vào biến môi trường;

Đoạn 6:

 1 if not "%JSSE_OPTS%" == "" goto gotJsseOpts
 2 set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
 3 :gotJsseOpts
 4 set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
 5 
 6 Đăng ký các trình xử lý URL tùy chỉnh
 7 Thực hiện điều này ở đây để các trình xử lý URL tùy chỉnh (cụ thể là 'war:...') có thể được sử dụng trong chính sách bảo mật
 8 set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
 9 
10 if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
11 set LOGGING_CONFIG=-Dnop
12 if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
13 set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
14 :noJuliConfig
15 
16 if not "%LOGGING_MANAGER%" == "" goto noJuliManager
17 set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
18 :noJuliManager
19 
20 Cấu hình các tham số khởi động cụ thể cho JAVA 9
21 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.lang=ALL-UNNAMED"
22 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.io=ALL-UNNAMED"
23 set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"

Chủ yếu thêm một loạt tham số khởi động vào biến môi trường JAVA_OPTS.

 1 Java 9 không còn hỗ trợ thuộc tính hệ thống java.endorsed.dirs
 2 Chỉ cố gắng sử dụng nó nếu JAVA_ENDORSED_DIRS được đặt rõ ràng
 3 hoặc CATALINA_HOME/endorsed tồn tại.
 4 set ENDORSED_PROP=ignore.endorsed.dirs
 5 if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar
 6 set ENDORSED_PROP=java.endorsed.dirs
 7 goto doneEndorsed
 8 :noEndorsedVar
 9 if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed
10 set ENDORSED_PROP=java.endorsed.dirs
11 :doneEndorsed

Đoạn 7:

 1 echo Sử dụng CATALINA_BASE:   "%CATALINA_BASE%"
 2 echo Sử dụng CATALINA_HOME:   "%CATALINA_HOME%"
 3 echo Sử dụng CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
 4 if ""%1"" == ""debug"" goto use_jdk
 5 echo Sử dụng JRE_HOME:        "%JRE_HOME%"
 6 goto java_dir_displayed
 7 :use_jdk
 8 echo Sử dụng JAVA_HOME:       "%JAVA_HOME%"
 9 :java_dir_displayed
10 echo Sử dụng CLASSPATH:       "%CLASSPATH%"

In ra các thông tin biến môi trường liên quan.

Đoạn 8:

1 set _EXECJAVA=%_RUNJAVA%
2 set MAINCLASS=org.apache.catalina.startup.Bootstrap
3 set ACTION=start
4 set SECURITY_POLICY_FILE=
5 set DEBUG_OPTS=
6 set JPDA=

Thiết lập một số biến môi trường:

  1. _RUNJAVA : %JRE_HOME%\bin\java.exe;
  2. MAINCLASS : Chỉ định lớp khởi động của Tomcat;
  3. ACTION : Hành động, chính là khởi động;
  4. SECURITY_POLICY_FILE : Tệp chính sách bảo mật, nếu khởi động thêm tham số -security thì đoạn sau sẽ chỉ định tệp catalina.policy trong thư mục conf của Tomcat;
  5. JPDA : Chưa rõ .

Đoạn 9:

 1 if not ""%1"" == ""jpda"" goto noJpda
 2 set JPDA=jpda
 3 if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
 4 set JPDA_TRANSPORT=dt_socket
 5 :gotJpdaTransport
 6 if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
 7 set JPDA_ADDRESS=localhost:8000
 8 :gotJpdaAddress
 9 if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
10 set JPDA_SUSPEND=n
11 :gotJpdaSuspend
12 if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
13 set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
14 :gotJpdaOpts
15 shift
16 :noJpda

Giống như nhảy thẳng từ dòng đầu tiên đến dòng cuối cùng, thông thường khi khởi động không thêm tham số jpda thì ở đây sẽ nhảy qua, đoạn code bên trong là về việc cài đặt JPDA.

Đoạn 10:

 1 if ""%1"" == ""debug"" goto doDebug
 2 if ""%1"" == ""run"" goto doRun
 3 if ""%1"" == ""start"" goto doStart
 4 if ""%1"" == ""stop"" goto doStop
 5 if ""%1"" == ""configtest"" goto doConfigTest
 6 if ""%1"" == ""version"" goto doVersion
 7 
 8 echo Cách sử dụng:  catalina ( các lệnh ... )
 9 echo lệnh:
10 echo   debug             Khởi động Catalina trong trình gỡ lỗi
11 echo   debug -security   Gỡ lỗi Catalina với trình quản lý bảo mật
12 echo   jpda start        Khởi động Catalina dưới trình gỡ lỗi JPDA
13 echo   run               Khởi động Catalina trong cửa sổ hiện tại
14 echo   run -security     Khởi động trong cửa sổ hiện tại với trình quản lý bảo mật
15 echo   start             Khởi động Catalina trong một cửa sổ riêng biệt
16 echo   start -security   Khởi động trong một cửa sổ riêng biệt với trình quản lý bảo mật
17 echo   stop              Dừng Catalina
18 echo   configtest        Chạy kiểm tra cú pháp cơ bản trên server.xml
19 echo   version           Bạn đang chạy phiên bản tomcat nào?
20 goto end

Nếu dùng startup.bat để khởi động Tomcat thì giá trị của "%1" ở đây là start; Nếu dùng catalina.bat run để khởi động Tomcat thì giá trị của "%1" ở đây là run;

Đoạn 11:

 1 :doDebug
 2 shift
 3 set _EXECJAVA=%_RUNJDB%
 4 set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"
 5 if not ""%1"" == ""-security"" goto execCmd
 6 shift
 7 echo Sử dụng Trình Quản Lý Bảo Mật
 8 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
 9 goto execCmd
10 
11 :doRun
12 shift
13 if not ""%1"" == ""-security"" goto execCmd
14 shift
15 echo Sử dụng Trình Quản Lý Bảo Mật
16 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
17 goto execCmd
18 
19 :doStart
20 shift
21 if "%TITLE%" == "" set TITLE=Tomcat
22 set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
23 if not ""%1"" == ""-security"" goto execCmd
24 shift
25 echo Sử dụng Trình Quản Lý Bảo Mật
26 set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
27 goto execCmd
28 
29 :doStop
30 shift
31 set ACTION=stop
32 set CATALINA_OPTS=
33 goto execCmd
34 
35 :doConfigTest
36 shift
37 set ACTION=configtest
38 set CATALINA_OPTS=
39 goto execCmd
40 
41 :doVersion
42 %_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo
43 goto end

Đối ứng với các nhãn ở trên, khởi động chủ yếu liên quan đến doRun và doStart.

shift đầu tiên là loại bỏ tham số start hoặc run, sau đó lại dùng "%1" để lấy tham số, lúc này lấy ra chính là tham số thứ hai trong danh sách tham số; shift thứ hai là loại bỏ tham số thứ hai.

Chúng ta lại so sánh sự khác biệt giữa khởi động start và run.

Nếu dùng script startup.bat để khởi động thì sẽ mở một cửa sổ cmd mới, và đặt title của cmd là Tomcat. Nếu dùng catalina.bat run để khởi động thì sẽ không mở cửa sổ cmd mới, cũng không đặt title cho cmd.

Cuối cùng đều nhảy đến nhãn execCmd.

Đoạn 12:

1 :execCmd
2 rem Lấy các tham số dòng lệnh còn lại và lưu chúng
3 set CMD_LINE_ARGS=
4 :setArgs
5 if ""%1""=="""" goto doneSetArgs
6 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
7 shift
8 goto setArgs
9 :doneSetArgs

Ở đây vẫn dùng "%1" để lấy các tham số sau lệnh khởi động, nếu tồn tại thì thêm vào biến môi trường CMD_LINE_ARGS, và loại bỏ tham số này. Thông thường thì ở đây sẽ không có tham số gì.

Đoạn cuối cùng:

 1 Thực thi Java với các thuộc tính phù hợp
 2 if not "%JPDA%" == "" goto doJpda
 3 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
 4 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
 5 goto end
 6 :doSecurity
 7 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
 8 goto end
 9 :doJpda
10 if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
11 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
12 goto end
13 :doSecurityJpda
14 %_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
15 goto end
16 
17 :end

Khởi động bình thường, sẽ không có jdpa, cũng không có security, nên đoạn code này chủ yếu là thêm một số biến môi trường, rồi mang theo tham số để khởi động phương thức main của org.apache.catalina.startup.Bootstrap.

Tổng kết

Khởi động tomcat có thể nháy đúp vào startup.bat, cũng có thể dùng dòng lệnh trực tiếp catalina.bat run, quy trình tổng thể như sau:

  1. Đầu tiên kiểm tra xem người dùng có dùng catalina.bat run để khởi động Tomcat không;
  2. Thiết lập giá trị của các biến môi trường CATALINA_HOME và CATALINA_BASE;
  3. Xác tính tính đúng đắn của giá trị các biến môi trường CATALINA_HOME và CATALINA_BASE;
  4. Gọi script setnv.bat;
  5. Gọi script setclasspath.bat;
  6. Thêm bootstrap.jar và tomcat-juli.jar vào CLASSPATH;
  7. Thiết lập giá trị của thư mục tạm CATALINA_TMPDIR là thư mục temp trong Tomcat;
  8. Thêm một loạt tham số vào JAVA_OPTS;
  9. Tổng hợp thông tin và tham số liên quan đến khởi động;
  10. Khởi động Tomcat.

Thẻ: Tomcat startup.bat catalina.bat khởi động Batch Script

Đăng vào ngày 24 tháng 6 lúc 09:27