java回顾:Maven高级

news2025/6/9 23:03:04

目录

一、私服搭建

二、Maven高级

2.1、依赖范围

2.2、依赖传递

2.3、依赖可选 

2.4、依赖排除

2.5、依赖冲突

三、ssm工程改造成分层构建

3.1、maven的继承 

3.2、继承的一些应用

3.3、maven的聚合(多模块开发)


一、私服搭建

https://blog.csdn.net/m0_56678122/article/details/128382822

二、Maven高级

2.1、依赖范围

对于servlet依赖必须加provide,因为运行时tomcat自身包含servlet,会冲突报错。

环境:
测试环境:test包下的代码
编译环境:书写java代码的环境。
运行环境:war+tomcat环境

依赖范围:
provide:作用于编译时和测试时,不做用于运行时。 例如servlet。因为tomcat已经提供了。
runtime: 作用于运行时和测试时,但是不作用于编译时。例如mysql驱动。
test:只需要作用于测试时。 例如junit
compile:默认值,作用于运行时,编译时,测试时。

绝大多数情况,依赖范围用的不好,只是造成资源的浪费,并不会有其他影响。
但是对于servlet的依赖范围,provide是必须要添加的,要不然会报错。 

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--如加入test范围,那么只能在test环境包下使用@Test注解,
            且打包后lib文件夹中也不会有test相关文件-->
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <!--必须要加provided因为运行时tomcat自身包含servlet,会冲突,
            打成war包后lib文件夹下有servlet的jar包-->
            <scope>provided</scope>
        </dependency>

2.2、依赖传递

 依赖传递:
如果A依赖于B,当引入依赖A的时候,maven会自动的引入A所依赖的B.

例如:
spring-context 依赖于spring-core等等。
所以我们引入spring-context,会自动的引入spring-core。

创建2个工程demo_01和demo_02,
demo_01依赖其他的jar包
demo_02依赖于demo_01.所以,根据传递依赖,demo_02也会依赖于其他jar包 

2.3、依赖可选 

 A依赖于B,当我们引入A的时候,maven会自动的引入A所依赖的B。
对于我们来说,不一定需要B。所以如何解决。
1.依赖可选,A在引入B的时候,添加声明,B依赖是可选的。其他工程引入A的时候,就不会引入B了。
2.依赖排除,工程在引入A的时候,添加声明,不需要B依赖。所以就不会引入B依赖。

测试:

1.创建工程Demo_A,引入依赖Junit,配置依赖可选
2.创建工程Demo_B,引入工程Demo_A. 根据依赖传递,Demo_B应该自动的引入Junit. 

 

不设置依赖可选: 

 设置依赖可选:

 

2.4、依赖排除

Demo_A工程直接引入junit,
Demo_B工程引入依赖Demo_A,Demo_B在引入Demo_A的时候,声明需要排除的依赖。

2.5、依赖冲突

maven默认结觉办法: 

Demo_A,Demo_B,Demo_C
Demo_A引入spring-context(5.0.6),依赖传递spring-core
Demo_B引入spring-core(4.1.2),
Demo_C引入Demo_A和Demo_B,Demo_C同时依赖spring-core的2个版本,版本冲突。

maven解决版本冲突的原则:
1.路径最短者优先。
2.路径相同,先声明者优先。

路径最短者优先演示:(ctrl+alt+u) 查看maven的依赖路径

路径相同先声明者优先  先声明就是先一步引入依赖 

将Demo_A的依赖切换成spring-core的5.0.6的版本

三、ssm工程改造成分层构建

maven的继承和聚合是2个不一样的概念。

3.1、maven的继承 

 maven的继承:
 1.用于抽取公共配置
 2.方便所有子工程的依赖版本的统一维护
 3.父工程中,没有java代码。 

父工程自动打pom包(也必须打pom包) 

 步骤:
1.创建父工程Demo_parent,删除src文件夹,右键项目创建model(子工程)

        此时父工程自动打pom包(也必须打pom包)
2.创建子工程Demo_child_A,此时自动通过标签声明父工程
3.父工程引入依赖,子工程继承 

3.2、继承的一些应用

父工程中:
1.针对于所有子工程需要的依赖,才去<dependencies>中声明,方便所有子工程的继承。
2.非所有子工程需要的依赖,在<dependencyManagement>声明,只会锁定版本,不会真的引入
   哪个子工程需要,再次编写坐标(不包含version)配置引入
3.所有依赖的版本统一在<properties>中声明。
4.插件也是上述管理操作 

