Maven
Maven的拆分与聚合
一个完整的早期开发好的crm项目,现在要使用maven工程对它进行拆分,这时候就可以将dao拆解出来形成表现独立的工程,同样service,action也都这样拆分
- 工程拆分之后,将来还要聚合(聚合就是将拆分的工程进一步组合在一起,又形成一个完整的项目)
- 为了达到聚合的目标,所以今天会引入
- 父工程(maven project)
- 子模块(maven module) dao ,service, web
开发步骤:
- 创建一个maven父工程
创建后的父工程如下:
从它的目录结构可以看出,父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标了 - 创建这个父工程的子工程
点击next,进入下图:
点击next: - 再次查看父工程的pom.xml工程
- 查看子模块的pom.xml,发现多了一个parent结点
并且内部所包含的结点,其实就是父工程的坐标12坐标=groupId+artifactId+version组织名 项目名 版本
冲突问题的解决
通过添加<exclusion>
标签来解决冲突
- 在父工程中引入了struts-core,hibernate-core,就发现jar包是有冲突的
- Javassist存在版本上冲突问题,一个高版本一个低版本
解决:去除struts2中的javassist,就要在struts依赖中右键
进入下图
会在工程中添加:
依赖调解原则
maven自动按照下边的原则调解:
- 第一声明者优先原则
在pom文件定义依赖,先声明的依赖为准
struts-spring-plugins
和spring-context
中都有spring-beans
,前者是4.2.4版本比较高。- 测试:
如果将struts-spring-plugins
放在spring-context
前面,系统将导入spring-beans-4.2.4
。 - 分析:
由于spring-context
在前边以spring-context
依赖的spring-beans-4.2.4
为准,所以最终spring-beans-4.2.4
添加到了工程中。
- 测试:
- 路径近者优先原则
还是以上面为例子:如果手动引入一个spring-beans
,则会导入手动引入的这个,因为这个不需要依赖其他的jar包而存在,找到的时候路劲最短。
使用版本锁定实现冲突解决
- 首先父工程中pom.xml文件中添加
<dependencyManagement>
- 在父工程中锁定,他本身并不引入坐标,他会规定他所依赖的项目要引这个坐标时,会在锁定的版本前面有一个小锁,开发的时候就要选择锁定的那个版本。
- 锁定之后父项目并没有引入这个坐标,这是锁定了而已
- 然后哪个项目需要在引入
- 在使用坐标时,对于同一个框架,引入多次时,它的版本信息就会多次出现,所以
- 可以借用常量的思想,将这些版本号提取出来,在需要用到的时候,直接写版本的常量名称就可以了。
- 引上面的常量
依赖关系
依赖具有传递性,但不是无限传递的,传递的规则如下:
解决方法:
如果在依赖传递过程中,导致jar包丢失,我们的做法很简单,就是再导入一次坐标
依赖具有传递性: action依赖于service,如果在service中引入dao,那么在action中引入service的时候会把dao引入进来
如果想把引入的jar包所依赖的jar包全部干掉就再上面解决冲突中的代码中
<artifactId>*</artifactId> <groupId>*</groupId>
加*即可
继续开发添加service跟dao
- 创建一个maven module项目
创建结束后,父工程中结构如下:
父工程的pom.xml文件如下: - 在service的pom.xml文件中引入dao的jar包
- Web层的子模块创建:web层的packing就不是jar了
web是要依赖service
配置文件的添加:
- 整合applicationContext的时侯,因为每层要用到的配置不一样,所以可以把它分为三个配置文件最后在通过123<import resource="classpath:spring/applicationContext-dao.xml"/><import resource="classpath:spring/applicationContext-service.xml"/><import resource="classpath:spring/applicationContext-action.xml"/>
这种方式把三个配置文件整合到一起,放到web层下。
- hibernate中的配置如下(有一些改进的地方):
|
|
- 还需要注意,hibernate的映射文件要建好对应的包结构
\src\main\resources\cn\itcast\domain
- PO类(实体类的七个规范):
- 是一个共有类
- 提供私有的属性
- 提供共有的getter与setter
- 实现java.io.Serializable
- 提供一个无参的构造方法
- 不要使用final修饰
- 如果是基本数据类型,要使用它的包装类
私服搭建
下载nexus并安装
- 下载
- Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。
- 下载Nexus, 下载地址:
http://www.sonatype.org/nexus/archived/
- 安装并运行:
- 解压进入到指定的目录:
nexu-2.12.0.01-bundle\nexus-2.12.0.-01\bin
- 执行
nexus.bat install
- 安装成功就会在服务中新增一个
nexus
服务
- 解压进入到指定的目录:
卸载
进入到bin目录下执行:nexus.bat uninstall
启动
- 启动:
- 方法一:直接进入到bin目录中执行
nexus.bat start
- 方法二:直接进入到服务列表中启动
- 方法一:直接进入到bin目录中执行
配置
- 查看nexus的配置文件
conf/nexus.properties
|
|
访问:
http://localhost:8081/nexus/
登陆成功之后会有四种仓库类型:
- hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
- proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。
- group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。
- virtual(虚拟):兼容Maven1 版本的jar或者插件
nexus
仓库默认在目录中:
仓库的介绍:
- central:代理仓库,代理中央仓库
- apache-snapshots:代理仓库
存储snapshots构件,代理地址https://repository.apache.org/snapshots/
- central-m1:virtual类型仓库,兼容Maven1 版本的jar或者插件
- releases:本地仓库,存储releases构件。
- snapshots:本地仓库,存储snapshots构件。
- third party:第三方仓库
- public:仓库组
七个仓库对应着本地服务器的nexus-2.12.0-01-bundle/sonatype-work/nexus/storage
测试,上传到私服
使用install会把项目打包放到本地仓库中
要想打包发到本地仓库跟私服你中就要执行以下步骤:
需要在客户端即部署dao工程的电脑上配置
maven
环境,并修改maven目录/conf/settings.xml
文件,配置连接私服的用户和密码 。
此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码 是否和私服中的账号和密码一致。12345678910<server><id>releases</id><username>admin</username><password>admin123</password></server><server><id>snapshots</id><username>admin</username><password>admin123</password></server>在pom.xml中加入一段配置:
12345678910<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>
意思为:配置私服仓库的地址,本公司的自己的jar包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为release则上传到私服的release仓库,如果版本为snapshot则上传到私服的snapshot仓库
现在就可以用
deploy
命令上传到私服中的snapshots
从私服上下载jar包
需求
没有配置nexus之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,有了私服本地项目首先去本地仓库找jar,如果没有找到则连接私服从私服下载jar包,如果私服没有jar包私服同时作为代理服务器从中央仓库下载jar包,这样做的好处是一方面由私服对公司项目的依赖jar包统一管理,一方面提高下载速度,项目连接私服下载jar包的速度要比项目连接中央仓库的速度快的多。
在setting.xml中配置仓库
当然得先保证:本地仓库中跟项目中没有需要的jar包,这里显示dao
把下面的配置文件放到maven的setting配置文件的
profile
结点中,意思是告诉maven本地找不到去哪个私服找(注意如果是在别人的私服中找记得改ip)1234567891011121314151617181920212223242526272829<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>找的时候会到public公共仓库中去找,因为,公共仓库中包含下面几个仓库,会依次寻找:
为了使得这些配置生效需要在配置一下在
profile
结点下边配置一下:123<activeProfiles><activeProfile>dev</activeProfile></activeProfiles>现在在项目中把dao关掉,会报错,在update一下,就会去本地找,找不到再去私服中找,然后找到了先下载到本地仓库中然后就能够使用了就不会报错了
管理仓库组
nexus中包括很多仓库,hosted中存放的是企业自己发布的jar包及第三方公司的jar包,proxy中存放的是中央仓库的jar,为了方便从私服下载jar包可以将多个仓库组成一个仓库组,每个工程需要连接私服的仓库组下载jar包。
打开nexus配置仓库组,如下图:
上图中仓库组包括了本地仓库、代理仓库等。