java回顾:Maven高级

目录

一、私服搭建

二、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.横向拆分:
	按照功能模块进行拆分,用户模块,订单模块,物流模块,支付模块

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值