Maven教程--下(包括手动实现)

news2024/9/20 9:00:12

Maven教程–下(包括手动实现)

前言

注意本篇是需要一定的maven基础的 如果没有请移步Maven教程–上

手动创建Maven 项目- 理解Maven 底层机制

需求说明/图解

用手工的方式,创建maven 项目, 深刻理解Maven 工作机制

完成功能-说明

  1. 编写一个类, 有一个方法sum,可以返回两个数的和
  2. 编写测试类TestSum, 可以测试sum 是否正确.
  3. 使用指令完成Maven 的编译(complile)、测试(test)、打包(package)、安装(install)、清理(clean)等操作

手写方式

完成代码编写

  1. 先根据maven 项目的结构要求,在d 盘: 创建项目结构(如图)

在这里插入图片描述

  1. 创建\Hello.java ,说明: 这个文件可以手写, 也可以从快速入门项目拷贝一份.
public class Hello {
    public String sum(int n1, int n2) {
        System.out.println("sum= " + (n1 + n2));
        return "sum= " + (n1 + n2);
    }
}
  1. 创建HelloTest.java,说明: 这个文件可以手写, 也可以从快速入门项目拷贝一份, 同时注意这个文件是在src\test… 下的…

public class HelloTest {

@Test
public void testSum() {

    Hello hello = new Hello();
    String res = hello.sum(1, 9);

    //使用断言
    /**
     * 1.Assert 是一个断言类,(就是判断实际返回的值和期望值是否相同)
     * 2.如果res 和 "sum=10" 是相同的,则通过断言
     * 3.如果res 和 "sum=10" 是不相同的,则给出提示
     *
     */
    Assert.assertEquals("sum=10", res);
}
  1. 创建pom.xml, 从快速入门项目拷贝一份即可. 放在和src 同级目录即可, 提示:使用记事本来保存, 保证该文件的编码是utf-8
    <!--
        解读:modelVersion
        1. 描述这个pom文件/pom模型遵循的哪个版本
        2. 对应maven2 和 maven3 而言, 这里的modelVersion只能是4.0.0
    -->
    <modelVersion>4.0.0</modelVersion>

    <!--
        解读: 下面是指定该项目的坐标, 是创建项目时,程序员指定
        1. groupId: 组织名
        2. artifactId: 项目名
        3. version: 版本
    -->
    <groupId>com.wedu</groupId>
    <artifactId>java-project-maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--
        解读
        1. 这里就是引入项目需要的jar包, 类似传统项目的import jar的作用
        2. 在 dependencies标签内, 可以指定多个需要依赖的jar /导入jar
        3. 引入的jar包需要一个完整的jar包坐标, 从mvn仓库查询得到
    -->
    <dependencies>
        <dependency>
            <!-- 依赖jar的 groupId : 组织名-->
            <groupId>junit</groupId>
            <!-- 依赖jar的 artifactId : 项目名-->
            <artifactId>junit</artifactId>
            <!-- 依赖jar的 version : 版本-->
            <version>4.12</version>
        </dependency>

在这里插入图片描述

完成编译

  1. 执行如下指令,完成maven 项目的编译,会得到源代码对应的class 文件(如图)

在这里插入图片描述

  1. 编程成功,会自动创建target 目录,并生成对应的.class 文件(如图)

在这里插入图片描述

  1. 细节说明: 第一次速度慢,需要下载相关jar,后面就快了.

完成测试

  1. 执行如下指令,完成maven 项目的测试,(如图)

在这里插入图片描述

  1. 测试指令执行完毕,会生成Test 源文件的class , 还会输出测试结果.

在这里插入图片描述

在这里插入图片描述

  1. 细节说明: 第一次速度慢,需要完成一些初始化工作,后面就快了.

完成打包

  1. 执行如下指令,完成maven 项目的打包,输出jar, 可以供其它模块使用(如图)

在这里插入图片描述

  1. 打包后,在target 目录生成对应的打包文件jar

在这里插入图片描述

完成安装

  1. 为了演示方便, 把当前maven 的settings.xml 的仓库恢复到默认的, 修改D:\program\apache-maven-3.6.3-bin\apache-maven-3.6.3\conf\settings.xml

在这里插入图片描述

  1. 执行install 指令,能完成maven 项目的安装,会把打包得到的jar, 提交到本地仓库

在这里插入图片描述

在这里插入图片描述

