部署项目到 Tomcat

<tomcat> 指的是 Tomcat 的安装目录。

1. 项目打包

在项目的 Maven 工具窗口里点击 package 就会在项目的 target 目录下生成 war 包和 war 包解压后的内容,war 包就是用来部署的。如我们的项目生成了 Training.war,以下用它为例介绍部署过程。

也可以在命令行里,项目的根目录下执行命令 mvn package 进行打包,效果和上面点击 package 一样。


补充内容:

上面的打包命令执行后会生成 war 包,同时生成相应的 war 解压后的目录,可以配置 pluginManagement 设定是否生成 war 包和相应的解压目录,在 pom.xml 的 build 元素下配置 pluginManagement,如下配置则只生成 Training 目录的内容,不生成 war 包:

    <build>
        <finalName>Training</finalName>

        <pluginManagement>
            <plugins>
                <plugin>
                    <!-- don't pack the war  -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>default-war</id>
                            <phase>none</phase>
                        </execution>
                        <execution>
                            <id>war-exploded</id>
                            <phase>package</phase>
                            <goals>
                                <goal>exploded</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <!--嵌入式的 Tomcat Web Server-->
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>${tomcat.version}</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path> <!--Content Path用 /,而不是项目名-->
                    <uriEncoding>UTF-8</uriEncoding> <!--处理 GET 请求的编码-->
                </configuration>
            </plugin>
        </plugins>
    </build>

只生成 war 对应的目录而不生成 war 包,加快了打包速度,在某些场景下是很有用的。例如因为我们使用了 SpringLoaded 进行热部署,但是 IDEA 里有 Bug,热部署后的类不能进行 Debug,现在有一个临时的解决办法,使用 Remote Debug 的方式就可以 Debug 了。Tomcat 使用 SpringLoaded 进行热部署,把 Tomcat 的 docBase 指向打包生成的目录,这样每次修改后编译,打包 (可以使用一条命令完成这些事:mvn compile package),Tomcat 就会自动加载新的修改,进行热部署,而且同时可以在 IDEA 里远程调试了。这种情况下不需要 war 包,所以打包时不生成 war 包,加快了打包的速度。

2. 部署项目到 Tomcat

复制 Training.war<tomcat>/webapps 目录,Tomcat 启动的时候会自动解压它到 Training 目录,或者直接复制 Training 目录到 <tomcat>/webapps 目录。

3. 配置启动 Tomcat 的字符集

Unix Like 配置 Tomcat

在 Tomcat 启动文件 <tomcat>/bin/catalina.sh 中加一个 -Dfile.encoding=UTF-8

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
Windows 配置 Tomcat

在 Tomcat 启动文件 <tomcat>/bin/catalina.bat 中加一个 -Dfile.encoding=UTF-8

set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8"

4. 配置 Tomcat Get 请求的字符集

<tomcat>/conf/server.xml 里修改

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8" />

5 配置 Tomcat 打开项目的 context path

例如默认访问 user-form 需要带上项目目录名,即 http://localhost:8080/Training/user-form,但是我们不想带上项目名,就像访问正常的网站那样,直接用 / 来访问,则配置 context path 为 /

<tomcat>/conf/server.xml 里的 Host 下添加或修改

<Host>
    ...
    <Context 
        path="/" 
        reloadable="true"
        docBase="/usr/local/apache-tomcat-8.0.21/webapps/Training" />
</Host>

docBase 为项目的绝对路径或者为项目在 <tomcat>/webapps 下的目录名。

6. 启动 Tomcat

终端里使用命令

cd <tomcat>/bin
./catalina.sh run

然后访问如 http://localhost:8080/user-form,如果能访问,说明项目部署成功了。