构建失败为什么?
第二部分:利用Maven技术让Web工程依赖于Java工程:
1 观念
明确一个意识:从来只有 Web 工程依赖 Java 工程,没有反过来 Java 工程依赖 Web 工程。本质上来说,Web 工程依赖的 Java 工程其实就是 Web 工程里导入的 jar 包。最终 Java 工程会变成 jar 包,放在 Web 工程的 WEB-INF/lib 目录下。
2 操作步骤
在 Maven-Web程的 pom.xml 中,找到 dependencies 标签,在 dependencies 标签中做如下配置:
<!-- 配置对Java工程maventest的依赖 --> <!-- 具体的配置方式:在dependency标签内使用坐标实现依赖 --> <dependency> <groupId>com.efg.maven</groupId> <artifactId>maventest</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency>
3 在 Web 工程中,编写测试代码 补下目录
pro02-maven-web\src\test\java\com\web\maven
4 确认 Web 工程依赖了 junit
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
5 操作步骤
把 Java 工程的 CalculatorTest.java 类复制到 pro02-maven-wb\src\test\java\com\web\maven 目录下
6 执行Maven命令
说明:测试操作中会提前自动执行编译操作,测试成功就说明编译也是成功的
7 如图所示
8 通过查看 war 包内的结构,我们看到被 Web 工程依赖的 Java 工程确实是会变成 Web 工程的 WEB-INF/lib 目录下的 jar 包。
9 查看当前 Web 工程所依赖的 jar 包的列表 mvn dependency:list
[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 包的坐标信息。格式是:
10 以树形结构查看当前 Web 工程的依赖信息 mvn dependency:tree
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>
11 下面的错误炸解决
[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
第三部分:测试依赖的范围 关键字 Scope
标签的位置:dependencies/dependency/scope
标签的可选值:compile/test/provided/system/runtime/import
1 测试
①验证 compile 范围对 main 目录有效
main目录下的类:HelloServlet 使用compile范围导入的依赖:pro01-atguigu-maven
验证:使用compile范围导入的依赖对main目录下的类来说是有效的
有效:HelloServlet 能够使用 pro01-atguigu-maven 工程中的 Calculator 类
验证方式:在 HelloServlet 类中导入 Calculator 类,然后编译就说明有效。
②验证test范围对main目录无效
测试方式:在主体程序中导入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不存在
③验证test和provided范围不参与服务器部署
其实就是验证:通过compile范围依赖的jar包会放入war包,通过test范围依赖的jar包不会放入war包。
④验证provided范围对测试程序
有效测试方式是在pro02-maven-web的测试程序中加入servlet-api.jar包中的类。
2 修改
pro02-maven-web\src\test\java\com\csdn\maven\CalculatorTest.java
3 测试类
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); }
4 总结
compile:通常使用的第三方框架的 jar 包这样在项目实际运行时真正要用到的 jar 包都是以 compile 范围进行依赖的。比如 SSM 框架所需jar包。
test:测试过程中使用的 jar 包,以 test 范围依赖进来。比如 junit。
provided:在开发过程中需要用到的“服务器上的 jar 包”通常以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担。说白了就是:“服务器上已经有了,你就别带啦!