创建Maven版的Web工程
使用命令生成Web工程
使用mvn archetype:generate
命令生成Web工程时,需要使用一个专门生成Web工程骨架的archetype(参照官网看到它的用法)
-D
表示后面要附加命令的参数,字母D和后面的参数是紧挨着的,中间没有任何其它字符- 参数
archetypeGroupId、archetypeArtifactId、archetypeVersion
用来指定现在使用的maven-archetype-webapp
的坐标
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp
-DarchetypeVersion=1.4
第一步: 在工作空间的根目录下运行生成Web工程的命令然后按照提示执行, 不能在一个非pom的工程下再创建其他工程
Define value for property 'groupId': com.atguigu.maven
Define value for property 'artifactId': pro02-maven-web
Define value for property 'version' 1.0-SNAPSHOT: :【直接回车,使用默认值】
Define value for property 'package' com.atguigu.maven: :【直接回车,使用默认值】
Confirm properties configuration:
groupId: com.atguigu.maven
artifactId: pro02-maven-web
version: 1.0-SNAPSHOT
package: com.atguigu.maven
Y: :【直接回车,表示确认】
第二步:配置Maven工程生成的pom.xml文件,对创建好的Web工程做一点调整
<?xml version="1.0" encoding="UTF-8"?>
<!--project跟标签,表示对当前工程进行配置管理-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--modelVersion标签:代表当前pom.xml所采用的标签结构,从Maven2开始就固定是4.0.0-->
<modelVersion>4.0.0</modelVersion>
<!--当前Maven工程的坐标-->
<groupId>com.atguigu.maven</groupId>
<artifactId>pro02-maven-web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--当前工程的名字-->
<name>pro02-maven-web</name>
<url>http://www.example.com</url>
<properties>
<!--工程构建过程中读取源码时使用的字符集-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--配置当前工程所依赖的jar包-->
</project>
Web工程的目录结构
将Web工程中部署到服务器
创建Servlet
第一步: 在main目录下创建java目录,在java目录下创建Servlet类所在的包的目录
package com.atguigu.maven;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
public class HelloServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello maven web");
}
}
第二步: 在web.xml中注册Servlet
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.atguigu.maven.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
第三步: 在index.jsp
页面编写超链接
<html>
<body>
<h2>Hello World!</h2>
<a href="helloServlet">Access Servlet</a>
</body>
</html>
执行Maven的构建命令
此时直接执行mvn compile
命令提示错误信息,程序包javax.servlet.http和javax.servlet
不存在
- 因为我们的Web工程用到的
HttpServlet
这个类属于servlet-api.jar
,所以Web工程需要导入servlet-api.jar的坐标信息
配置Web工程对servlet-api.jar
包的依赖: 依赖的详细信息可以根据关键词到Maven仓库查询,根据下载量选择适合的使用
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
第一步: 运行mvn package
命令将Web工程打包为war包(存放在target目录下),将war包复制到Tomcat/webapps
目录下即部署到Tomcat上运行
第二步: 执行startup.bat
文件启动Tomcat服务器, 通过浏览器尝试访问http://localhost:8080/pro02-maven-web/index.jsp
Web工程依赖Java工程
Web工程依赖的每一个jar包对应的就是每一个Java工程,最终这些jar包会被放在Web工程的WEB-INF/lib
目录下
在pro02-maven-web
工程的pom.xml中,在dependencies标签
内指定被依赖的Java工程pro01-maven-java
的坐标
- 只有Web工程依赖Java工程,没有反过来Java工程依赖Web工程
<!--依赖Java工程pro01-maven-java的-->
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
编写测试程序: 根据工程的目录结构创建对应的test目录pro02-maven-web\src\test\java\com\atguigu\maven
,把Java工程的CalculatorTest.java测试类
复制到该目录下
<!--确认Web工程依赖了junit-->
<dependencies>
<!-- 使用dependency配置一个具体的依赖 -->
<dependency>
<!-- 要导入哪个jar包就配置它的坐标信息即可 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--4.0以下的版本不支持注解-->
<version>4.12</version>
<!-- scope标签配置依赖的范围,默认值是compile-->
<scope>test</scope>
</dependency>
<dependencies>
执行Maven的构建命令
测试命令: mvn test
, 调用测试类的测试方法, 测试操作中会提前自动执行编译操作,测试成功就说明编译也是成功的
打包命令: mvn package
, 在打包好的war包中被Web工程依赖的Java工程会变成Web工程的WEB-INF/lib
目录下的jar包
以列表形式查看当前Web工程所依赖的jar包信息: mvn dependency:list
# jar包的显示格式-->groupId:artifactId:打包方式:version:依赖的范围
> [INFO] The following files have been resolved:
> [INFO] org.hamcrest:hamcrest-core:jar:1.3:test
> [INFO] javax.servlet:javax.servlet-api:jar:3.1.0:provided
> [INFO] com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
> [INFO] junit:junit:jar:4.12:test
以树形结构查看当前Web工程依赖的jar包信息: mvn dependency:tree
- 由于依赖的传递性, 在pom.xml中虽然没有依赖hamcrest-core,但是它却被加入了我们依赖的列表, 原因是junit依赖了hamcrest-core
[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile