利用Maven工程命令行学习实操<第三课>(二)

简介: 利用Maven工程命令行学习实操<第三课>(二)

构建失败为什么?

第二部分:利用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命令

①测试命令

mvn test

说明:测试操作中会提前自动执行编译操作,测试成功就说明编译也是成功的

②打包命令

mvn package

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 包产生冲突,同时减轻服务器的负担。说白了就是:“服务器上已经有了,你就别带啦!

目录
打赏
0
0
0
0
6
分享
相关文章
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
Maven 是一款 Java 项目构建工具,主要用于管理 jar 包及其依赖关系。 本文主要了解Maven基础知识及基础应用,旨在为之后的进一步学习奠定基础。 内容上几近全为学习《尚硅谷2022版Maven教程》整理所得。 仅供参考。
366 81
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
【前端学java】如何从前端视角快速学习Maven
【8月更文挑战第12天】如何从前端视角快速学习Maven
87 2
【前端学java】如何从前端视角快速学习Maven
|
7月前
|
maven 工程pom依赖优化及常用命令
maven 工程pom依赖优化及常用命令
100 0
|
8月前
|
Maven命令行参数详解
Maven命令行参数详解
274 0
Maven程序 tomcat插件安装与web工程启动
Maven程序 tomcat插件安装与web工程启动
91 0
|
8月前
|
IDEA如何把MAVEN项目打包成jar包并且用命令行启动
IDEA如何把MAVEN项目打包成jar包并且用命令行启动
108 0
|
3月前
|
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
114 1
从零开始学 Maven:简化 Java 项目的构建与管理

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等