<?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.hhy</groupId>
    <artifactId>maven_parent</artifactId>
    <!-- 父工程必须打pom包 -->
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <!-- 声明子模块-->
    <modules>
        <module>maven_child1</module>
        <module>maven_child_user</module>
    </modules>

    <!--
        maven中继承的实际应用:

        强调:
            1.maven的继承是用来抽取公共的配置的
            2.父工程中没有java代码,只有一个pom.xml
        继承的实际使用细节:
        1.<dependencies>中,只会声明一些所有子工程都需要的依赖,例如:junit,或者一些其他工具包
        2.对于非所有子模块需要的依赖,我们统一声明到<dependencyManagement>标签中,
            用来锁定版本,然后子工程要用,再去引入即可。
        3.针对于所有的依赖,或者插件,或者模块的版本号,我们统一的在<properties>中进行声明,统一管理。
    -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>

    <!-- 依赖管理,只是用来锁定依赖的版本的,不会真的去引入依赖。一般都是用在父工程中的-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 依赖版本的统一管理-->
        <mysql.version>5.1.38</mysql.version>
        <junit.version>4.12</junit.version>
    </properties>
    <build>
        <plugins>
            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- tomcat7插件,命令: mvn tomcat7:run -DskipTests -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <uriEncoding>utf-8</uriEncoding>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

子工程配置:

子工程需要哪些模块,再次配置,但不需声明版本,由父工程统一管理。

3.3、maven的聚合(多模块开发)

maven的聚合:多模块开发。
当工程比较庞大的时候,此时一个开发者负责一个模块。
而之前的工程,所有的代码全部放在一起。此时也就意味着哪怕负责单个模块,
也需要将所有的代码拉取到本地。而且如果不小心动了其他模块的代码呢。
所以在针对于上述这些情况,针对工程进行分模块构建,
例如:用户模块单独做成一个工程,订单模块单独做成一个工程,
	A组负责用户模块的开发
	B组负责订单模块的开发。
好处:
1.方便企业开发的分工合作
2.方便分布式项目的管理

说白了:maven的聚合就是将一个工程,拆分成多个工程进行管理。
如何拆分:
1.纵向拆分:
	按照项目的层次结构进行拆分。service层作为一个模块,dao层作为一个模块。	
2.横向拆分:
	按照功能模块进行拆分,用户模块,订单模块,物流模块,支付模块

上述继承时,已经使用了聚合了。

父工程中自动添加了子模块的声明:  

 企业开发模块和继承一起使用

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

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

相关文章

rust语句,表达式以及函数

语句和表达式 在rust里&#xff0c;语句和表达式的区别是非常重要的。语句没有返回值&#xff0c;表达式有返回值。例如&#xff1a; fn main() {let y {let x 3; // 赋值语句x 1 // 表达式};println!("The value of y is: {}", y); }上面使用一…

SQL | 自联接 Self Join

有时你可能需要获取位于同一个表中的相关数据。为此&#xff0c;你可以使用一种特殊的联接&#xff0c;称为自联接&#xff08;Self Join&#xff09;。在今天的文章中&#xff0c;我们将学习如何使用 Navicat Premium 作为数据库客户端编写包含自联接的查询。如果你没未使用过…

报表工具软件-FineReport JS实现下拉框自动展开

1. 概述 1.1 预期效果 在使用下拉框做筛选查询时&#xff0c;需要点击下拉框下拉三角才会展开所有选项&#xff0c;有些使用场景下&#xff0c;用户希望自动展开选项列表&#xff0c;尤其是在多个控件联动场景下。如下图所示&#xff1a; 地区控件选择地区后&#xff0c;销售…

新一代最强开源UI自动化测试神器Playwright(Java版)页面元素交互

Playwright 可以与 HTML 输入元素交互&#xff0c;例如文本输入、复选框、单选按钮、下拉选择框、鼠标点击、字符输入、模拟键盘事件以及上传文件和焦点元素。 Playwright 操作文本框 使用Locator.fill()是填写表单字段的最简单方法。input它聚焦元素并使用输入的文本触发事件…

JVM面试题详解系列——垃圾收集算法详解

垃圾收集算法 标记 - 清除算法 首先标记出所有需要被回收的对象&#xff0c;标记完后统一回收所有被标记的对象。 后续的收集算法都是基于这种思路并对其不足进行改进而得到的。 这种方法主要有两个缺点&#xff1a; 一个是效率问题&#xff0c;标记和清除两个过程的效率都…

最短路径(难)

目录 一、Dijkstra算法 动态演示&#xff1a; 关键代码&#xff1a; 完整代码&#xff1a; 运行结果&#xff1a; 二、Floyd算法 详细介绍 关键算法&#xff1a; 完整代码&#xff1a; 运行结果&#xff1a; 一、Dijkstra算法 Dijkstra算法&#xff1a;可以求带权图中…

开发者还能这样开发小游戏变现

根据《2022微信小游戏增长白皮书》显示&#xff0c;目前微信小游戏开发者数量已经超过10万人次&#xff0c;特别是在持续出现小游戏爆火社交平台的趋势下&#xff0c;小游戏发展势头强劲。 此外仅看微信小游戏的商业规模&#xff0c;2022年相较于2021年实现了超 30%的商业增长…

