项目管理工具Maven

news2024/11/15 11:01:24

Maven

Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。
  

课程内容的介绍

1. Maven基础内容
2. Maven的依赖管理
3. 聚合工程
4. Maven私服搭建
  

一、 Maven基础

1.Maven介绍
1.1为什么需要使用Maven
之前学Spring的时候我们需要单独自己去找相关的jar.这些jar包我们还能通过官网能找到,但是比如我们要找JSTL或者Hibernate验证jar及依赖包的时候我们并不是很容易的找的。所以我们希望有种更加方便管理我们jar的工具,Maven刚好能帮我们解决这个问题。
  
1.2Maven是什么?
官方的解释:
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
   
Maven两大核心
1. 依赖管理:就是对jar包的统一管理。
2. 构建项目:项目编码完成后,对项目的编译,测试,打包,部署等操作。
  
初学的时候对Maven的概念比较模糊,仅仅知道它可以管理我们的jar包和jar之间的依赖关系,但它的功能并不仅仅局限于此。我们通过安装使用管理来体验吧。

    
2. Maven的安装配置
2.1 官网下载
官网地址:https://maven.apache.org/download.cgi
下载Windows版本即可。

  
2.2 解压缩
将下载的压缩文件解压缩到非中文目录下即可。

  
2.3 配置Maven的环境变量
先配置MAVEN_HOME

  
然后将MAVEN_HOME追加到path变量之后。

  
2.4 验证
环境变量配置好后,我们就可以在系统的任意位置来使用Maven了。

3.仓库类型介绍

  
jar包查找的顺序:

   
中央仓库地址:https://mvnrepository.com
  
4.本地仓库配置
修改我们在Maven安装的配置文件。

  

  
修改IDEA中的Maven默认配置。

  

  
配置好后需要的jar依赖如果本地仓库没有的话就需要去中央仓库下载,但是中央仓库在国外,速度会很慢,这时我们可以配置镜像服务器,只需要在setting.xml中添加镜像地址即可。
<!-- 阿里代理镜像地址-->
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>*</mirrorOf>
</mirror>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
  
配置了阿里云镜像代理后重启IDEA,可以看到新的依赖是通过镜像代理下载的。

  
5.创建基于Maven的Web项目
5.1 Web项目创建
选择相关的类型。

  
设置项目的相关信息。

  
核查Maven的配置信息。

  

  
初识项目结构。

  
我们需要自己手动添加相关的目录结构。

  

创建好的最终的目录结构:

  
5.2 Tomcat插件配置
5.2.1 pom文件中添加配置
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8080</port> <!-- 访问端口-->
          <path>/</path>    <!-- 访问路径-->
        </configuration>
      </plugin>
  

  
5.2.2 启动Tomcat
选中右侧侧边栏中的Maven点击。

  

  
启动成功。

  
访问成功。

  

二、依赖管理

Maven项目,依赖,构建配置,以及构件:所有这些都是要建模和表述的对象。这些对象通过一个名为项目对象模型(Project Object Model, POM)的XML文件描述。这个POM告诉Maven它正处理什么类型的项目,如何修改默认的行为来从源码生成输出。同样的方式,一个Java Web应用有一个web.xml文件来描述,配置,及自定义该应用,一个Maven项目则通过一个 pom.xml文件定义。该文件是Maven中一个项目的描述性陈述;也是当Maven构建项目的时候需要理解的一份“地图”。
  
1、Maven坐标
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
</dependencies>
   
1.1 dependencies
在dependencies标签中添加需要添加的jar对应的Maven坐标。
  
1.2 dependency
一个dependency标签代表了一个Maven坐标。
   
1.3 groupId
团体、公司、小组、项目、或其他团体标识的体现,约定以创建这个项目的组织域名倒写开头。也是我们在本地仓库中查看依赖的目录结构。一个Maven坐标中是必须有的。
  
1.4 artifactId
在groupId下的表示一个单独的项目的唯一标识。同样是必须的。
  
1.5 version
一个项目的特定版本。也是必须的。
  
1.6 scope
依赖范围。

  
2、依赖冲突
2.1 冲突产生的根本原因

  
上图中a jar包通过b和d间接依赖到的c jar包版本不一致,出现了冲突。

   

  
2.2 依赖冲突的解决方案
2.2.1 第一优先声明原则
谁先定义就使用谁的。

  

  
2.2.2 路径就近原则
直接声明优先级更高。

  
2.2.3 排除依赖
我们在Maven坐标中可以通过exclusions标签来显示的排除掉简介依赖。

  

三、聚合工程

所谓聚合项目,实际上就是对项目分模块,互联网项目一般来说按照业务分(订单模块、VIP模块、支付模块、CMS模块…),传统的软件项目,大多采用分层的方式(Dao、Serivce、Controller):
  
1. 聚合工程的结构
bobo-parent pom 管理
    |-- bobo-manager pom 管理
        |-- bobo-manager-dao jar
        |-- bobo-manager-service jar
        |-- bobo-manager-model jar
        |-- bobo-manager-commons jar
        |-- bobo-manager-controller war
  
2.项目结构创建
2.1创建bobo-parent

  
2.2 创建bobo-manager
这也是一个POM工程,而且是bobo-parent下的一个子工程。

  
注意创建的module的父工程。

  

  

  
2.3 分别创建4个java工程
创建bobo-manager-dao

  
创建bobo-manager-service

  
创建bobo-manager-model

  
创建bobo-manager-commons

  

  
2.4 创建bobo-manager-controller
创建对应的web项目,选择对应的模板

  

  
等待初始化完成。

  
3. 依赖关系
3.1 依赖关系介绍
完整的依赖关系

  
控制层依赖关系

  
service层依赖关系

  
dao层的依赖关系

  
3.2 项目打包
bobo-parent打包在IDEA中会一性的给所有的子工程都打包。

  

  

  
3.3 依赖关系配置
controller依赖service。那就在Controller的pom文件中添加service的依赖。

  
service依赖dao。在service的pom文件中添加依赖。

  
dao依赖commons和model两个模块。

  
完整依赖关系图。

  
4.聚合工程的运行
4.1 创建UserBean
package com.bobo.model;

public class User {
    private Integer id;
    private String userName;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                '}';
    }
}
  
4.2 创建Dao
package com.bobo.dao;

import com.bobo.model.User;

public interface IUserDao {

    User queryUser();
}
package com.bobo.dao.impl;

import com.bobo.dao.IUserDao;
import com.bobo.model.User;

public class UserDaoImpl implements IUserDao {
    @Override
    public User queryUser() {
        User user = new User();
        user.setId(666);
        user.setUserName("波波");
        return user;
    }
}
  
4.3 创建Service
package com.bobo.service;

import com.bobo.model.User;

public interface IUserService {

    User queryUser();
}
package com.bobo.service.impl;

import com.bobo.dao.IUserDao;
import com.bobo.dao.impl.UserDaoImpl;
import com.bobo.model.User;
import com.bobo.service.IUserService;

public class UserServiceImpl implements IUserService {

    private IUserDao dao = new UserDaoImpl();

    @Override
    public User queryUser() {
        return dao.queryUser();
    }
}
   
4.4 创建Controller
创建Servlet
package com.bobo.servlet;

import com.bobo.model.User;
import com.bobo.service.IUserService;
import com.bobo.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class UserServlet extends HttpServlet {

    private IUserService service = new UserServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user = service.queryUser();
        System.out.println(user);
    }
}
  
web.xml的配置
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <servlet>
    <servlet-name>userServlet</servlet-name>
    <servlet-class>com.bobo.servlet.UserServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>userServlet</servlet-name>
    <url-pattern>/userServlet</url-pattern>
  </servlet-mapping>
</web-app>
   
添加Tomcat插件
<plugins>
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <port>8080</port> <!-- 访问端口-->
            <path>/</path> <!-- 访问路径-->
        </configuration>
    </plugin>
</plugins>
   
4.5 运行
通过Tomcat插件运行。

  
访问

  
访问成功说明聚合工程搭建完成!
  

四 私服-Nexus

仓库管理器也叫私服代理仓库
仓库管理器有两个服务目的:首先它的角色是一个高度可配置的介于你的组织与公开Maven仓库之间的代理,其次它为你的组织提供了一个可部署你组织内部生成的构件的地方。
  
1、Nexus介绍
Nexus是一个强大的Maven仓库管理器, 它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问和部署在你所维护仓库中的每个Artifact。Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。 Nexus使用ExtJS来开发界面,利用Restlet来提供完整的REST APIs,通过m2eclipse与Eclipse集成使用。 Nexus支持WebDAV与LDAP安全身份认证。
  
2、Nexus安装
下载安装文件,可以自行去官网下载,也可以获取我提供给大家的源文件。

  
解压缩到一个非中文目录下即可。

  
在cmd下切换到Nexus的bin目录下执行 nexus install (以管理员身份进入)。

  
启动nexus服务 nexus start

  
测试访问:http://localhost:8081/nexus

  
默认的账号密码:admin admin123

  
3、Nexus介绍
3.1 仓库类型

  
3.2 默认仓库介绍

  
4、开启远程索引
获取提供给大家的索引文件。

  
停止Nexus服务。

  
将提供给大家的索引文件覆盖到%Nexus_Home%\sonatype-work\nexus\indexer\central-ctx文件夹下。

  
重启服务即可。

  
5、创建宿主仓库

  

  

  
6、创建代理仓库
虽然搭建了私服,但是如果私服中没有我们需要的jar包,它还是会通过默认的代理仓库去中央仓库下载相关的jar。这时速度同样会很慢,这时我们可以在Nexus中添加阿里的代理服务器。

  
配置的阿里云的镜像地址:http://maven.aliyun.com/nexus/content/groups/public/

  

  
7、创建仓库组

  

  
8、使用私服
想要在我们自己的Maven项目中关联我们自己配置的私服服务器。
  
在setting配置文件中添加server标签。
<!-- 配置私服服务 -->
<server>
    <id>nexus</id>
    <username>admin</username>
    <password>admin123</password>
</server>
  

  
然后在setting配置文件的mirrors标签中添加私服仓库组的配置。
<!-- 去私服服务中查询 -->
<mirror>
    <id>nexus</id>
    <mirrorOf>*</mirrorOf>
    <name>Human Readable Name for this Mirror.</name>
    <url>http://localhost:8081/nexus/content/groups/DpbGroup/</url>
</mirror>
 
9、上传jar包到私服中

  
修改setting.xml文件。
<server>
    <id>releases</id>
    <username>admin</username>
    <password>admin123</password>
</server>
<server>
    <id>snapshots</id>
    <username>admin</username>
    <password>admin123</password>
</server>
  
然后需要修改对应的pom文件。
<!-- 配置上传私服路径 -->
<distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://localhost:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>
  
执行deploy命令。

  
在私服中收搜上传的jar包。

  
10、特定jar包上传
有些第三方的jar包是不存在与Maven的中央仓库中的。那么我们只能将这个jar包上传到Maven私服仓库中。

  

  
最后不要忘了 点击 Upload Artifact(s) 按钮。

  
11、从私服下载jar包
setting.xml文件中配置模板。
<profile>
    <id>dev</id>
    <repositories>
        <repository>
            <id>nexus</id>
            <url>http://localhost:8081/nexus/content/groups/BoboGroup/</url>
            <!--是否下载releases构件 -->
            <releases>
                <enabled>true</enabled>
            </releases>
            <!--是否下载snapshots构件 -->
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>Public_Repositories</name>
            <url>http://localhost:8081/nexus/content/groups/BoboGroup/</url>
        </pluginRepository>
    </pluginRepositories>
</profile>
  
激活模板。
<!-- 激活模板-->
<activeProfiles>
    <activeProfile>dev</activeProfile>
</activeProfiles>
  

  
如果这样设置还是不能下载snapshots版本的依赖,那就在pom中添加如下的配置。
<repositories>
    <repository>
        <id>BoboGroup</id>
        <url>http://localhost:8081/nexus/content/groups/BoboGroup/</url>
        <!--是否下载releases构件 -->
        <releases>
            <enabled>true</enabled>
        </releases>
        <!--是否下载snapshots构件 -->
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>
  
效果如下。

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

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

相关文章

使用jasypt进行配置文件加密

1、导入依赖 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.2</version> </dependency> 可能出现的问题 &#xff1a; 依赖不要从pdf中直…

Unity 0GC或者最大限度降低GC方案

文章目录 GC带来的问题性能瓶颈玩家体验受损 优化关键点1. **对象池技术**&#xff1a;2. **内存管理优化**&#xff1a;3. **UGUI优化**&#xff1a;4. **ECS架构下的优化**&#xff1a;5. **资源管理**&#xff1a;6. **自定义数据结构与算法**&#xff1a;7. **开启增量GC&a…

分布式事务理论及Seata实践

分布式事务简介 事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完全地执行&#xff0c;要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成&#xff0c;否则不会永久更新面向数据的资源。事务的四个特征&#xff08;ACID&#xff09; …

算法第十三天-组合总和Ⅱ

组合总和Ⅱ 题目要求 解题思路 按顺序搜索&#xff0c;设置合理的变量&#xff0c;在搜索的过程中判断是否会出现重复集结果。重点理解对输入数组排序的作用和参考代码中 大剪枝和小剪枝 的意思 这道题域上一问的区别在于&#xff1a; 第39题&#xff1a;candidates中的数字…

构建异地企业网络互联的高效路径

