基于 IDEA 进行 Maven 工程构建

 一、构建概念和构建过程

        项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。

        项目构建是软件开发过程中至关重要的一部分,它能够大大提高软件开发效率,使得开发人员能够更加专注于应用程序的开发和维护,而不必关心应用程序的构建细节。

        同时,项目构建还能够将多个开发人员的代码汇合到一起,并能够自动化项目的构建和部署,大大降低了项目的出错风险和提高开发效率。常见的构建工具包括 Maven、Gradle、Ant 等。

二、命令方式构建项目

2.1 命令总结

        相关的命令总结如下:

命令描述
mvn compile编译项目,生成 target 文件
mvn package打包项目,生成 jar 或 war 文件
mvn clean清理编译或打包后的项目结构
mvn install打包后上传到 maven 本地仓库
mvn deploy只打包,上传到 maven 私服仓库
mvn site生成站点
mvn test执行测试源码

        如果 war 包打包插件和 jdk 版本不匹配,可以在 pom.xml 添加以下代码:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin></plugins>
</build>

2.2 mvn compile

        mvn compile 命令的作用是编译项目(只编译核心程序,不编译测试程序),生成 target 文件,并将 .java 文件编译成 .class 文件,我们演示下,首先我们引入依赖,并创建相关类,如下:

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version><scope>test</scope>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version><scope>provided</scope>
</dependency>
package com.maven;import lombok.Data;
import lombok.Getter;
import lombok.Setter;@Data
@Setter
@Getter
public class User {private String name;private int age;
}
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;public class MavenTest {@Testpublic void testAssert(){int a = 10;int b = 20;// 如果期望结果为 30,则无输出,否则直接报错Assertions.assertEquals(a+b,40);}
}

         首先进入该工程的目录,然后在该目录下打开命令行,如下图:

        并在命令行执行 mvn -compile,如下图,可以看到,编译成功了,并将 .java 文件编译成了 .class 文件

2.3 mvn clean

        mvn clean 命令的作用是清理编译或打包后的项目结构,我们演示下,还是在原来的目录结构下执行这个命令,看看是否可以清除掉

        可以看到,target 目录没有了 

2.4 mvn test-compile

        mvn test-compile 命令的作用是编译测试程序(不编译核心程序,只编译测试程序),生成 target 文件,并将 .java 文件编译成 .class 文件。

        我们接下来演示下,首先我们可以发现,虽然我们执行了 compile 命令,但是好像并没有对我们的测试代码进行编译,如下图:

        此时我们再执行 mvn test-compile 命令,如下,可以看到,对我们的测试程序进行了编译。

2.4 mvn test

2.4.1 案例

        mvn test 命令的作用是会自动执行测试方法。我们接下来演示下,如下图,运行成功了,正确的结果应该是 30,但是我们断言的结果为 40,所以才会报错。

        将结果改为 30 之后,再次执行命令,可以发现,不报错了。

2.4.2 注意

        1、调用 mvn test 命令时会自动调用 mvn compile 和 mvn test-compile 命令。

        2、test 目录里面的测试代码是有讲究的,比如说要测试的类必须以 Test 开头或者以 Test 结尾,如果不是这样的格式, mvn test 命令是无法识别的,比如下面的这个测试类。

public class MavenDemo {@Testpublic void testAssert(){int a = 10;int b = 20;// 如果期望结果为 30,则无输出,否则直接报错Assertions.assertEquals(a+b,30);}
}

        都没有找到测试类,如下 

        3、测试类里面的方法名也是有讲究的,以 test 开头的方法都可以识别(和方法上有没有 @Test 注解没有关系),如果是随便起的或者 test 在方法后面的都无法识别,如下

public class MavenTest {@Testpublic void aaa(){int a = 10;int b = 20;// 如果期望结果为 30,则无输出,否则直接报错Assertions.assertEquals(a+b,30);}
}

        方法后面加 test ,如下:

public class MavenTest {@Testpublic void assertTest(){int a = 10;int b = 20;// 如果期望结果为 30,则无输出,否则直接报错Assertions.assertEquals(a+b,30);}
}

2.5 报告

        maven 项目构建有一个阶段是报告,这个报告就是记录我们测试的结果,我们并不用使用具体的指令来实现报告的过程,执行测试之后会自动执行测试的结果,可以执行下面的命令先清理再进行测试

mvn clean test

        执行结束后会在 target 目录下生成一个 surefire-reports 文件夹,它里面存储的就是测试的结果

        这个就是具体的报告 

2.6 打包

        打包的意思就是把我们的工程构建成 jar 或者 war,它所对应的命令为 mvn package,

        需要注意的是,在进行打包操作时,它首先会将核心代码和测试代码编译,还会执行我们的测试代码。换句话说就是一次打包会进行多次操作。

2.6.1 构建 jar 包

        生成一个新的 jar 包,如下。

        在最终构建成的 jar 或者 war 包里面,都是没有测试程序的。

2.6.2 构建 war 包

        切换到 web 模块下,构建成 war 包,如下所示:

2.7 安装

        安装的意思就是把我们上面构建成的 jar 包或者 war 包安装到本地仓库里面。在介绍这个之间,先来看下下面的场景。

        现在的项目结构如下所示,maven_java 是一个模块,maven_web 是一个模块,如下:

        如果我想在 maven_web 模块里面使用 maven_java 里面的相关 api,只需要在 maven_web 的 pom.xml 里面引入 maven_java 的依赖即可,如下:

<?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.maven</groupId><artifactId>maven_web</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- 引入 maven_java 依赖--><dependency><groupId>com.maven</groupId><artifactId>maven_java</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

        接下来对 maven_web 模块进行打包操作,如下:

        可以发现报错了,是因为在打包的过程中没有发现 maven_java 这个依赖,在打包的过程中需要先去本地仓库寻找 jar 包,如果没有找到则去中央仓库寻找。这两个地方都没有,因为这是我们自己的模块,怎么可能有。

        这个时候就需要用到我们的 mvn install 命令了。它会将我们的 jar 包或者 war 包安装到本地仓库。

        进入到 maven_java 模块的目录下,执行 mvn install 命令,就可以将我们的工程打成 jar 包并放到本地仓库里面,如下:

        在本地仓库里面可以看见我们安装的 jar 包,如下: 

        此时,我们再次编译 maven_web 项目,就成功了,如下:

2.8 打包和安装区别

        1、打包是将工程打成 jar 或 war 文件,保存在 target 目录下

        2、安装是将当前工程所生成的 jar 或 war 文件,安装到本地仓库,会按照坐标保存到指定位置

三、可视化方式构建项目

        打开 idea ,点击右侧的 Maven ,如下,Lifecycle 的意思是生命周期,Plugins 是插件,Dependencies 是项目的依赖。

3.1 Lifecycle

        生命周期里面的命令有些和我们的命令一样,有些不一样,比如 validate 和 verify 是对我们的 maven 工程进行验证用的,其他的命令基本都一样。

3.2 Plugins

        插件里面的命令和生命周期里面的命令基本一样,这些都是我们的 maven 工程中默认的插件,是用来支持生命周期的插件,点击插件里面的 clean 命令和点击生命周期里面的 clean 命令效果一样。

四、构建插件、命令和生命周期之间的关系

4.1 构建生命周期

        我们发现一个情况,当我们执行 package 命令也会自动执行 compile 命令,如下图

        这种行为就是因为构建生命周期产生的!构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令。

4.2 构建周期作用

        构建周期会简化构建过程。比如说项目打包,只需要执行 mvn clean package 即可。主要包含两个构建生命周期。

        1、清理周期:主要是对项目编译生成文件进行清理,如 clean 。

        2、默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分,如 compile -  test - package - install - deploy 等。

4.3 插件、命令、周期三者关系

        1、周期 → 包含若干命令 → 包含若干插件

        2、使用周期命令构建,简化构建过程,最终进行构建的是插件。

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

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

相关文章

【Docker】CentOS stream 上安装 Docker 环境详细指南

文章目录 1. 定义2. 优势3. 安装1&#xff09;Linux 上安装&#xff08;强烈推荐&#xff09;2&#xff09;Windows 和 MAC 上安装 4. 验证1&#xff09;查看版本2&#xff09;运行 Hello World 总结 Docker 是一种轻量级的容器化技术&#xff0c;提供了一种在不同环境中快速、…

Maven普通工程和web工程创建

文章目录 创建项目前设置maven工程前设置工作创建项目前--》设置utf-8配置maven参数Maven普通工程和web工程创建Maven简单工程第一步&#xff1a;File–New–Project 第二步&#xff1a;选择maven然后下一步&#xff1a;填写后询选择finish初始化maven工程目录简介maven简单工程…

vue3 | 自定义遮罩层组件

组件模板 <template><Teleport to"body" :disabled"!appendToBody"><div v-bind"$attrs" v-show"modelValue" class"maskLayer-overlay" :style"{ background }"><div class"maskLaye…

python中字符串常用的操作

在Python中&#xff0c;字符串是一种不可变的序列类型&#xff0c;它支持许多常用的操作。以下是一些常见的字符串操作&#xff1a; 字符串拼接&#xff1a; 使用 运算符可以将两个字符串拼接在一起。 str1 "Hello" str2 "World" result str1 "…

Rust-借用检查

Rust语言的核心特点是&#xff1a;在没有放弃对内存的直接控制力的情况下&#xff0c;实现了内存安全。 所谓对内存的直接控制能力&#xff0c;前文已经有所展示&#xff1a;可以自行决定内存布局&#xff0c;包括在栈上分配内存&#xff0c;还是在堆上分配内存&#xff1b;支…

使用vue快速开发一个带弹窗的Chrome插件

vue-chrome-extension-quickstart 说在前面 &#x1f388;平时我们使用Chrome插件通常都只是用来编写简单的js注入脚本&#xff0c;大家有没有遇到过需要插件在页面上注入一个弹窗呢&#xff1f;比如我们希望可以通过快捷键快速唤起ChatGPT面板或者快速唤起一个翻译面板&#x…

使用 Jaxb xml转JavaBean

1、什么是JAXB JAXB&#xff08;Java Architecture for XML Binding) 是一个业界的标准&#xff0c;是用于 XML 绑定的 Java 体系结构&#xff08;JAXB&#xff09;是允许将 Java 类映射到 XML 表示形式的软件框架。 JAXB 支持将 Java 对象编组为 XML&#xff0c;然后将 XML 解…

自动化革命:大象机器人的Mercury A1机械臂

引言 大象机器人的Mercury系列&#xff0c;是面向工业自动化和智能制造的新型机械臂产品线。这些机械臂不仅在设计上创新&#xff0c;还在材料选择上使用了碳纤维、铝合金和工程塑料等轻质强韧材料&#xff0c;搭载高精度谐波减速器。Mercury系列的推出&#xff0c;反映了大象机…

day2:TCP、UDP网络通信模型

思维导图 机械臂实现 #include <head.h> #define SER_POTR 8899 #define SER_IP "192.168.125.223" int main(int argc, const char *argv[]) {//创建套接字int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror("");return -1;}//链接struct so…

部署MinIO

一、安装部署MINIO 1.1 下载 wget https://dl.min.io/server/minio/release/linux-arm64/minio chmod x minio mv minio /usr/local/bin/ # 控制台启动可参考如下命令, 守护进程启动请看下一个代码块 # ./minio server /data /data --console-address ":9001"1.2 配…

JavaWeb,JavaScript的学习(下)

事件 事件可以是浏览器行为&#xff0c;也可以是用户行为。当这些行为发生时&#xff0c;可以自动触发对应的JS函数的运行&#xff0c;称之为事件发生。JS的事件驱动指的就是行为触发代码运行的特点 常见事件 鼠标事件 onclick&#xff1a;当用户点击某个对象时调用的事件句…

fuckingAlgorithm【双指针】19.删除链表的倒数第N个结点

19. Remove Nth Node From End of List remove-nth-node-from-end-of-list 要寻找倒数k个节点&#xff0c; 从虚拟头节点0开始走&#xff0c;p1指针先走k步&#xff0c;到达第k个节点然后p2指针从虚拟节点0开始&#xff0c;和p1一起同步前进&#xff0c;直到p1走到末尾n1节点…

LeetCode——82. 删除排序链表中的重复元素II

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;题目的大致意思就是&#xff0c;给你一个升序的链表&#xff0c;然后让你里面的元素有重复的&#xff0c;所有重复的元素都进行一个删除。思路&#xff1a;这个题的简化版是“83.删除排序链表中的重复元素”。看…

深度学习笔记(七)——基于Iris/MNIST数据集构建基础的分类网络算法实战

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 认识网络的构建结构 在神经网络的构建过程中&#xff0c;都避不开以下几个步骤&#xff1a; 导入网络和依…

【Android+物联网】Android封装MQTT连接阿里云物联网平台

前言&#xff1a; 亲测可行&#xff0c;本文实现Android封装MQTT连接阿里云物联网平台。将MQTT协议和连接阿里云平台的操作通过Android studio写入APP中&#xff0c;并简单设计UI。实现手机APP远程控制单片机LED灯亮灭的功能。 关于《Android软件开发》&#xff0c;见如下专栏…

手拉手Vue3生命周期实战应用

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&#xff0c;让开发者有机会在特定阶…

HTTPS是什么意思

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer&#xff0c;中文含义为“超文本传输协议在安全加密字层”&#xff0c;简单来说就是加密数据传输&#xff0c;通俗的说就是安全连接。 HTTPS安全超文本传输协议&#xff0c;它是一个安全通信通道&#xff0c;它…

SpringAMQP的使用

1. 简介&#xff1a; SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; 自动声…

【linux】查看Debian应用程序图标对应的可执行命令

在Debian系统中&#xff0c;应用程序图标通常与.desktop文件关联。您可以通过查看.desktop文件来找到对应的可执行命令。这些文件通常位于/usr/share/applications/或~/.local/share/applications/目录下。这里是如何查找的步骤&#xff1a; 1. 打开文件管理器或终端。 2. 导…

20240115如何在线识别俄语字幕?

20240115如何在线识别俄语字幕&#xff1f; 2024/1/15 21:25 百度搜索&#xff1a;俄罗斯语 音频 在线识别 字幕 Bilibili&#xff1a;俄语AI字幕识别 音视频转文字 字幕小工具V1.2 BING&#xff1a;音视频转文字 字幕小工具V1.2 https://www.bilibili.com/video/BV1d34y1F7…