快速了解Azure SQL部署类型的小技巧

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;正文 1. 语法 2. 结果分析 3. 实例 &#xff08;1&#xff09;SQL SERVER &#xff08;2&#xff09;Azure SQL &#xff08;一&#xff09;前言 我们知道在常规的SQL SERVER中我们会使用SELECT VERSIO…

我国汽车保险杠行业对汽车产业依存度较大 市场需求呈良性上升态势

根据观研报告网发布的《2022年中国汽车保险杠市场分析报告-市场发展格局与投资潜力研究》显示&#xff0c;汽车保险杠是汽车车身上一种较大的外覆盖零部件&#xff0c;其作用是在汽车发生碰撞时&#xff0c;保护汽车车身及附件&#xff0c;轻微碰撞可以依靠保险杠自身吸收能量&…

MySQL中的这14个神仙功能,惊艳到我了!!!

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

劲牌连续两年问鼎全国质量大奖背后的密码

11月24日&#xff0c;第二十届全国质量奖“中国杰出质量人”正式公布&#xff0c;劲牌公司董事长吴少勋成为全国10人名单之一。这是劲牌公司继2021年获得第十九届全国质量奖组织奖后&#xff0c;又获得全国质量奖个人奖。连续两年分别获得全国质量奖组织奖和个人奖&#xff0c;…

18岁开始学习编程是否来得及?

18岁开始学习编程完全来得及&#xff0c;不仅来得及&#xff0c;而且还可以选择走专业的程序研发路线&#xff0c;在当前产业互联网的推动下&#xff0c;未来程序开发岗位的数量还会进一步得到攀升。 18岁开始学习编程可以根据自身的实际情况来规划具体的学习路线&#xff0c;对…

java回顾:ssm整合、纯注解开发

目录 一、搭建环境 1.1、spring环境搭建 1.1.1 测试SpringIOC环境 1.2、搭建Mybatis环境(原生mybatis) 二、Spring整合mybatis 三、Spring整合SpringMVC 四、SSM执行流程 五、纯注解开发配置文件模板 声明&#xff1a; SpringMVC: 注解 XML 注解: Control…

[streamlit]数据科学科研工作者的神器,必须要推荐一下

1. 前言 做科研当然要有过硬的专业知识&#xff0c;但是也少不了一些辅助&#xff0c;才能最大程度发挥我们的能力。因此&#xff0c;除去我们模型性能优秀&#xff0c;结果良好以外&#xff0c;如何进行一个好的展示&#xff0c;也是非常有必要的。那么今天&#xff0c;我们就…

推荐系统:基于ConvNCF推荐算法的推荐系统实现 代码+数据详细教程

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。ConvNCF推…

西瓜书-决策树

决策树 决策树划分时&#xff0c;当前属性集为空&#xff0c;或所有样本在所有属性上取值相同&#xff0c;将结点标记为叶节点&#xff0c;其类别标记为当前样本集中样本数最多的类。 决策树算法的核心在于&#xff1a;选择最优划分属性 判别分类的三种情形&#xff1a; 当前…

[前端攻坚]:详解call、apply、bind的实现

call apply bind 的实现的面试中几乎必定出现的一些内容&#xff0c;今天来用一篇文章整理一下这里的内容&#xff0c;加深一下JS基础知识体系。同时文章也被收录到我的《JS基础》专栏中&#xff0c;欢迎大家点击收藏加关注。 call的实现 call() 方法使用一个指定的 this 值和单…

Oracle Ask Tom分区学习系列: 面向开发者的分区(Partitioning)教程

Oracle Partitioning: A Step-by-Step Introduction for Developers是Oracle数据库开发者课程之一。 Development with Oracle Partitioning/使用 Oracle 分区进行开发 Partitioning in the database reflects the same way we handle large tasks in the real world. When a t…

Redis分布式锁的10个坑

前言 大家好&#xff0c;我是田螺。 日常开发中&#xff0c;经常会碰到秒杀抢购等业务。为了避免并发请求造成的库存超卖等问题&#xff0c;我们一般会用到Redis分布式锁。但是使用Redis分布式锁&#xff0c;很容易踩坑哦~ 本文田螺哥将给大家分析阐述&#xff0c;Redis分布式…

如何优化 MySQL 服务器

有一些数据库服务器的优化技术&#xff0c;主要是管理系统配置而不是调整 SQL 语句。它适用于那些希望确保服务器的性能以及可伸缩性的 DBA&#xff0c;以及适用于启动安装脚本建立数据库和运行 MySQL 自己进行开发、测试等以提生产力的开发人员。 系统因素 一些系统级方面也会…