目录
第一部分:创建Maven中的Web工程
1 Web工程的目录如图所示:
2 说明
3 操作的命令行命令是
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
4 win+r输入Cmd enter 切换到运行项目的路径执行上面的代码
5 web项目构建运行成功的cmd命令窗口
6 观察下面的代码
Define value for property 'groupId': com.web.mavenDefine value for property 'artifactId': pros-web01-mavenDefine value for property 'version' 1.0-SNAPSHOT: :Define value for property 'package' com.web.maven: :
7 生成的pom.xml 解析pom.xml文件 注释在下面有介绍在这里不在说明
8 在自己创建maven-web项目中创建下面项目的信息
①在 main 目录下创建 java 目录
②在 java 目录下创建 Servlet 类所在的包的目录
③在包下创建 Servlet 类
9 创建Servicet类
10 注册Service
11 在 index.jsp 页面编写超链接
12 编译程序
13 配置对 servlet-api.jar 包的依赖
对于不知道详细信息的依赖可以到https://mvnrepository.com/网站查询。使用关键词搜索,然后在搜索结果列表中选择适合的使用。
14 运行 mvn package 命令,生成 war 包的位置如下图所示:
构建失败为什么?
第二部分:利用Maven技术让Web工程依赖于Java工程:
1 观念
2 操作步骤
在 Maven-Web程的 pom.xml 中,找到 dependencies 标签,在 dependencies 标签中做如下配置:
3 在 Web 工程中,编写测试代码 补下目录
pro02-maven-web\src\test\java\com\web\maven
4 确认 Web 工程依赖了 junit
5 操作步骤
把 Java 工程的 CalculatorTest.java 类复制到 pro02-maven-wb\src\test\java\com\web\maven 目录下
6 执行Maven命令
①测试命令
mvn test
说明:测试操作中会提前自动执行编译操作,测试成功就说明编译也是成功的
②打包命令
mvn package
7 如图所示
8 通过查看 war 包内的结构,我们看到被 Web 工程依赖的 Java 工程确实是会变成 Web 工程的 WEB-INF/lib 目录下的 jar 包。
9 查看当前 Web 工程所依赖的 jar 包的列表 mvn dependency:list
10 以树形结构查看当前 Web 工程的依赖信息 mvn dependency:tree
11 下面的错误炸解决
第三部分:测试依赖的范围 关键字 Scope
标签的位置:dependencies/dependency/scope
标签的可选值:compile/test/provided/system/runtime/import
1 测试
①验证 compile 范围对 main 目录有效
②验证test范围对main目录无效
③验证test和provided范围不参与服务器部署
④验证provided范围对测试程序
2 修改
pro02-maven-web\src\test\java\com\csdn\maven\CalculatorTest.java
3 测试类
4 总结
compile:通常使用的第三方框架的 jar 包这样在项目实际运行时真正要用到的 jar 包都是以 compile 范围进行依赖的。比如 SSM 框架所需jar包。
test:测试过程中使用的 jar 包,以 test 范围依赖进来。比如 junit。
provided:在开发过程中需要用到的“服务器上的 jar 包”通常以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担。说白了就是:“服务器上已经有了,你就别带啦!
使用 mvn archetype:generate 命令生成 Web 工程时,需要使用一个专门的 archetype。这个专门生成 Web 工程骨架的 archetype 可以参照官网看到它的用法:
参数 archetypeGroupId、archetypeArtifactId、archetypeVersion 用来指定现在使用的 maven-archetype-webapp 的坐标
Microsoft Windows [版本 10.0.22000.856]
(c) Microsoft Corporation。保留所有权利。
C:\Users\MZFAITHDREAM>d:
'd:' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\Users\MZFAITHDREAM>d:
D:\>cd Maven_WoekSpaces\SpaceVideo
D:\Maven_WoekSpaces\SpaceVideo>mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.2.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.2.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.2.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[WARNING] No archetype found in remote catalog. Defaulting to internal catalog
[INFO] Archetype repository not defined. Using the one from [org.apache.maven.archetypes:maven-archetype-webapp:1.0] found in catalog internal
Downloading from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-webapp/1.4/maven-archetype-webapp-1.4.pom
Downloaded from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-webapp/1.4/maven-archetype-webapp-1.4.pom (1.4 kB at 1.8 kB/s)
Downloading from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-bundles/1.4/maven-archetype-bundles-1.4.pom
Downloaded from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-bundles/1.4/maven-archetype-bundles-1.4.pom (4.5 kB at 11 kB/s)
Downloading from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-webapp/1.4/maven-archetype-webapp-1.4.jar
Downloaded from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-webapp/1.4/maven-archetype-webapp-1.4.jar (6.8 kB at 14 kB/s)
Define value for property 'groupId':
Define value for property 'groupId': com.web.maven
Define value for property 'artifactId': pros-web01-maven
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' com.web.maven: :
Confirm properties configuration:
groupId: com.web.maven
artifactId: pros-web01-maven
version: 1.0-SNAPSHOT
package: com.web.maven
Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-webapp:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.web.maven
[INFO] Parameter: artifactId, Value: pros-web01-maven
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.web.maven
[INFO] Parameter: packageInPathFormat, Value: com/web/maven
[INFO] Parameter: package, Value: com.web.maven
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: groupId, Value: com.web.maven
[INFO] Parameter: artifactId, Value: pros-web01-maven
[INFO] Project created from Archetype in dir: D:\Maven_WoekSpaces\SpaceVideo\pros-web01-maven
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:30 min
[INFO] Finished at: 2022-09-01T09:56:24+08:00
[INFO] -------------------------------------
4.0.0
com.web.maven
pros-web01-maven
1.0-SNAPSHOT
war
pros-web01-maven Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
junit
junit
4.12
test
javax.servlet
javax.servlet-api
3.1.0
provided
com.efg.maven
maventest
1.0-SNAPSHOT
compile
pros-web01-maven
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
package com.web.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");
}
}
Archetype Created Web Application
helloServlet
com.web.maven.HelloServlet
helloServlet
/helloServlet
Hello World!
Access Servlet
此时直接执行 mvn compile 命令出错:
DANGER
程序包 javax.servlet.http 不存在
程序包 javax.servlet 不存在
找不到符号
符号: 类 HttpServlet
……
上面的错误信息说明:我们的 Web 工程用到了 HttpServlet 这个类,而 HttpServlet 这个类属于 servlet-api.jar 这个 jar 包。此时我们说,Web 工程需要依赖 servlet-api.jar 包。
javax.servlet
javax.servlet-api
4.0.1
provided
4.0.0
com.web.maven
pros-web01-maven
1.0-SNAPSHOT
war
pros-web01-maven Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
junit
junit
4.12
test
javax.servlet
javax.servlet-api
3.1.0
provided
com.efg.maven
maventest
1.0-SNAPSHOT
compile
pros-web01-maven
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
D:\Maven_WoekSpaces\SpaceVideo\pros-web01-maven>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.web.maven:pros-web01-maven >-------------------
[INFO] Building pros-web01-maven Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[WARNING] The POM for com.efg.maven:maventest:jar:1.0-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.405 s
[INFO] Finished at: 2022-09-01T22:02:53+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project pros-web01-maven: Could not resolve dependencies for project com.web.maven:pros-web01-maven:war:1.0-SNAPSHOT: Could not find artifact com.efg.maven:maventest:jar:1.0-SNAPSHOT -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
明确一个意识:从来只有 Web 工程依赖 Java 工程,没有反过来 Java 工程依赖 Web 工程。本质上来说,Web 工程依赖的 Java 工程其实就是 Web 工程里导入的 jar 包。最终 Java 工程会变成 jar 包,放在 Web 工程的 WEB-INF/lib 目录下。
com.efg.maven
maventest
1.0-SNAPSHOT
compile
junit
junit
4.12
test
[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
说明:javax.servlet:javax.servlet-api:jar:3.1.0:provided 格式显示的是一个 jar 包的坐标信息。格式是:
Microsoft Windows [版本 10.0.22000.856]
(c) Microsoft Corporation。保留所有权利。
C:\Users\MZFAITHDREAM>d:
D:\>cd Maven_WoekSpaces\SpaceVideo\pros-web01-maven
D:\Maven_WoekSpaces\SpaceVideo\pros-web01-maven>mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.web.maven:pros-web01-maven >-------------------
[INFO] Building pros-web01-maven Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[WARNING] The POM for com.efg.maven:maventest:jar:1.0-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.715 s
[INFO] Finished at: 2022-09-01T19:52:01+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project pros-web01-maven: Could not resolve dependencies for project com.web.maven:pros-web01-maven:war:1.0-SNAPSHOT: Could not find artifact com.efg.maven:maventest:jar:1.0-SNAPSHOT -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
D:\Maven_WoekSpaces\SpaceVideo\pros-web01-maven>
[ERROR] Failed to execute goal on project pros-web01-maven: Could not resolve dependencies for project com.web.maven:pros-web01-maven:war:1.0-SNAPSHOT: Could not find artifact com.efg.maven:maventest:jar:1.0-SNAPSHOT -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] DependencyResolutionException - Apache Maven - Apache Software Foundation
[错误]无法在项目pros-web01-maven上执行目标:无法解析项目com.web.maven:pros-web01-maven:war:1.0-SNAPSHOT:找不到工件com.efg.maven:maventest:jar:1-0-snap->[帮助1]
[错误]
[ERROR]要查看错误的完整堆栈跟踪,请使用-e开关重新运行Maven。
[错误]使用-X开关重新运行Maven以启用完全调试日志记录。
[错误]
[错误]有关错误和可能的解决方案的更多信息,请阅读以下文章:
错误DependencyResolutionException - Apache Maven - Apache Software Foundation
main目录下的类:HelloServlet 使用compile范围导入的依赖:pro01-atguigu-maven
验证:使用compile范围导入的依赖对main目录下的类来说是有效的
有效:HelloServlet 能够使用 pro01-atguigu-maven 工程中的 Calculator 类
验证方式:在 HelloServlet 类中导入 Calculator 类,然后编译就说明有效。
测试方式:在主体程序中导入org.junit.Test这个注解,然后执行编译。
具体操作:在pro01-maven-java\src\main\java\com\csdn\maven目录下修改Calculator.java
执行Maven编译命令:
[ERROR] /D:/maven-workspace/space201026/pro01-maven-java/src/main/java/com/atguigu/maven/Calculator.java:[3,17] 程序包org.junit不存在
其实就是验证:通过compile范围依赖的jar包会放入war包,通过test范围依赖的jar包不会放入war包。
有效测试方式是在pro02-maven-web的测试程序中加入servlet-api.jar包中的类。
package com.csdn.maven;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import org.junit.Test;
import com.atguigu.maven.Calculator;
// 静态导入的效果是将Assert类中的静态资源导入当前类
// 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
import static org.junit.Assert.*;
public class package com.csdn.maven;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import org.junit.Test;
import com.atguigu.maven.Calculator;
// 静态导入的效果是将Assert类中的静态资源导入当前类
// 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
import static org.junit.Assert.*;
public class CalculatorTest{
@Test
public void testSum(){
// 1.创建Calculator对象
Calculator calculator = new Calculator();
// 2.调用Calculator对象的方法,获取到程序运行实际的结果
int actualResult = calculator.sum(5, 3);
// 3.声明一个变量,表示程序运行期待的结果
int expectedResult = 8;
// 4.使用断言来判断实际结果和期待结果是否一致
// 如果一致:测试通过,不会抛出异常
// 如果不一致:抛出异常,测试失败
assertEquals(expectedResult, actualResult);
}{
@Test
public void testSum(){
// 1.创建Calculator对象
Calculator calculator = new Calculator();
// 2.调用Calculator对象的方法,获取到程序运行实际的结果
int actualResult = calculator.sum(5, 3);
// 3.声明一个变量,表示程序运行期待的结果
int expectedResult = 8;
// 4.使用断言来判断实际结果和期待结果是否一致
// 如果一致:测试通过,不会抛出异常
// 如果不一致:抛出异常,测试失败
assertEquals(expectedResult, actualResult);
}