文章目录
了解war包文件结构
我们都知道war包是放在Tomcat webapp目录下的,放进去我们的web项目就会被Tomcat认识,就可以运行在服务器了。
war包本质上和jar包、压缩文件没有什么太大区别,但是要让Tomcat认识我们的war包,我们必须遵循war包的文件结构。如下图:
- META-INF:不用管
- WEB-INF:主要看这里面
- classes:这里面放的是项目中java目录编译好的class文件和项目中resources目录下的配置文件,java目录先编译为class复制到这里,resources直接复制进去,如不理解往下看
- lib:项目中用到的jar包
- *.jsp:如果用到JSP就直接放在WEB-INF下,记得没错的话,对classes是有保护的,对外是不可见的,毕竟是放源码和配置文件的,所以不能放在classes里面
创建Maven项目
在这我用了一个普通的java Maven项目,我将它一步步改为war项目,这样可以帮助理解项目到war包的映射关系
直接建立一个普通Maven项目,不用archetype
这里有java和resources文件,也就是会被放到WEB-INF\classes
下
其实这两个文件是可以指定的
然后我们可以手动添加一个webapp文件夹,该文件夹里所有的东西都会被放到war包根目录下
我们要将jps文件放在WEB-INF
里
当然也可以在这里创建webapp
可以看到上面明确将项目文件中的src\main\webapp
映射到war包的根目录下
Maven打包war包流程
所以打包流程就很简单咯:
- 将
src\main\webapp
复制到war包根目录下 - 将
src\main\java
中的java文件编译,将编译好的文件放到war包\WEB-INF\classes
下 - 将
src\main\resources
中的配置文件等,直接复制到\WEB-INF\classes
下 - 将项目用到的jar包打包到
\WEB-INF\lib
下
Spring MVC注解版驱动
pom文件配置
<packaging>war</packaging>
<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
在这个pom文件里做了这么几件事情:
- 指定maven打包为war
- 配置war打包插件的属性
failOnMissingWebXml
,指定即使没有web.xml
也可以正常打包 - 引入Spring MVC的依赖
- 构建工具里引入了内嵌Tomcat 7(方便不用自己下载Tomcat咯)
Servlet3.0
Servlet容器启动之ServletContainerInitializer
为了实现Shared libraries & Runtimes pluggability
Servlet会在启动应用的时候会扫描每一个jar包META-INF/services/javax.servlet.ServletContainerInitializer
里的内容
面指定了一个ServletContainerInitializer的实现类,Servlet会在初始化的时候运行它。
public interface ServletContainerInitializer {
void