在当今数字化浪潮中&#xff0c;企业的业务拓展已不再受限于地理位置。为了在全球竞争中立于不败之地&#xff0c;越来越多的企业选择在不同城市设立分支机构&#xff0c;构建异地网络&#xff0c;实现高效的协同办公。本文将深入探讨在北上广等经济发达地区&#xff0c;如何通…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设开发(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

PLC水箱液位控制、神经网络、PID模糊控制等Factory IO仿真

水箱液位控制的PLC仿真程序。TIA Portal V17 中的代码。该水箱在 Factory IO 3D 仿真软件中建模&#xff0c;将控制算法写入PLC&#xff0c;与Factory IO联合仿真进行实验。项目包括一个简单的自动化系统、一个带有两个泵的液罐和一个液位传感器。从 HMI 中&#xff0c;我们可以…

2024阿里云优惠_阿里云活动中心

2024年阿里云优惠活动大全&#xff0c;包括阿里云服务器优惠活动清单、配置价格表、域名优惠活动、阿里云建站活动、阿里云优惠代金券免费领取、对象存储OSS活动、企业邮箱优惠、无影云电脑优惠、CDN特惠等等&#xff0c;阿里云百科aliyunbaike.com分享2024阿里云优惠活动大全_…

Docker给容器添加新端口映射

Docker容器添加新端口映射 查看运行的容器 docker ps查看容器挂载目录 docker inspect [容器id]我这里是[容器name] 停止容器 docker stop pythonWarning: Stopping docker.service, but it can still be activated by: docker.socket 停止docker服务 systemctl stop dock…

el-table魔改样式出现BUG,表格内容区域出现滚动条

问题&#xff1a;el-table表格内容区域在高度自适应的情况下冒出滚动条 解决办法&#xff1a; 代码排查后发现时我设置了fixed:“xxx” 属性就会导致滚动条出现的问题&#xff0c;不设置则无。 [{ type: index, label: 序号, fixed: left },{ prop: enterprisesName, label: …

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

09.简单工厂模式与工厂方法模式

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物。——《道德经》 最近小米新车亮相的消息可以说引起了不小的轰动&#xff0c;我们在感慨SU7充满土豪气息的保时捷设计的同时&#xff0c;也深深的被本土品牌的野心和干劲所鼓舞。 今天我们就接着这个背景&…

Debezium发布历史49

原文地址&#xff1a; https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 使用发件箱模式进行可靠的微服务数…

JSP内置对象:forward动作标记和sendRedirect()方法实现页面跳转的区别

1.forward为服务器跳转&#xff0c;浏览器的地址栏不变&#xff1b; sendRedirect&#xff08;&#xff09;为客户端跳转&#xff0c;浏览器的地址栏改变变新页面的URL。 2.执行到forward标记出现处停止当前JSP页面的继续执行&#xff0c;而转向标记中的page属性指定的页面&am…

【Matplotlib】基础设置之图像处理05

图像基础 导入相应的包&#xff1a; import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np %matplotlib inline导入图像 我们首先导入上面的图像&#xff0c;注意 matplotlib 默认只支持 PNG 格式的图像&#xff0c;我们可以使用 mpimg.im…

一文搞定JVM内存模型

鲁大猿&#xff0c;寻精品资料&#xff0c;帮你构建Java全栈知识体系 www.jiagoujishu.cn 运行时数据区 内存是非常重要的系统资源&#xff0c;是硬盘和 CPU 的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、…

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷&#xff0c;各路开发大神可以说是各出绝招&#xff0c;我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用&#xff0c;在GitHub超过56K Star的开源项目&#xff1a;ChatGPT-Next-Web。 ChatGP…

Java分布式锁理论(redis、zookeeper) 详解

目录 一、分布式锁有哪些应用场景&#xff1f; 二、分布式锁的实现方案 三、zookeeper实现分布式锁 一直不释放锁怎么办&#xff1f; 如何避免分布式锁羊群效应问题&#xff1f; 四、redis实现分布式锁 一、分布式锁有哪些应用场景&#xff1f; 1、定时任务 2、秒杀抢购…

XAgent调研

文章目录 1 简介2 快速测试 Quick Start3 结构分析 1 简介 XAgent&#xff08;链接&#xff09;是一个开源的&#xff0c;基于大语言模型的agent构建框架&#xff1b;其目标是构建出能够辅助人类处理各类任务的自动助手 定位&#xff1a;一个全能的&#xff0c;自动的辅助agen…

智邦国际ERP GetPersonalSealData.ashx接口存在SQL注入漏洞 附POC软件

@[toc] 智邦国际ERP GetPersonalSealData.ashx接口存在SQL注入漏洞 附POC软件 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…