一想到它,就会联想到web里面导入大量的jar包,每创建一个工程,都要导入jar,使用了
maven就没那么麻烦了。当然maven的好处还不仅仅与此,关于maven配置这里不多讲,可以去看其他文章
POM即 Project Object Model 项目对象模型。Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中 进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂。所以,maven 环境搭建好之后,所有的学习和 操作都是关于 pom.xml 的。
我们常见的
依赖
在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包。
Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范
拥有了统一规范,就可以把查找工作交给机器
上面scope是范围设置:意思是依赖它的人只在test目录中才能@Test,它自己的工程下也是
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动
开发会复制粘贴就行了,一般公司会给出固定的,自己不能用其他的,以免出问题
电脑需要配置环境变量,还有config中setting的maven中jar包的地址
idea中配置
注意other setting中也要设置,刚刚设置的只是本工程的
创建,我们讲创建web那个
创建完成后设置目录样式
不是这样就自己右键设置modules
配置tomcat,验证是否成功
好了,我们来讲一个例子
再把之前写的增删改查copy进来
运行还是没问题的
那我们继续往下走
maven的生命周期
install相当于执行我们之前的所有操作,我们打包后保存看看,在仓库中找到了我们解压的包
好了,我们继续往下
依赖
B工程依赖A工程,C工程依赖B工程,那么B工程是C工程的直接依赖,A工程是C工程的间接依赖
直接依赖:工程1依赖工程2
这是工程2,我们打成jar包
在工程1里面设置工程2的依赖
我们来看看可不可以用工程2里面的servlet和test
可以的,接下来我们来看看间接依赖,我们创建一个工程3,依赖工程1
相当于工程3间接依赖工程2,直接依赖与工程1,先打包工程1
还是没问题的
接下来讲父子工程---父工程下很多子模块
创建父工程,不使用骨架
创建后直接把目录src删掉
第二步:创建 dao 子模块 创建的时候必需选择 父工程 然后去创建 可以不使用骨架
第三步:创建 servcie 子模块 与 dao创建方式一样
第四步:创建 web子模块 选择骨架创建还有util-maven,最后我才补上
创建dao,这里我没使用骨架
如果创建工程没有选择父类,则在这里手动把父类的xml坐标引入
创建web,使用骨架,
最后看看父类的 坐标
在service层创建dao的依赖,在web层创建
最后一定要install
然后在父类写入所有开发中需要的jar包的坐标,其他工程都可以使用
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--依赖servlet 包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- jsp如需需要支持EL表达式必需加这句 page isELIgnored="false"-->
<!--依赖数据库的 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.5</version>
</dependency>
<!--依赖jstl包-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
配置tomcat,运行检查是否有问题
把我们之前写的工程都copy进来
运行是没问题的
关于父类版本的集中管理(这样便于快速修改)
仓库分为本地仓库,私服,中央仓库
用来统一存储所有Maven共享构建的位置就是仓库。根据Maven坐标定义每个构建在仓库中唯一存储路径大致为:groupId/artifactId/version/artifactId-version.packaging
下面我们来讲一下私服:私服,私有服务器,是公司内部Maven项目经常需要的东东,不总结一下,不足以体现出重视。Nexus是常用的私用Maven服务器,一般是公司内部使用
Nexus常用功能就是:指定私服的中央地址、将自己的Maven项目指定到私服地址、从私服下载中央库的项目索引、从私服仓库下载依赖组件、将第三方项目jar上传到私服供其他项目组使用。
cmd 进入 bin目录,执行 nexus.bat start
访问一下访问URL: http://localhost:8081/nexus/
默认账号:
用户名: admin
密码: admin123
仓库有4种类型 :
- group(仓库组):一组仓库的集合
- hosted(宿主):配置第三方仓库 (包括公司内部私服 )
- proxy(代理):私服会对中央仓库进行代理,用户连接私服,私服自动去中央仓库下载jar包或者插件
- virtual(虚拟):兼容Maven1 版本的jar或者插件
Central:中央仓库
Releases:生产版本使用
Snapshots:投产使用
下面我们来举个例子
将项目发布到私服
企业中多个团队协作开发通常会将一些公用的组件、开发模块等发布到私服供其它团队
或模块开发人员使用。
本例子假设多团队分别开发dao、service、web,某个团队开发完在dao会将dao 发布到私服供service团队使用,本例子会将dao 工程打成jar 包发布到私服。
准备工作setting.xml
配置连接私服的用户和密码 。
此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和密码一致。
setting.xml
哪个代码需要上传就在哪个pom.xml文件下加入如下,我们这里是dao
上传到仓库
目录能看到包:nexus-2.12.0-01-bundle\sonatype-work\nexus\storage\snapshots
Public Repositories:该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务
现在我们模拟:假如我是其他团队,我们新创建一个工程,来使用我们上传的jar包
maven的setting配置如下
<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>
</profiles>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
在此之前我们把maven本地仓库的dao给删了,它本地仓库找不到文件就会去私服找
我没看还是可以的,好了这期就讲到这里