  1. 说明: 如果没有修改settings.xml 成默认的仓库路径, install 后, 生成的jar 会在指定的仓库路径下.
  2. 注意当把hello-project-1.0.jar 提交到本地仓库后,该jar 也可以被其他maven 项目使用了,非常方便

完成清理

  1. 执行如下指令,完成maven 项目的清理,会清除生成的target 目录

在这里插入图片描述

  1. 应用场景,比如我们希望把源码进行拷贝或移植, 或者希望来一次全新的bulid,就可以先进行clean

小结Maven 构建指令

● 说明: Maven 构建命令使用mvn 开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔

mvn compile #编译
mvn clean #清理
mvn test #测试
mvn package #打包
mvn install #安装

IDEA 创建Maven Web 工程

需求说明/图解

使用IDEA 创建Maven WEB 项目, 可以运行hello,world 页面

注意体会Maven WEB 项目和前面创建的Maven java 项目不同

创建Maven web 项目

创建maven web 工程

web-hello-maven 工程

在这里插入图片描述

在这里插入图片描述

创建成功的maven web 项目结构

在这里插入图片描述

创建的pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<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>4.0.0</modelVersion>

  <!--
  解读
  1. groupId 、artifactId、version就是 maven项目坐标
  2. packaging: 打包方式,默认是jar, 因为当前是web项目,所以这里打包成war
  -->
  <groupId>com.wyxedu</groupId>
  <artifactId>web-hello-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>web-hello-maven Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <!-- maven项目的属性, 根据实际情况,可以修改 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>


  <dependencies>
    <!-- 默认引入的jar -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!--默认引入的maven插件, 前面说过mvn的各种指令compile/install/test等都是由插件完成的 -->

  <build>
    <finalName>web-hello-maven</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

配置Tomcat 服务器&运行

  1. 为maven web 项目配置tomcat

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

war:先打包成war 包,再把该war 包部署到服务器上

war exploded:直接把文件夹、class 文件等等移到Tomcat 上进行部署。因此这种方式支持热部署,一般在开发的时候都是使用这种模式

在这里插入图片描述

依赖管理

依赖配置

一句话: 依赖指当前项目运行需要的jar,一个项目可以设置多个依赖

依赖的举例

<!-- 解读:
1. 这里就是引入项目需要的jar 包, 类似传统的import jar 的作用
2. 在dependencies 标签内,可以指定多个需要依赖的jar/导入的jar
3. 引入的jar 包需要一个完整的jar 包坐标,从mvn 仓库查询即可得到-->
<dependencies>
    <!-- 引入的一个具体的依赖jar, 包括一个完整的依赖坐标-->
    <dependency>
        <!-- 依赖的gruopid: 组织名-->
        <groupId>junit</groupId>
        <!-- 依赖的项目名-->
        <artifactId>junit</artifactId>
        <!-- 依赖的版本-->
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

依赖传递

直接依赖

一句话: 在当前项目中通过依赖配置建立的依赖关系

举例说明

  1. 创建maven_A java 项目

在这里插入图片描述

  1. 在maven_A 项目中引入mysql5.1.47 , 这时我们就说maven_A 项目直接依赖mysql5.1.47jar
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
</dependencies>
  1. 如图

在这里插入图片描述

间接依赖

一句话: 当前项目直接依赖资源(比如m1), 而m1 又依赖资源(m2),我们就说当前项目间接依赖资源(m2)

举例说明

  1. 创建maven_B java 模块(为了好理解,我们放在一个项目中)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 修改D:\java_projects\maven_B\pom.xml , 引入junit4.12
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
  1. 修改D:\java_projects\maven_A\pom.xml , 引入maven_B
<dependencies>
    <!-- 引入maven_B -->
    <dependency>
        <groupId>com.wyx</groupId>
        <artifactId>maven_B</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
</dependencies>
  1. 观察maven_A 和maven_B 的依赖情况

在这里插入图片描述

依赖冲突

路径优先

  1. 路径优先∶当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  2. 示意图说明:

在这里插入图片描述

  1. 解释项目A 依赖情况
    1. 如果1 度资源有junit 4.1 , 而2 度资源有junit4.2
    2. 根据路径优先原则, 项目A 生效的是junit4.1
  2. 举例说明.
  1. 创建maven_C(为了方便观察,仍然放在一个项目中), 创建方式和maven_B 类似,就不截图了

在这里插入图片描述

