目录
一.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的安装
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 的文件中有描述该包的版本信息);