Tomcat 启动都做了什么?

本文通过Windows环境下的实验,详细解析了Tomcat服务器的启动过程。重点介绍了启动脚本startup.bat的实际作用及其如何调用catalina.bat来完成Tomcat的启动。

这里我们在windows 机子作为实验,来看看tomcat 启动的时候都做了什么。

startup.bat

这个文件java ee 程序员最熟悉不过了,是一个启动tomcat 服务器的批处理文件,这个文件真正意义上不是启动tomcat 的,而是判断Tomcat 的一个批处理文件是否存在,如果存在的话就会调用这个批处理。

而这个批处理是和startup.bat 同目录,这个文件叫做catalina.bat 。

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

catalina.bat

未完待续

<think>我们被要求配置Maven Tomcat插件以通过main方法启动应用。然而,标准法是使用Maven命令(如`tomcat7:run`)来启动嵌入式的Tomcat服务器,而不是通过一个main方法。但是,如果我们希望有一个可执行的Java类(包含main方法)来启动Tomcat,我们可以编写一个Java程序,使用Tomcat的API来启动嵌入式Tomcat。 但是,请注意,用户的问题中提到了“Maven Tomcat插件”,通常指的是Maven插件,如`tomcat7-maven-plugin`,它通过Maven命令启动,而不是通过main方法。如果我们想要通过main方法启动,那么我们需要使用嵌入式Tomcat的方式,而不是Maven插件。 因此,有两种可能: 1. 用户可能误解了,实际上想要的是通过Maven命令启动(这是标准方式)。 2. 用户确实想要一个独立的Java程序(包含main方法)来启动Tomcat,这样可以在IDE中直接运行,而不需要Maven命令。 根据引用[2]和引用[3],用户之前可能是在使用Maven Tomcat插件(如`tomcat7-maven-plugin`)通过Maven命令运行。现在想要改为通过main方法启动。 我们这里按照用户的要求,提供通过main方法启动Tomcat的方式(即嵌入式Tomcat)。同时,我们也会说明,这实际上不再使用Maven Tomcat插件,而是直接使用Tomcat的API。 步骤: 1. 添加Tomcat嵌入式依赖。 2. 编写一个包含main方法的类,在main方法中配置并启动Tomcat。 但是,如果用户的项目是一个标准的Web应用,并且已经使用了Maven,我们可以通过添加嵌入式Tomcat的依赖,然后编写一个main类来实现。 具体步骤: 1. 在pom.xml中添加嵌入式Tomcat的依赖(注意:版本需要根据实际情况选择,这里以Tomcat 9为例): ```xml <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>9.0.54</version> <!-- 请选择合适版本 --> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.54</version> <!-- 同上 --> </dependency> ``` 2. 创建一个包含main方法的类,例如`EmbeddedTomcat`: ```java import org.apache.catalina.startup.Tomcat; import java.io.File; public class EmbeddedTomcat { public static void main(String[] args) throws Exception { Tomcat tomcat = new Tomcat(); tomcat.setPort(8080); // 设置端口 // 设置Web应用的基础目录,这里假设webapp目录在项目的src/main/webapp String webappDirLocation = "src/main/webapp"; File webappDir = new File(webappDirLocation); if (!webappDir.exists()) { // 如果使用Maven标准结构,webapp目录在src/main/webapp,但运行时的当前路径可能是项目根目录 webappDir = new File("webapp"); } // 添加上下文 tomcat.addWebapp("", webappDir.getAbsolutePath()); tomcat.start(); tomcat.getServer().await(); } } ``` 3. 运行这个main方法即可启动Tomcat。 注意:这种方式是使用嵌入式Tomcat,而不是通过Maven插件。它不需要Maven插件,但需要将嵌入式Tomcat的依赖加入到项目中。 另外,如果用户仍然想使用Maven插件,那么标准的启动方式是通过Maven命令(如`mvn tomcat7:run`)来启动。这种方式不需要写main方法。 所以,我们提供了两种方式的说明: - 方式一(标准Maven插件方式):使用`tomcat7-maven-plugin`,在pom.xml中配置插件,然后运行`mvn tomcat7:run`。 - 方式二(嵌入式Tomcat main方法):如上所述。 根据用户的问题,他们希望改为通过main方法启动,所以我们重点提供了方式二。 但是,请注意,嵌入式Tomcat的方式可能会遇到一些路径问题,需要根据项目结构进行调整。例如,获取webapp目录的路径,以及处理JSP需要的依赖等。 如果用户的项目是Spring Boot应用,那么Spring Boot已经内置了Tomcat,并且启动类(有main方法)是标准的,这里不讨论Spring Boot的情况。 因此,我们回答如下:</think>### 配置 Maven Tomcat 插件通过 main 方法启动应用 要将 Maven Tomcat 插件改为通过 `main` 方法启动应用,需结合嵌入式 Tomcat 实现。以下是详细步骤: #### 1. **添加嵌入式 Tomcat 依赖** 在 `pom.xml` 中添加依赖(以 Tomcat 9 为例): ```xml <dependencies> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>9.0.54</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.54</version> </dependency> </dependencies> ``` #### 2. **创建启动类** 新建 `MainLauncher.java` 类,配置嵌入式 Tomcat: ```java import org.apache.catalina.startup.Tomcat; import java.io.File; public class MainLauncher { public static void main(String[] args) throws Exception { // 1. 创建 Tomcat 实例 Tomcat tomcat = new Tomcat(); // 2. 配置端口和 Web 应用路径 tomcat.setPort(8080); // 端口 String webappDir = new File("src/main/webapp").getAbsolutePath(); // 3. 添加上下文(应用根路径) tomcat.addWebapp("", webappDir); // 4. 启动并等待 tomcat.start(); tomcat.getServer().await(); } } ``` #### 3. **配置 Maven 插件(可选)** 如果需要保留 Maven Tomcat 插件(如用于其他操作),在 `pom.xml` 中添加: ```xml <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8888</port> <!-- 默认端口 --> </configuration> </plugin> </plugins> </build> ``` #### 4. **启动应用** 直接运行 `MainLauncher` 类的 `main` 方法: - IDE 中:右键运行 `MainLauncher.java` - 命令行:`mvn compile exec:java -Dexec.mainClass="MainLauncher"` #### 关键说明 1. **路径配置**: - `webappDir` 需指向 `src/main/webapp`(标准 Maven Web 项目结构) - 若路径错误,会出现 `No such directory` 错误[^2]。 2. **依赖范围**: - 嵌入式 Tomcat 依赖需包含 `tomcat-embed-core` 和 `tomcat-embed-jasper`(支持 JSP) - 版本需与 JDK 兼容(如 JDK 8+ 用 Tomcat 9+)[^3]。 3. **与传统插件区别**: - 此方式绕过 `tomcat7:run` 命令,直接通过 Java 进程启动 - 优势:可在 IDE 中调试,不依赖 Maven 生命周期 #### 常见问题解决 - **端口冲突**:修改 `tomcat.setPort()` 的值 - **类加载问题**:确保所有依赖在 `pom.xml` 中正确声明 - **JSP 编译失败**:检查 `tomcat-embed-jasper` 是否存在 > **注意**:此方案适用于本地开发和测试,生产环境建议使用独立 Tomcat 部署[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值