maven深入介绍
maven依赖范围对传递依赖的影响
比如A依赖B、B依赖C、C可能是A的依赖传递,如下面表格所示:
直接依赖/传递依赖 | compile | provided | runtime | test |
---|---|---|---|---|
complie | compile | - | runtime | - |
provided | provided | provided | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
最左边一列为直接依赖,理解为A依赖B的范围,最顶层一行为传递依赖,理解为B依赖C的范围,行与列的交叉即为A传递依赖C的范围
比如1:A对B有 compile 依赖,B 对 C 有 runtime 依赖,那么根据表格所示 A 对 C 有runtime 依赖。
比如2:maven-dao 依赖 junit,scop 为test;maven-service 依赖 maven-dao;那么maven-dao 工程所依赖的junit 的 jar 没有加入到 maven-service 工程。
比如3:maven-dao 工程依赖 junit 的 scop 为 complie,maven-dao 工程所依赖的 junit的 jar 包会加入到 maven-service 工程中
maven项目发布与下载(基于私服)
下载、安装好nexus,cmd进入 bin 目录,执行nexus.bat start,查看 nexus 的配置文件 conf/nexus.properties;
#Jetty section
application-port=8081 #nexus 的访问端口配置
application-host=0.0.0.0 #nexus 主机监听配置(不用修改)
nexus-wbapp=KaTeX parse error: Expected 'EOF', got '#' at position 46: … #̲nexus 工程目录 #Nex…{bundleBasedir}/…/sonatyoe-work/nexus #nexus 仓库目录
runtime=${bundleBasedir}/nexus/WEB-INF #nexus 运行程序目录
访问:http://localhost:8081/nexus/
点击右上角的 log in,输入账号和密码(内置账号:admin/admin123)登陆
nexus的4种仓库类型
- hosted,相当于本地仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、Snaphots公司内部测试版本仓库
- proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服字段去中央仓库下载jar包或者插件
- group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组
- virtual(虚拟):兼容Maven1版本的jar或者插件
将项目发布到私服或从私服下载
->发布
5. 配置:首先修改settings.xml文件,配置连接私服的用户和密码
6. 配置项目pom.xml
根据工程的版本号决定上层到哪个宿主仓库(release/snapshot),pom.xml中的id与settings.xml中的id对应
->下载
7. settings.sml中配置私服的仓库
配置完成后,eclipse查看有效pom,有效pom是maven软件最终使用的pom内容,有效pom内容如下:pom内容中有两个仓库地址,maven会从前边的仓库的找,如果找不到jar包再从下边的找,从而就实现了从私服下载jar包
maven中pom.xml元素详解
- modelVersion模块版本
- modules引入子模块
- parent引入父模块(packaging为pom),改模块属于聚合体
- dependencyManagement,既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下得依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用,主要作用是:使用dependencyManagement能够统一项目范围中依赖的版本,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,也就不会发生多个子模块使用版本不一致的情况,帮助降低依赖冲突的几率;
- import只在dependencyManagement元素下才有效果,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中
- properties:通过元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。
Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性;
内置属性:两个常用内置属性 b a s e d i r 表 示 项 目 跟 目 录 , 即 包 含 p o m . x m l 文 件 的 目 录 ; {basedir} 表示项目跟目录,即包含pom.xml文件的目录; basedir表示项目跟目录,即包含pom.xml文件的目录;{version} 表示项目版本
pom属性:
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
${project.build.directory} : 项目构建输出目录,默认为target/
${project.outputDirectory} : 项目主代码编译输出目录,默认为target/classes/
${project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/
${project.groupId}:项目的groupId
${project.artifactId}:项目的artifactId
p r o j e c t . v e r s i o n : 项 目 的 v e r s i o n , 与 {project.version}:项目的version,与 project.version:项目的version,与{version} 等价 p r o j e c t . b u i l d . f i n a l N a m e : 项 目 打 包 输 出 文 件 的 名 称 , 默 认 为 {project.build.finalName}:项目打包输出文件的名称,默认为 project.build.finalName:项目打包输出文件的名称,默认为{project.artifactId}- p r o j e c t . v e r s i o n s e t t i n g 属 性 : 与 P O M 属 性 同 理 , 用 户 使 用 以 s e t t i n g s . 开 头 的 属 性 引 用 s e t t i n g s . x m l 文 件 中 的 X M L 元 素 的 值 。 j a v a 属 性 : 所 有 j a v a 系 统 属 性 都 可 以 用 M a v e n 属 性 引 用 , 如 {project.version} setting属性: 与POM属性同理,用户使用以settings. 开头的属性引用settings.xml文件中的XML元素的值。 java属性: 所有java系统属性都可以用Maven属性引用,如 project.versionsetting属性:与POM属性同理,用户使用以settings.开头的属性引用settings.xml文件中的XML元素的值。java属性:所有java系统属性都可以用Maven属性引用,如{user.home}指向了用户目录。
环境变量属性:
所有环境变量属性都可以使用以env. 开头的Maven属性引用,如${env.JAVA_HOME}指代了JAVA_HOME环境变量的的值。