  1. 修改D:\java_projects\maven_C\pom.xml, 引入junit4.13
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
    </dependency>
</dependencies>
  1. 修改D:\java_projects\maven_B\pom.xml, 引入maven_C
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.wyx</groupId>
    <artifactId>maven_B</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- 引入maven_C -->
        <dependency>
            <groupId>com.wyx</groupId>
            <artifactId>maven_C</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>
  1. 刷新工程,看看maven_A 生效的就是路径优先的maven_B 的junit4.12

在这里插入图片描述

  1. 为了验证是哪个junit 生效了, 还可以通过代码来验证, 写一段代码D:\java_projects\maven_A\src\main\java\HelloTest.java

在这里插入图片描述

声明优先

  1. 声明优先∶当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
  2. 示意图说明:

在这里插入图片描述

图解项目A 依赖情况

  1. 如果1 度(灰框)资源有junit 4.1 , 而1 度(蓝框)资源有junit4.2
  2. 根据声明优先原则, 要看项目A , 在pom.xml 引入的顺序,先引入的就是生效的
  1. 举例说明.
  1. 创建maven_D(为了方便观察,仍然放在一个项目中), 创建方式和maven_B 类似,就不截图了

在这里插入图片描述

  1. 修改D:\java_projects\maven_D\pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>4.0.0</modelVersion>
    <groupId>com.wyx</groupId>
    <artifactId>maven_D</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
    </dependencies>
</project>
  1. 修改D:\java_projects\maven_A\pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>4.0.0</modelVersion>
    <groupId>com.wyx</groupId>
    <artifactId>maven_A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- 引入maven_D -->
        <dependency>
            <groupId>com.wyx</groupId>
            <artifactId>maven_D</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 引入maven_B -->
        <dependency>
            <groupId>com.wyx</groupId>
            <artifactId>maven_B</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>
</project>

在这里插入图片描述

  1. 为了验证是junit4.13.2 生效还是junit4.12 生效, 写一段代码D:\java_projects\maven_A\src\main\java\HelloTest.java

在这里插入图片描述

特殊优先

  1. 特殊优先∶当同级配置了相同资源的不同版本,后配置的覆盖先配置的(提醒:要尽量避免这种没有意义的冲突)
  2. 修改D:\java_projects\maven_A\pom.xml, 引入mysql5.1
<?xml version="1.0" encoding="UTF-8"?>
<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>4.0.0</modelVersion>
    <groupId>com.wyx</groupId>
    <artifactId>maven_A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- 引入maven_D -->
        <dependency>
            <groupId>com.wyx</groupId>
            <artifactId>maven_D</artifactId>
        
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 引入maven_B -->
        <dependency>
            <groupId>com.wyx</groupId>
            <artifactId>maven_B</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!-- 引入mysql5.1.43 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.43</version>
        </dependency>
    </dependencies>

</project>
  1. 根据特殊优先原则: maven_A 生效的是mysql5.1.43

在这里插入图片描述

  1. 测试完后,注销到引入mysql5.1.43 , 这里是为了验证.

可选依赖

一句话: 可选依赖指对外隐藏当前所依赖的资源- 不透明

举例说明

  1. 需求: 隐藏maven_D 项目的junit 依赖,不让其他项目来使用
  2. 修改D:\java_projects\maven_D\pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>4.0.0</modelVersion>
    <groupId>com.wyx</groupId>
    <artifactId>maven_D</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!-- 解读
            1. option 默认是false , 即不隐藏
            2. option 设置为true , 即隐藏-->
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>
  1. 刷新maven 管理器,看maven_A 的变化

在这里插入图片描述

  1. 测试完毕后,别忘了恢复原来状态.

排除依赖

一句话: 排除依赖指主动断开依赖的资源, 被排除的资源无需指定版本- 不需要

举例说明

  1. 需求: maven_A 项目主动排除maven_D 的junit4.13.2 这个依赖
  2. 修改D:\java_projects\maven_D\pom.xml
<!-- 引入maven_D -->
<dependency>
    <groupId>com.wyx</groupId>
    <artifactId>maven_D</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除junit-->
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  1. 刷新maven 管理器,看maven_A 的变化, 仍然是拿不到junti4.13.2, 提示: 再通过HelloTest.java 来验证实际使用的junit 版本, 更加清晰了.

在这里插入图片描述

可选依赖和排除依赖区别

一句话: 隐藏依赖是不让其他项目来引用(我不给), 排除依赖是主动不要引入的某个资源(我不要)

依赖范围

作用范围

一句话: 依赖的jar 默认情况可以在任何地方使用, 通过scope 标签设定其作用范围

举例说明

● 作用范围说明

