maven基础
maven开发项目 jar包不在项目中 配置jar包的坐标
---依赖管理:
maven工程对jar包的管理过程
---maven构建
项目从编译、测试、运行、打包、安装、部署整个过程交给maven进行管理
---寻找jar包
配置文件坐标 --》系统盘找本地仓库 --》(本地仓库未找到并联网)到中央仓库(放置了几乎所有开源的jar包)下载
--》(本地仓库未找到并在同一局域网)远程仓库(私服)(jar包没有则到中央仓库)^
---仓库三类:【本地】 【远程(私服)】 【中央仓库】
---项目部分:【核心代码】 【配置文件】 【测试代码】 【测试配置文件】
---Maven项目标准目录结构:
src/main/java 核心代码
src/main/resources 配置文件
src/test/java 测试代码部分
src/test/resources 测试配置文件
src/main/webapp 页面资源,js、css、图片等等
---maven两大核心功能
依赖管理
一键构建
---maven常用命令
【clean清理】 清理项目编译所有信息
【compile编译】 把src/main/java下的类文件编译为class文件
【test测试】 把src/main/java和src/test/java下的类文件都编译
【package打包】 把src/main/java和src/test/java下的类文件都编译并打成war包
【install安装】 把src/main/java和src/test/java下的类文件都编译并打成war包并把war包安装到了本地仓库
【deploy发布】 不可直接执行,需要进行配置
往后的命令都会把前一个命令执行一次
---maven生命周期
清理生命周期: clean
默认生命周期: compile-->test-->package-->install-->deploy 每一个构建项目的命令都对应了maven底层一个插件
站点生命周期:
---项目对象模型(POM)
项目自身信息 ==》依赖管理模型
项目运行所依赖的jar包信息
项目运行环境信息,比如:jdk、tomcat信息
--依赖管理模型(dependency)
<dependency>
<groupId>javax.servlet</groupId> //公司组织名称:路径
<artifactId>servlet-api</artifactId> //项目名
<version>2.5</version> //版本号
<scope>provided</scope> //jar作用域
</dependency>
---pom引入的jar包作用域 provided
compile 编译、测试、运行有效 参与打包
test 测试 不参与打包
provided 编译、测试 不参与打包
runtime 测试、运行
system 编译、测试
---工程运行环境的修改
<bui1d>
<plugins>
<p1ugin><!--配置运行tomat版本-->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<bersion>2.2</version>
<configuration>
<port>8888</port><!--修改端口号-->
</configuration>
</plugin>
<plugin><!--配置maven编译插件版本 即jdk版本-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
maven项目管理笔记
----maven:一个项目管理工具
--1-依赖管理:maven对项目中jar包的管理过程。
传统工程==直接把jar包放置在项目中
maven工程==真正的jar包放置在仓库中,项目中只用放置jar包的坐标。
--仓库三类:【本地】 【远程(私服)】 【中央仓库】
--仓库间的关系:
1-启动maven工程时,maven工程通过pom文件中jar包坐标去本地仓库
2-默认情况下,如果本地仓库没有对应jar包并连着网,maven工程自动去中央仓库下载jar包到本地仓库。
3-本地仓库没有对应jar包,没有网,在公司同一局域网下,会先从公司私服下载jar包
4-私服没有jar包,可从中央仓库下载,也可从本地上传
--2-一键构建:maven自身集成了tomcat插件,可以对项目进行编译、测试、打包、安装、发布等操作。
--maven常用命令
【clean清理】 清理项目编译所有信息
【compile编译】 把src/main/java下的类文件编译为class文件
【test测试】 把src/main/java和src/test/java下的类文件都编译
【package打包】 把src/main/java和src/test/java下的类文件都编译并打成war包
【install安装】 把src/main/java和src/test/java下的类文件都编译并打成war包并把war包安装到了本地仓库
【deploy发布】 打jar包上传到私服。不可直接执行,需要进行配置
----Maven导入jar包冲突解决
<dependencies>
<!--maven工程要导入jar包的坐标,就必须要考虑解决jar包冲突
解决jar包冲突的方式一:
==第一声明优先原则:那个jar包的坐标靠上的位置,这个jar包就是先声明的
先声明的jar包坐标下的依赖包,可以优先进入项目中
解决jar包冲突的方式二:
==maven导入jar包的一些概念
==直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包
==传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去
==路径近和优先原则。直接依赖路径比传递依赖路径近,那么最终进入项目的jar包回事路径近的直接依赖包
解决jar包冲突的方式三:
==当我们要排除某个jar包下依赖包,在配置exclusions标签的时候,内部可以不写版本号。
因为此时依赖包使用的版本和默认本直接导入的jar包版本一样
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version><!--传递依赖:会导入spring-core:4.2.4.RELEASE-->
<exclusions>
<exclusion><!--排除该jar包下的传递依赖包spring-core-->
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version><!--传递依赖:会导入spring-core:5.0.2.RELEASE-->
</dependency>
<!--<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.8.RELEASE</version><!–直接依赖:会导入spring-4.2.8.RELEASE–>
</dependency>-->
</dependencies>
----以上坐标最终导入传递依赖:spring-core:5.0.2.RELEASE的jar包
----该解决jar包冲突的原则不是做一次项目用一次,而是有时需要导入一个新jar包时需要用(遵循)
----pom文件内标签
<!--
Maven工程是可以分父子依赖关系的。
凡是依赖别的项目后,拿到的项目的依赖包,都属于传递依赖。
比如:当前a项目,被b项目依赖。那么a项目中所有jar包都会传递到b项目中。
b项目开发者如果爱b项目中导入一套ssm框架的jar包,对于b项目是直接依赖
那么直接依赖的jar包就会把a项目传递过去的jar包覆盖掉。
为了防止以上情况的出现。我们可以把a项目中主要jar包的坐标锁住,那么其他依赖该项目的项目中,
即便有同名jar包直接依赖,也无法覆盖。
-->
【<dependencyManagement>】== 锁定jar包版本
如在pom文件里加入:
<dependencyManagement>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
--是赋值一份jar包坐标到该标签里,不是剪切,如果pom文件外没有jar包坐标,即便锁住也没用,因为根本就没有导入该jar包
【<properties>】 定义属性,便于统一管理。标签内标签名称可随意定义。
如在pom文件里加入:
<!-- 定义属性 -->
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
<mysql.version>5.1.6</mysql.version>
</properties>
<!-- 引用定义的属性 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version><!-- 引用定义的属性 -->
</dependency>
----xml文件能写啥标签,全看文件上面的约束
----maven工程拆分与聚合
---拆分思想:maven把一个完整的项目,分成不同独立模块,这些模块都有各自独立的坐标。那个地方需要其中某个模块,就直接引用该模块坐标即可。
今后公司开发一个新项目,先考虑的不是dao、service、utils、domain等如何编写,而是考虑这些模块是否已经存在。如果存在,直接引用。
---聚合思想:可以把拆分零散的模块聚合到一起编写一个完整的项目。
---工程和模块的区别:
工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,
代码完整,就可以说这是一个完整的项目。此项目是工程和模块没有关系。
工程只能使用自己内部的资源,工程天生是独立的。后天可以和其他工程或模块建立关联关系。
模块天生不是独立的,模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用。
---工程和模块关系:
1-父子工程直接,子模块天生集成父工程,可以使用父工程所有资源。
2-子模块天生之间天生没有关系。
3-父子工程之间,不用建立关系。继承关系是先天的,不需要手动建立。
4-平级之间的引用叫依赖,依赖不是先天的,需要后天建立。
---传递依赖下来的包是否能用?
--传递下来的包是否能用,参考如下:
-----------------------------------------------------------
直接\传递 compile privider runtime test
-----------------------------------------------------------
compile compile - runtime -
-----------------------------------------------------------
privider privider privider privider -
-----------------------------------------------------------
runtime runtime - runtime -
-----------------------------------------------------------
test test - test -
-----------------------------------------------------------
直接依赖:作用域==compile
传递依赖:作用域==test
--如果对应 - ,表示传递丢失。
实际开发中,如果传递依赖丢失,表现形式就是jar坐标导不进去,做法就是直接再导入一次。一般不会来查找是否真的导不进去。
----私服的应用
--安装与启动
解压安装包,执行bin下nexus.bat文件安装服务
conf目录下nexus.properties为主配置文件
默认端口:8081
可以访问图形化界面,登录:默认账号==admin 密码==admin123
releases==正式版(发行版)
snapshot==测试版
hosted==第三方
proxy==代理 contral==中央仓库
--配置group后:自动先从releases下载没有到snapshot没有到第三方下载没有到中央仓库下
--私服操作:
--代码传到私服:
1-先可以登录,配置maven配置文件server标签下添加登录配置
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
2-待上传代码模块pom.xml文件上配置上传配置
<distributionManagement>
<repository>
<id>releases</id> <?--注意:pom.xml 这里<id> 和 settings.xml中配置的登录的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>
3-执行maven中deploy命令
4-上传后还是无法使用?因为能上传不一定能下载,所以需要爱maven的配置文件中配置下载
<!-- 下载jar包配置 -->
<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>
<!-- 激活下载中配置 -->
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
----安装第三方jar包到本地仓库
1-cmd进入jar包所在目录运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar
2-打开cmd直接运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\jar包\fastjson-1.1.37.jar(jar包所在目录)
----安装第三方jar包到私服
1-在maven的settings配置文件中添加登录私服第三方登录信息
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
2-cmd进入jar包所在目录运行
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
或2-打开cmd直接运行
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\jar包\fastjson-1.1.37.jar(jar包所在目录)-Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty