您当前的位置:首页 > 计算机 > 编程开发 > Maven

使用IDEA创建maven工程以及maven的相关知识点

时间:12-07来源:作者:点击数:
城东书院 www.cdsy.xyz
在这里插入图片描述

使用idea创建maven工程首先本地要安装的有maven环境。

接下来idea集成maven配置如下:

在这里插入图片描述
在这里插入图片描述

配置参数:

-DarchetypeCatalog=internal

作用:如果我们使用maven为我们提供好的骨架来创建maven工程的话,它一般是需要联网的,但是为了在不连网的情况下,我们可以正常创建工程,只有配置了这个参数,我们之前连网下载过的相关工程的插件,它就会从本地找到对应的插件,就不用在从网络上下载了

如下是maven工程为我们提供好的可以直接使用的maven工程骨架/模板,如果要使用这些骨架,前提是必须联网

在这里插入图片描述

使用maven通过的骨架创建java工程步骤:

❤❤❤❤❤❤❤截图版❤❤❤❤❤❤❤❤❤❤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

初次创建maven工程需要从网上下载插件,需要花点时间。可以看出maven创建的java工程的目录,并没有创建配置文件要放置的目录,这个目录我们需要自己创建

我们在main文件下创建resources文件夹,与java目录都在main文件夹下,创建之后我们还要将resources目录改为资源配置目录,操作如下:

在这里插入图片描述

不使用骨架创建maven工程,这样的好处就是创建的maven工程自动为我们创建资源目录resources:

在这里插入图片描述

使用idea创建web工程:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要在main目录下手动创建java或resources目录,并将java目录和resources设置为资源目录

在这里插入图片描述
在这里插入图片描述

Maven项目结构

在这里插入图片描述

常用的maven命令:

  • compile

compile是maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出 到target目录下。

  • test

test是maven工程的测试命令,会执行src/test/java下的单元测试类。

  • clean

clean是maven工程的清理命令,执行clean会删除target目录的内容。

  • package

package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程 打成war包。

  • install

install是maven工程的安装命令,执行install将maven打成jar包或war包发布到本地仓库。

maven中的坐标问题:

每个maven工程都需要定义本工程的坐标,坐标是maven对jar包的身份定义,比如:

<!--公司或组织域名的倒序,类似包名-->
<groupld>com.itmeng</groupld>
<!-项目名或模块名-->
<artifactld>maven-first</artifactld>
<!-当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包类型
jar:执行package会打成jar包
war:执行package会打成war包
pom :用于maven工程的继承,通常父工程设置为pom

什么是依赖传递

先添加springmvc的核心依赖的坐标

在这里插入图片描述

会发现出现除了spring-webmvc以外的其他jar。因为我们的项目依赖spring-webmv.jar,而spring-webmv.jar会依赖spring-beans.jar等等,所以spring-beans.jar这些jar包也出现在了我们的maven工程中,这种现象我们称为依赖传递。从下图中可看到他们的关系:(请注意spring-beans的版本)

在这里插入图片描述

接着添加一个依赖

在这里插入图片描述

我们会发现这两个jar包同时都依赖了spring-beans

在这里插入图片描述

但是spring-webmvc依赖spirng-beans-4.2.4,spring-context依赖spring-beans-5.0.2,但是发现spirng-beans-4.2.4加入到工程中

在这里插入图片描述

而我们希望spring-beans-5.0.2加入工程。这就造成了依赖冲突。解决依赖冲突有以下原则:

依赖调解原则

maven自动按照下边的原则调解

1、第一声明者优先原则

在pom文件定义依赖,先声明的依赖为准。

测试:如果将上边spring-webmvc和spring-context顺序颠倒,系统将导入spring-beans-5.0.2。

分析:由于spring-webmvc在前边以spring-webmvc依赖的spring-beans-5.0.2为准,所以最终spring-beans-5.0.2添加到了工程中。

2、路径近者优先原则

例如:还是上述情况,spring-contex和spring-webmvc都会传递过来spirng-beans,那如果直接把spring-beans的依赖直接写到pom文件中,那么项目就不会再使用其他依赖传递来的spring-beans,因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近。

在本工程中的pom中加入spirng-beans-5.0.2的依赖,根据路径近者优先原则,系统将导入spirng-beans-5.0.2:

在这里插入图片描述

排除依赖

上边的问题也可以通过排除依赖方法辅助依赖调解,如下:比如在依赖spring-webmvc的设置中添加排除依赖,排除spring-beans,下边的配置表示:依赖spring-webmvc,但排除spring-webmvc所依赖的spring-beans。

在这里插入图片描述

锁定版本

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。

如下的配置是锁定了spring-beans和spring-context的版本:

在这里插入图片描述

还可以把版本号提取出来,使用标签设置成变量。

在这里插入图片描述

注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加标签,如下:

在这里插入图片描述

上边添加的依赖并没有指定版本,原因是已在中锁定了版本,所以在下不需要再指定版本。

分模块构建maven工程

分模块构建maven工程分析

在现实生活中,汽车厂家进行汽车生产时,由于整个生产过程非常复杂和繁琐,工作量非常大,所以车场都会将整个汽车的部件分开生产,最终再将生产好的部件进行组装,形成一台完整的汽车。

在这里插入图片描述
在这里插入图片描述

maven工程的继承

在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。

在这里插入图片描述

maven工程的聚合

在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用标签将这些工程统一聚合到maven工程中,需要打包的时候,只需要在此父工程中执行一次打包命令,其下被聚合的工程就都会被打包了。

在这里插入图片描述

项目整体结构如下:

1)maven_parent为父工程,其余工程为子工程,都继承父工程maven_parent

2)maven_parent工程将其子工程都进行了聚合

3)子工程之间存在依赖关系,比如maven_dao依赖, maven_pojo、maven_service依赖maven_dao、maven_web依赖maven_service

聚合项目演示:

一般项目当中有dao,service层,现在我们有后台项目模块,该后台项目模块存在web,controller层,后台项目模块中的controller层会去调用service层,service层会去调用dao层。以前我们会把 service和dao都放在后台项目模块当中,也就是同一个包下,为了日后的扩展, 现在我们将service和dao层都抽取独立出来,再整合到后台项目模块当中

在这里插入图片描述

创建聚合项目(以淘宝卖家后台taobao-merchant和买家后台taobao-buyer为例)

首先创建一个maven工程,打包方式为pom,删除src目录,因为打包方式为pom的项目,只是为了聚合子模块,在src目录不写任何的代码

在这里插入图片描述

在pom.xml配置指定版本的编译器:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

创建taobao-model子模块,打包方式为jar,当然创建的maven项目默认打包为jar

在这里插入图片描述

创建User实体类

在这里插入图片描述
public class User {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                '}';
    }
    
}

创建taobao-dao子模块,打包方式为jar,当然创建的maven项目默认打包为jar

在这里插入图片描述

创建UserDao接口和实现类,写两个方法,发现需要引入User实体,我们已经在taobao-model子模块当中写过了,我们只需要在pom文件当中引入taobao-model依赖坐标即可

在这里插入图片描述

UserDao接口

public interface UserDao {

    public void save(User user);

    public User findById(Integer id);
}

UserDaoImpl 接口实现类:

public class UserDaoImpl implements UserDao {
    @Override
    public void save(User user) {
        System.out.println("保存user");
    }

    @Override
    public User findById(Integer id) {
        System.out.println("根据od查找user");
        return null;
    }

}

发现taobao-dao模块报错,是因为在该模块当中并没有User实体 ,在pom文件当中引入taobao-model子模块。

<dependency>
            <groupId>com.taobao</groupId>
            <artifactId>taobao-model</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

查看dao 的maven信息

在这里插入图片描述

创建taobao-service子模块,打包方式为jar,当然创建的maven项目默认打包为jar

在这里插入图片描述

创建接口和实现类

在这里插入图片描述

接口:

public interface UserService {
    public void save(User user);

    public User findById(Integer id);
}

实现类:

public class UserServiceImpl implements UserService {

    UserDao userDao = new UserDaoImpl();

    @Override
    public void save(User user) {
        userDao.save(user);
    }

    @Override
    public User findById(Integer id) {

        return userDao.findById(id);
    }
}

在service子模块当中我们要调用dao子模块,同时也要依赖User实体的子模块model,我们在pom文件当中引入这一个dao依赖坐标即可,因为dao依赖了model,通过依赖传递即可:

pom:


<dependency>
            <groupId>com.taobao</groupId>
            <artifactId>taobao-dao</artifactId>
            <version>1.0-SNAPSHOT</version>
</dependency>

查看service的maven配置:

在这里插入图片描述

接下来我们创建taobao-merchant商家后台模块,后台模块要创建web项目,打包方式为war

在这里插入图片描述

在后台模块我们创建controller层。具体的代码就不写,同样该模块需要引入service子模块,通过依赖传递又会引入dao和model子模块

在这里插入图片描述

pom:

<dependency>
            <groupId>com.taobao</groupId>
            <artifactId>taobao-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

查看controller的maven配置:

在这里插入图片描述

以同样的方式创建买家后台taobao-buyer,打包方式也为war,同卖家后台一样

在这里插入图片描述

整体聚合项目结构如图:

在这里插入图片描述

接下来咱们就可以整体的将项目进行打包,执行操作:

在这里插入图片描述

控制台信息:

在这里插入图片描述

打包成功,可以查看每一个子模块目录下有target目录生成,jar和war都放在其中:

在这里插入图片描述

也可以查看本地仓库:

在这里插入图片描述

查看taobao-merchant商家后台子模块war包:

在这里插入图片描述

发现taobao-merchant商家后台子模块所依赖的jar全部都被打包在war包当中

这样的话,我们启动taobao-merchant商家后台模块就可以将项目运行起来,前提是要将整个项目打包安装。那又如何将taobao-merchant商家后台运行起来?

我们在taobao-merchant的pom文件当中配置tomcat插件

 <build>
        <plugins>
            <plugin>
                <!-- 配置插件tomcat7 -->
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

接下来启动项目:

在这里插入图片描述

查看控制台:

在这里插入图片描述

接下来我们访问该后台项目:

在这里插入图片描述

也就是,只需要把taobao-merchant商家后台子模块 install下,在他的targit目录下,把.war包丢进服务器即可

以上就是maven创建的聚会工程以及模块间的依赖传递和启动聚会项目。

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门