  1. 主程序范围有效(src/main 文件夹范围内)
  2. 测试程序范围有效(src/test 文件夹范围内)
  3. 是否参与打包(package 指令范围内)
  4. compile(默认,在主程序、测试代码、打包都有效)

● 作用范围一览图

在这里插入图片描述

解读

  1. 某个引入的jar 包作用范围是程序员根据,业务的实际需要来设置的,不要认为是固定的。
  2. 比如log4j jar 包,在主程序,测试代码,打包都是需要的, 因此作用范围应当设置为complie
  3. junit 只是测试代码需要,因此作用范围设置为test 合适,但是如果程序员认为在主程序和打包就是要junit, 仍然可以设置为默认compile
  4. 比如servlet-api 是tomcat 自己带的,当把程序打包放到生产环境时,用生产环境tomcat 的servlet-api 即可,所以设置为provided 合适,这样就放在servlet-api 版本冲突.
  5. 比如jdbc, 是第三方的jar , 打包放在生产环境,就应当在自己的包提供jdbc 驱动包,否则程序会因为少驱动包,运行失败

● 看一个案例, 体会依赖范围的特点.

<?xml version="1.0" encoding="UTF-8"?>
<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>4.0.0</modelVersion>
    <groupId>com.wyx</groupId>
    <artifactId>maven_D</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!-- 解读
            1. option 默认是false , 即不隐藏
            2. option 设置为true , 即隐藏-->
            <optional>false</optional>
            <!-- scope 设置为test, 让他在test 范围有效-->
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
  1. 创建D:\java_projects\maven_D\src\test\java\T2.java, 在test 范围正常使用
import org.junit.Test;

public class T2 {
    @Test
    public void f1(){
    }
}
  1. 创建D:\java_projects\maven_D\src\main\java\T1.java, 在主程序中,报错

在这里插入图片描述

  1. 修改D:\java_projects\maven_D\pom.xml, 发现主程序和测试程序都可以使用了.
<optional>false</optional>
<!-- scope 设置为test, 让他在test范围有效, 默认就是compile,可以不设置-->
<scope>compile</scope>

在这里插入图片描述

在这里插入图片描述

  1. 运行maven web 项目

在这里插入图片描述

Maven 项目构建生命周期

一句话: Maven 构建生命周期描述的是一次构建过程经历了多少个事件

在这里插入图片描述

生命周期的3 大阶段

clean

清理工作

在这里插入图片描述

default

核心工作,例如编译,测试,打包,部署等

在这里插入图片描述

site

产生报告,发布站点等

在这里插入图片描述

生命周期是分阶段执行的

一句话: 项目构建生命周期分很多阶段,并不是每次都完整执行,而是根据用户的要求来执行的【比如你执行compile, 那么就执行到complie 这个阶段,如果你执行install, 则会执行compile->test->package->install】

举例说明

1、演示compile

在这里插入图片描述

2、演示install

在这里插入图片描述

maven 插件

介绍

1、插件与生命周期内的某个阶段绑定,在执行到对应生命周期时, 由对应插件来完成任务/功能.

2、maven 插件很多,先看一张图:

在这里插入图片描述

3、通过插件可以自定义其他功能

4、文档: http://maven.apache.org/plugins/index.html

自定义插件-应用实例

需求: 在pom.xml 加入自定义插件,能够在对maven_D 项目打包时,能输出主程序和测试程序的源码

完成步骤

  1. 当前package 只会得到项目的jar

在这里插入图片描述

  1. 修改D:\java_projects\maven_D\pom.xml, 加入maven 插件并配置(注意: 加入自定义插件后,可能会爆红,重启项目即可.)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         韩顺平Java 工程师
         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>4.0.0</modelVersion>
    <groupId>com.wyx</groupId>
    <artifactId>maven_D</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!-- 解读
            1. option 默认是false , 即不隐藏
            2. option 设置为true , 即隐藏-->
            <optional>false</optional>
            <!-- scope 设置为test, 让他在test 范围有效-->
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <!--在build 时,自定义的插件-->
    <build>
        <plugins>
            <plugin>
                <!-- 插件坐标-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <!-- 对主程序输出源码打包-->
                            <goal>jar</goal>
                            <!-- 对测试程序输出源码打包-->
                            <goal>test-jar</goal>
                        </goals>
                        <!-- 在generate-test-resources 阶段执行-->
                        <phase>generate-test-resources</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  1. 观察一下maven 项目管理器

在这里插入图片描述

