Maven

目录
一.Maven
二.Maven的下载安装
三.Maven创建项目与配置
四.Maven的常用命令
五.Maven依赖管理
六.Mavern插件管理
七.私服搭建

一.Maven

1.1 什么是Maven

Maven是由Apache开发用于项目管理的工具, 是一个纯 Java 开发的开源项目;

1.2 Maven的作用

  • 项目构建: maven提供一套对项目生命周期管理的标准, 开发人员和测试人员统一使用maven进行项目构建;
  • 管理项目的生命周期:编译,测试,打包,部署,运行;
  • 依赖管理: maven对项目的第三方构件(jar包)进行统一管理; 向工程中加入jar包不要手工从其它地方拷贝,通过maven定义jar包的坐标, 自动从maven仓库中去下载到工程中;
  • 对工程分模块构建,提高开发效率;
  • 文档生成等等;

1.3 Maven的约定配置

也就是项目目录结构自动生成的配置需要遵守的规则

二.Maven的安装

2.1 Maven的安装

Maven的下载地址

1.将下载到的maven压缩文件解压到一个没有中文的目录;
2.配置环境变量 MAVEN_HOME和 Path与 JAVA_HOME的配置类似;
3.配置 Maven的仓库 Repository;
    在maven的安装目录中conf/settings.xml文件,在这里配置本地仓库(Repository)
    <localRepository>仓库路径</localRepository>
    示例:<localRepository>E:/source/04_Maven/repository_pinyougou</localRepository>
4.测试Maven是否安装成功
    打开cmd控制吧,输入mvn -version;

2.2 Maven的目录介绍

bin : 命令
boot : 第三方类加
conf : 配置文件
lib : maven自身的jar包

2.3 Maven的仓库和坐标

2.3.1 Maven的仓库

仓库名称 作用
本地仓库 相当于缓存, 工程第一次会从远程仓库(互联网)去下载jar 包, 将jar包存在本地仓库(在程序员的电脑上); 第二次不需要从远程仓库去下载, 先从本地仓库找,如果找不到才会去远程仓库找;
中央仓库 仓库中jar由专业团队(maven团队)统一维护。中央仓库的地址:http://repo1.maven.org/maven2/
远程仓库 在公司内部架设一台私服,其它公司架设一台仓库,对外公开;

2.3.2 Maven的坐标

Maven的一个核心作用就是管理项目的依赖, 引入开发过程中所需要的各种jar包; 为了能自动化的解析任何一个Java构件, Maven必须将这些Jar包或者其他资源进行唯一标识, 这些标识是管理项目依赖的基础, 也就有了坐标;

坐标的定义元素如下:
    groupId:    项目组织唯一的标识符, 实际对应Java的包的结构;(如:com.alibaba)
    artifactId: 项目的名称;
    version:    项目的当前版本
代码示例如下:
    <dependecies>
        <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>    
            <version>1.0.9</version>  
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependecies>

三.IDEA集成Maven

1.配置IDEA的Maver路径



2.配置参数(解决创建慢的问题) -DarchetypeCatalog=internal



3.最后新创建project,一定不要使用原来的project, 并且第一次需要联网;
4.创建出的JavaWeb工程目录结构图 (一般不使用骨架创建工程)

四.Maven的常用命令

1.clean命令
    清除编译产生的target文件夹内容,可以配合相应命令一起使用;
    如: mvn clean package, mvn clean test
2.compile命令
    该命令可以对src/main/java目录的下的代码进行编译;
3.test命令
    测试命令,或执行src/test/java/下所有junit的测试用例;
4.package命令
    mvn package, 打包项目, 打包后的项目可以在target目录下找到;
    如果是JavaSe的项目, 打包成jar包;
    如果是JavaWeb的项目, 打包成war包;
5.install命令
    打包后将其安装在本地仓库;(通过项目的包名可以在仓库中找到这个打包文件)

五.依赖管理和插件

5.1导入依赖

<!-- 示例引入junit依赖 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<!-- 示例引入servlet依赖 需要注意环境问题,2020版idea与Maven的编译有冲突,可以在设置中解决
勾选 maven runner中的 Delegate IDE build/run actions to Maven 
-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

5.2 依赖范围

compile :编译,测试,打包运行部署有效(默认);
    如:strus-core,spring-beans,C3P0,Druid; 
provided:编译,测试有效;打包运行部署无效;
    如:Servlet,在运行时不用(tomcat容器已提供,强行打包打出去,会有冲突问题)
runtime :测试,打包,运行,部署有效,编译无效;
    如:JDBC驱动包,在开发代码中针对JDBC接口开发,编译不用,在运行和测试是需要通过JDBC驱动包连接数据库;
test    :只是测试有效,只在单元测试类中用;

六.Maven的插件

6.1 Maven的插件

Maven是一个核心引擎, 提供了基本的项目处理能力和建设过程的管理, 以及一系列的插件来执行实际建设任务;

如: 集成JDK插件可以方便修改项目的编译环境; 集成Tomcat插件后, 无需安装Tomcat服务器就可以运行Tomcat进行项目的发布和测试;

在pom.xml中通过plugin标签引入maven的功能插件;

<!-- jdk编译插件 -->
<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>
        <encoding>utf-8</encoding>
    </configuration>
</plugin>

jdk的编译版本也可以在maven的setting中配置:

 <profile>
      <id>jdk1.8</id>
      <activation>
           <activeByDefault>true</activeByDefault>
           <jdk>1.8</jdk>
      </activation>
      <properties>
           <maven.compiler.source>1.8</maven.compiler.source>
           <maven.compiler.target>1.8</maven.compiler.target>
           <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
           <encoding>UTF-8</encoding>
     </properties>
</profile>
<!-- Tomcat7的编译插件
    如果想使用更高版本的Tomcat,需要到其它的仓库去下载,因为中央仓库是没有提供的 
-->
<plugins>
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <configuration>
            <!-- 指定端口 -->
            <port>82</port>
            <!-- 请求路径 -->
            <path>/</path>
        </configuration>
    </plugin>
</plugins>

6.1 修改Maven的配置

1.修改不使用骨架创建maven项目的默认编译版本

<profile>   
        <id>jdk1.8</id>
        <activation>   
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>   
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            <encoding>UTF-8</encoding>
        </properties>   
</profile>

将上述标签内容添加到settings文件的<profiles>标签中

2.彻底解决引入依赖的时候卡、报错

修改settings.xml文件 (访问中央仓库是外网, 会比较慢, 可以使用阿里的镜像) ,添加如下代码:

<mirrors>
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
    <mirror>
        <id>uk</id>
        <mirrorOf>central</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://uk.maven.org/maven2/</url>
    </mirror>

    <mirror>
        <id>CN</id>
        <name>OSChina Central</name>
        <url>http://maven.oschina.net/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

    <mirror>
        <id>nexus</id>
        <name>internal nexus repository</name>
        <url>http://repo.maven.apache.org/maven2</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

七.Maven私服

7.1 什么是Maven私服

Maven的远程仓库的一种;

公司在自己的局域网内搭建自己的远程仓库服务器, 称为私服; 私服服务器即是公司内部的maven远程仓库, 开发人员的电脑上安装Maven软件并且连接私服服务器, 这样就可以在内部共享jar文件;

7.2 私服的搭建

​ 1.下载nexus

​ 2.安装nexus与启动nexus: 解压到一个没有中文的目录, 并进入bin目录, 执行 nexus.bat install; 以管理员权限运行命令行,进入 bin 目录, 执行 nexus.bat install ; 然后在任务管理器的服务中查看是否有 nexus;

​ 3.卸载nexus: cmd 进入 nexus 的 bin 目录,执行: nexus.bat uninstall

​ 4.登录: 访问 http://localhost:8081/nexus/ (查看 nexus 的配置文件 conf/nexus.properties ,里面有端口号) 然后点击右上角的 Log in, 输入账号和密码登陆 (账号admin,密码admin123 ); 点击Repositories显示仓库类型

仓库类型:
1.hosted
    宿主仓库,部署自己的jar到这个类型的仓库,包括 relaeses和 snapshot两部分,前者是公司内部发布版本仓库
    后者是公司内部测试版本仓库;
2.proxy
    代理仓库,用于代理远程的公共仓库;如 maven中央仓库,用户连接私服,私服自动去中央仓库下载 jar或插件;
3.group
    仓库组,用来合并多个 hosted/proxy仓库,通常配置自己的 maven连接仓库组;
4.virtual
    兼容 maven1版本的jar或插件;

7.3 私服的使用

1.将项目发布到私服

第一步: 修改maven的setting.xml文件的, 添加如下内容:

<server>
    <id>releases</id>
    <username>admin</username>
    <password>admin123</password>
</server>
<server>
    <id>snapshots</id>
    <username>admin</username>
    <password>admin123</password>
</server>

配置连接私服的用户和密码 。此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和密码一致 (配置到<servers>标签下);

第二步: 在需要发布配置项目 pom.xml . 配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为 release 则上传到私服的 release 仓库,如果版本为snapshot 则上传到私服的 snapshot 仓库

<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>

注意: pom.xml 这里<id> 和 settings.xml 配置 <id> 对应!

E:\java_develop\nexus-2.12.0-01-bundle\sonatype-work\nexus\storage

第三步: 测试

首先启动 nexus , 然后执行 deploy 命令, 然后在 nexus 的 sonatype-work\nexus\storage目录下通过包名去查看刚刚上传到私服的文件;

2.从私服下载jar包

没有配置 nexus 之前,如果本地仓库没有,去中央仓库下载;

通常在企业中会在局域网内部署一台私服服务器,有了私服本地项目首先去本地仓库找 jar,如果没有找到则连接私服从私服下载 jar 包,如果私服没有 jar 包私服同时作为代理服务器从中央仓库下载 jar 包;

在客户端的 setting.xml 中配置私服的仓库, 由于 setting.xml 中没有 repositories 的配置标签需要使用 profile 定义仓库; (配置在<profiles>标签下)

<profile>
    <!--profile 的 id-->
    <id>dev</id>
    <repositories>
        <repository>
        <!--仓库 id, repositories 可以配置多个仓库,保证 id 不重复-->
        <id>nexus</id>
        <!--仓库地址,即 nexus 仓库组的地址-->
        <url>http://localhost:8081/nexus/content/groups/public/</url>
        <!--是否下载 releases 构件-->
        <releases>
            <enabled>true</enabled>
        </releases>
        <!--是否下载 snapshots 构件-->
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    </repositories>
    <pluginRepositories>
        <!-- 插件仓库, maven 的运行依赖插件,也需要从私服下载插件 -->
        <pluginRepository>
            <!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 -->
            <id>public</id>
            <name>Public Repositories</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
        </pluginRepository>
    </pluginRepositories>
</profile>

使用 profile 定义仓库需要激活才可生效

<activeProfiles>
    <activeProfile>dev</activeProfile>
</activeProfiles>

3.把第三方jar包放入本地仓库和私服

1.导入本地库

示例: 将fastjson-1.2.39的jar放到本地仓库

找一个jar测试, 先 CMD 进入到 jar 包所在位置, 然后运行下面命令:

mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.2.39 -Dfile=fastjson-1.2.39.jar -Dpackaging=jar

在Maven仓库的 \com\alibaba 目录下可以找到这个jar文件

2.导入私服

示例: 将fastjson-1.2.39的jar放到私服仓库

<!-- 要在 maven 软件的核心配置文件 settings.xml 中配置第三方仓库的 server 信息 -->
<server>
    <id>thirdparty</id>
    <username>admin</username>
    <password>admin123</password>
</server>
然后 CMD 进入到 jar 包所在位置, 然后运行下面命令:

mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.2.39 -Dpackaging=jar -Dfile=fastjson-1.2.39.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty

文件访问: 在nexus的 sonatype-work\nexus\storage\thirdparty 目录下可以找到这个jar包; 
通过浏览器访问: "http://localhost:8081/nexus/", 然后nexus——>repositories——>thirdparty可以找到这个jar包;

3.导入第三方 jar 包时执行的命令参数

DgroupId 和 DartifactId:
    构成了该 jar 包在 pom.xml 的坐标,项目就是依靠这两个属性定位; 自己起名字也行; 
Dfile:
    表示需要上传的 jar 包的绝对路径;(包含文件名,上面的命令中是使用相对路径)
Durl:
    私服上仓库的位置,浏览器上访问 "http://localhost:8081/nexus/"  
    然后找到nexus——>repositories 菜单,可以看到该路径在靠右边的位置;(没有这个参数表示本地仓库)
DrepositoryId: 
    服务器仓库的表示 id (表示上传到哪一个仓库),在 nexus 的 configuration 可以看到;
Dversion:
    表示版本信息;(解压jar包,在 MANIFEST.MF 的文件中有描述该包的版本信息);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342