2022年0901号利用Maven工程命令行学习实操<第三课>

目录

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

 

第一部分:创建Maven中的Web工程

 1 Web工程的目录如图所示:

2022年0901号利用Maven工程命令行学习实操<第三课>_第1张图片

 2 说明 

使用 mvn archetype:generate 命令生成 Web 工程时,需要使用一个专门的 archetype。这个专门生成 Web 工程骨架的 archetype 可以参照官网看到它的用法:

参数 archetypeGroupId、archetypeArtifactId、archetypeVersion 用来指定现在使用的 maven-archetype-webapp 的坐标

3 操作的命令行命令是

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4

4  win+r输入Cmd enter 切换到运行项目的路径执行上面的代码

2022年0901号利用Maven工程命令行学习实操<第三课>_第2张图片

 

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':

 5 web项目构建运行成功的cmd命令窗口

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] -------------------------------------

6  观察下面的代码

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: :

7 生成的pom.xml 解析pom.xml文件 注释在下面有介绍在这里不在说明




  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
        
      
    
  

8 在自己创建maven-web项目中创建下面项目的信息

①在 main 目录下创建 java 目录

②在 java 目录下创建 Servlet 类所在的包的目录

③在包下创建 Servlet 类

9 创建Servicet类

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");
	
}
}

10 注册Service




  Archetype Created Web Application

 
	helloServlet
	com.web.maven.HelloServlet
  
  
	helloServlet
	/helloServlet
  
	


11  在 index.jsp 页面编写超链接




Hello World!

Access Servlet

12 编译程序

此时直接执行 mvn compile 命令出错:

DANGER

程序包 javax.servlet.http 不存在

程序包 javax.servlet 不存在

找不到符号

符号: 类 HttpServlet

……
上面的错误信息说明:我们的 Web 工程用到了 HttpServlet 这个类,而 HttpServlet 这个类属于 servlet-api.jar 这个 jar 包。此时我们说,Web 工程需要依赖 servlet-api.jar 包。

13  配置对 servlet-api.jar 包的依赖

对于不知道详细信息的依赖可以到https://mvnrepository.com/网站查询。使用关键词搜索,然后在搜索结果列表中选择适合的使用。

2022年0901号利用Maven工程命令行学习实操<第三课>_第3张图片

 

2022年0901号利用Maven工程命令行学习实操<第三课>_第4张图片

 2022年0901号利用Maven工程命令行学习实操<第三课>_第5张图片



    javax.servlet
    javax.servlet-api
    4.0.1
    provided

 14 运行 mvn package 命令,生成 war 包的位置如下图所示:




  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

构建失败为什么?

第二部分:利用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 标签中做如下配置:




	com.efg.maven
	maventest
	1.0-SNAPSHOT
  	compile

3  在 Web 工程中,编写测试代码 补下目录

pro02-maven-web\src\test\java\com\web\maven

4  确认 Web 工程依赖了 junit


      junit
      junit
      4.12
      test
    

5 操作步骤

把 Java 工程的 CalculatorTest.java 类复制到 pro02-maven-wb\src\test\java\com\web\maven 目录下

6  执行Maven命令

①测试命令

mvn test

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

②打包命令

mvn package

7 如图所示

2022年0901号利用Maven工程命令行学习实操<第三课>_第6张图片

 

通过查看 war 包内的结构,我们看到被 Web 工程依赖的 Java 工程确实是会变成 Web 工程的 WEB-INF/lib 目录下的 jar 包。

2022年0901号利用Maven工程命令行学习实操<第三课>_第7张图片

 

 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

2022年0901号利用Maven工程命令行学习实操<第三课>_第8张图片

标签的位置:dependencies/dependency/scope

标签的可选值:compile/test/provided/system/runtime/import

2022年0901号利用Maven工程命令行学习实操<第三课>_第9张图片

2022年0901号利用Maven工程命令行学习实操<第三课>_第10张图片

 

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包中的类。

 2022年0901号利用Maven工程命令行学习实操<第三课>_第11张图片

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

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Maven工具的学习,SSMS,java,maven)