  1. 再次执行maven-D 的intall 操作, 会得到两个新的jar ,分别包含了主程序和测试程序的源码。(说明: 测试时,需要保证src/main/… 和src/test/… 两个目录下有java 源代码,否则不会生成源码jar)

在这里插入图片描述

  1. 解压得到jar , 可以看到源码了.

在这里插入图片描述

maven 插件-maven 构建生命周期关系图

在这里插入图片描述

图解

  1. 在maven 项目构建生命周期中,每个阶段的执行都有相应的插件完成

  2. 各个插件执行过程中,会附带输出内容,比如jar/war/xml/源码

  3. 程序员可以使用maven 默认的插件,也可以自定义插件,完成定制任务.

  4. 自定义插件引入成功, 是可以看到

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Map集合的获取功能】

Map集合的获取功能 V get(Object Key)&#xff1a;根据键获取值 package com.gather.map; //Map集合的获取功能 import java.util.HashMap; import java.util.Map; public class MapDemo03 {public static void main(String[] args) {Map<String,String> mapnew HashMap&…

一步步搭建基于 ts + express + prisma + mongodb + zod 后端服务

环境&#xff1a; windows11、node 18.16.0 、pnpm 1、在合适位置&#xff0c;代开 vscode , 终端执行 mkdir miaooo-backend && cd miaooo-backend && npm init -y 。 创建一个名为一个 miaooo-backend 的项目&#xff0c;并且进入项目 执行 npm 默认初始化。…

【SpringCloud——Seata分布式事务管理框架】

一、分布式事务存在的问题 在分布式系统下&#xff0c;一个业务跨越多个服务或数据源&#xff0c;每个服务都是一个分支事务&#xff0c;要保证所有分支事务最终状态一致&#xff0c;这样的事务就是分布式事务。 分布式事务和传统形式的事务区别有什么&#xff1f;众所周知&a…

【GIS教程】使用高程数据在UE5中创建真实山脉模型

在数字孪生项目中&#xff0c;我们经常需要使用真实的山脉地形作为城市模型展示的基础。然而&#xff0c;UE5的默认地形系统过于复杂&#xff0c;无法像3D模型那样进行实时修改。因此&#xff0c;本教程将指导您如何将高程山脉作为模型导入到UE5引擎中&#xff0c;而不是使用UE…

【微服务】SpringBoot 插件化开发模式详细总结

目录 一、前言 1.1 使用插件的好处 1.1.1 模块解耦 1.1.2 提升扩展性和开放性 1.1.3 方便第三方接入 1.2 插件化常用实现思路 二、Java常用插件实现方案 2.1 serviceloader方式 2.1.1 java spi 2.1.2 java spi 简单案例 2.2 自定义配置约定方式 2.2.1 添加配置文件…

36.SpringBoot实用篇—运维

目录 一、实用篇—运维。 &#xff08;1&#xff09;程序打包与运行&#xff08;Windows版&#xff09;。 &#xff08;2&#xff09;spring-boot-maven-plugin插件作用。 &#xff08;3&#xff09;程序打包与运行&#xff08;Linux版&#xff09;。 &#xff08;4&#…

syntax error: unexpected end of file

运行工程报错误&#xff1a;liporepo.sh: line 2: command not found liporepo.sh: line 19: syntax error: unexpected end of file Command PhaseScriptExecution failed with a nonzero exit code 由于.sh文件的格式为dos格式。而linux只能执行格式为unix格式的脚本。因为在…

【svopro】代码梳理

SVO2系列之深度滤波DepthFiltersvo_noteSVO&#xff08;SVO: fast semi-direct monocular visual odometry&#xff09;SVO 半直接视觉里程计【DepthFilter】深度滤波器【svopro】代码梳理 svo processFrame代码梳理 1.0 processFrame主流程1.1 sparseImageAlignment1.1.1 核心…

100天精通Golang(基础入门篇)——第6天: 深入解析Go语言中的运算符

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

Kafka详解(二)

Kafka命令行操作 [aahadoop102 ~]$ cd /opt/module/kafka/bin/ [aahadoop102 bin]$ ll 可以看到自带了zookeeper主题命令行操作 查看操作主题命令需要的参数 [aahadoop102 kafka]$ bin/kafka-topics.sh重要的参数如下查看当前服务器中的所有topic [aahadoop102 kafka]$ bin…

Socket 编程:基础概念辨析

文章目录 参考Socket APIBSD UNIX 操作系统BSD UNIX 与 Socket API Socket套接字套接字地址套接字 VS 套接字地址套接字的表示方法 TCP 套接字与 UDP 套接字TCP 套接字监听套接字连接套接字 UDP套接字 TCP 服务器端与 TCP 客户端通信的基本流程服务器端客户端 参考 项目描述刘…

大学物理(上)-期末知识点结合习题复习(4)——质点运动学-动能定理 力做功 保守力与非保守力 势能 机械能守恒定律 完全弹性碰撞

目录 1.力做功 恒力作用下的功 变力的功 2.动能定理 3.保守力与非保守力 4.势能 引力的功与弹力的功 引力势能与弹性势能 5.保守力做功与势能的关系 6.机械能守恒定律 7.完全弹性碰撞 题1 题目描述 题解 题2 题目描述 题解 1.力做功 物体在力作用下移动做功…

软件测试商城项目优惠券超发问题该怎么测试?

在拼夕夕面试中&#xff0c;面试官问了一连串经典的问题&#xff1a;“优惠券库存是怎么扣减的&#xff1f;开发为了解决超发优惠券问题而设计的方案&#xff0c;你了解过吗&#xff1f;你又是如何测试的呢&#xff1f;” 当时听到这些问题还挺懵的&#xff0c;没遇到过超发问…

MIsc(5)

ningen 打开后是一张生物图片&#xff0c;利用010打开后文件头没问题的&#xff0c;但是在文件末尾好像是包含了一个txt文件 拿到kali里利用binwalk分离出一个zip文件&#xff0c;但是需要密码打开 既然提示了资环4位数字的密码&#xff0c;那就可以直接爆破 获得flag 小明的保…

KCD 北京站报名开启 | 云原生英雄帖,邀您京城聚首

各位云原生社区侠客&#xff0c; 仲夏十七&#xff0c;风云际会。 江湖号召&#xff0c;原生论道。 2023 年 6 月 17 日&#xff0c;京城将迎来一场关于云原生的武林盛会——Kubernetes Community Days (KCD) 2023 北京站。 经过一轮公开的议题招募&#xff0c;KCD Beijing…

Jetpack Compose —— Image

在 Jetpack Compose 中&#xff0c;Image 是一个重要的组件&#xff0c;用于显示图像和处理图像相关的操作。 一、Image在Compose中的简单使用 二、如何网络调用Image 一、Image在Compose中的简单使用 首先&#xff0c;让我们了解一下 Image 组件的基本用法。要在 Jetpack C…

复习之linux系统中的软件管理

一、linux系统中软件包 1.软件包的类型 "注意在rhel8中只能使用绿色软件,源码编译软件和rpm软件" 类型支持的条件DEBUBlinux DEBlinux&#xff08;用不了&#xff09;RPM#redhat centOS fadorabz2|gz|xz#1.需要源码安装需要编译 #2.绿色软件,直接可用 #ntfs-3g_nt…

2023下半年杭州/广州/东莞/深圳软考(中/高级)认证,这里报名

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

如何成为一名全职创作者——程序员篇

哈喽大家好&#xff0c;我是咸鱼 今天跟大家分享一篇文章&#xff0c;这篇文章的作者 Gergely Orosz 是一名程序员&#xff0c;他从 Uber 辞职以后&#xff0c;就当起了全职创作者 他通过写文章、卖课程、做视频等谋生&#xff0c;今天这篇文章是他对这种商业模式的思考&…

内网渗透-windows远程用户管理

文章目录 0x01 获取window权限&#xff08;管理员&#xff09;0x02 添加用户&#xff0c;并且到管理员组0x03 开启远程桌面0x04 添加到远程桌面组0x05 进行远程0x06 免责声明 0x01 获取window权限&#xff08;管理员&#xff09; 使用cs上线用户 kali:192.168.253.234 window …