Maven入门教程
一 介绍环境
Maven 是一个采用采用纯java编写的项目管理工具,maven采用了一种被称之为Project Object Model(POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件Maven可以管理项目的整个生命周期,包括清除.编译.测试.报告.打包.部署等等。
目前Apache下绝大多数项目都已经采用了Maven进行管理,而maven本身又支持多种插件,可以方便灵活的控制项目,作为开发人员的我们更应该的是关注商业逻辑,而不是把时间浪费在不同环境中去依赖jar包部署等。Maven把我们从中解脱出来了。
说明:
maven根据pom.xml文件,把它转化成项目对象模型(POM),这个时候要解析依赖关系,然后去相对应的maven库中查找到依赖的jar包。
在clean,compile,test,package等阶段都有相应的Plug-in来做这些事情。
而这些plug-in会产生一些中间产物。
本地仓库
~/.m2/repository/
每一个用户也可以拥有一个本地仓库
远程仓库
中央仓库:Maven默认的远程仓库http://repo1.maven.org/maven2
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
镜像:用来替代中央仓库,速度一般比中央仓库快
二Maven的作用
(1):jar的声明式依赖管理
(2):项目的自动构建
三maven的下载安装与配置eclipse||myeclipse
(1) 下载路径Maven – Download Apache Maven
(2) 假如下载后解压到D盘
(3) 目录介绍
bin:含有mvn运行的脚本
boot:含有plexus-classworlds类加载器框架
conf:含有settings.xml配置文件
|
|--settings.xml
|--toolchains.xml
lib:含有Maven运行时所需要的java类库
|
|--各种jar包
|--maven-model-builder-3.3.9.jar
|--pom.xml
整个安装目录下两个重点文件
*settings.xml可以通过它来配置用户的本地仓库,方便用户在本地添加jar包
*pom.xml 工程中的主要依赖配置文件
Settings.xml中的主要配置的地方:
可以通过配置这个位置来配置本地仓库。
配置私服的路径
直接连接互联网
如果不想连接私服,可以直接连接互联网。只需要把连接私服的所有的路径去掉即可。
通过在setting中对配置文件进行配置,我们就可以通过不同的途径去访问jar包,指导我们的整个项目的进展。
l 配置环境变量(配置之前,必须确定配置了JDK环境变量)
MAVEN_HOME : D:\apache-maven-3.0.2
把此命令添加到Path中: %MAVEN_HOME%\bin\
l 配置用户范围的settings.xml
MAVEN_HOME/conf/settings.xml 全局的
l 验证安装是否成功
在命令行上输入: mvn-version;回车, 如看到下面信息表示安装成功
(4) 关联eclipse或myeclipse
如图所示,windowsàpreferenceàmyeclipse自带maven,从上图看以看到MavenJDK是可以配置的,这里用了jdk1.6
从上图可以看出,我们可以利用myeclipse自带的maven,也可以使用自己的maven。
上图应用的就是自己的maven。
从最下面可以看出,这是settings.xml文件的路径。
这幅图说明了用户的settings.xml文件的位置和用户的仓库的位置。
这是最基本的环境的配置。
四:创建maven项目
1 maven约定(可更改)
src/main/java 存放项目的java文件
src/main/resources 存放项目的资源文件,如spring,hibernate的配置文件
src/test/java 存放所有的测试的java文件
src/test/resources 存放测试用的资源文件
target 项目输出位置
pom.xml 文件
2创建maven工程
1创建java project
选择Maven Project
选择快速创建maven-archetype-quickstart
填写group ID,Artiface Id,Version,Package属性
然后点击finish就可以了。
2创建web project
新创建一个web project
添加maven support即可。
生成的项目
创建一个包cn.itcast.maven,并在该包下创建一个类
编写Hello类
在src/test/java中创建一个包cn.itcast.maven,创建一个测试类HelloTest
编写测试类
编辑pom.xml文件
说明:
project:表示一个工程
modelVersion:为版本号
用maven命令编译项目(mvn compile)
在命令行出现这样的形式,说明编译OK了。
target文件夹的变化
可以看到编译后的文件全部放入到了target里。
clean
执行命令mvn clean
说明执行成功了。
可以看到target的目录没有了。
test
执行mvn test命令
说明执行成功了,并且运行了一个类,再次看target的结构
说明:
target/classes
存放编译后的类
target/test-classes
存放编译后的测试类
target/surefire-reports
存放测试报告
可以看出,只要进行测试,清理和编译可以自动执行了。
package
执行mvn install
这个界面说明打包成功了。
说明:
target/classes
编译后的类的路径
target/test-classes
编译后的测试类的路径
target/surefire-reports
测试报告
target/maven-archiver
执行package的归档
Hello-0.0.1-SNAPSHOT.jar
执行完package命令后打成的jar包
Hellofriend项目
建立HelloFriend项目工程
编写pom.xml文件
执行mvn compile命令
执行这个命令的时候会出错,因为HelloFriend项目是建立在Hello项目基础之上的,但是现在工程中没有引入Hello.java这个类。所以会出错。
执行mvn cleaninstall命令
打开命令行
把当前路径调节到Hello工程的根目录
执行mvn clean install命令,把Hello整个工程放入到仓库中
如果执行成功,则会在仓库中看到。
在仓库中的位置。
执行mvn package命令打包HelloFriend工程
说明成功了。
可以看到成功以后,在target目录下多了一个jar包
该jar包为当前工程的jar包。
建立cn.itcast.maven包及HelloFriend类
编辑HelloFriend类
建立cn.itcast.maven包和测试类HelloFriendTest类
编辑HelloFriendTest类
执行mvn package命令
上图中的”say hello”就是输出的结果。
五:非约定路径与私服nenuxs:
<!-- 用来定义构建阶段的标签 -->
<build>
<!-- 由于采用的非Maven的约定,则在构建的时候要指定的目录 -->
<sourceDirectory>${basedir}/src</sourceDirectory>
<outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory>
<resources>
<!-- 资源文件也存放到src中但排除 *.java -->
<resource>
<directory>${basedir}/src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
Maven私服
中央仓库注意事项
地址: 目前来说:http://repo1.maven.org/maven2/是真正的Maven中央仓库的地址,该地址内置在Maven的源码中其他的都是镜像
索引: 中央仓库带有索引文件以方便用户对其进行搜索,完整的索引文件大小约为60M,索引每周更新一次
黑名单: 如果某个IP地址恶意的下载中央仓库内容,例如全公司100台机器使用同一个IP反复下载,这个IP(甚至是IP段)会进入黑名单,因此稍有规模的使用Maven时,应该用
内置属性:主要有两个常用内置属性——${basedir}表示项目根目录,即包含pom.xml文件的目录;${version}表示项目版本。POM属性:pom中对应元素的值。例如${project.artifactId}对应了<project><artifactId>元素的值,常用的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. ${project.version}:项目的version,于${version}等价 ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}${project.version}.
自定义属性:在pom中<properties>元素下自定义的Maven属性。
-
[html] view plaincopy
- <project>
- <properties>
- <my.prop>hello</my.prop>
- </properties>
- </project>
- Settings属性:与POM属性同理。如${settings.localRepository}指向用户本地仓库的地址。
- Java系统属性:所有Java系统属性都可以使用Maven属性引用,例如${user.home}指向了用户目录。可以通过命令行mvn help:system查看所有的Java系统属性
- 环境变量属性:所有环境变量都可以使用以env.开头的Maven属性引用。例如${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。也可以通过命令行mvn help:system查看所有环境变量。
Nexus架设私服
为什么需要私服
公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库
Nexus环境搭建
第一步:下载nexus-webapp-1.9.2.4.war包,然后拷贝到tomcat下的webapps目录中
第二步:启动tomcat 默认登录账户密码为: admin admin123
第三步:访问http://localhost:8080/项目名称/
认识repository
Nexus仓库的默认的地址,nexus-2.1.2\WEB-INF\plexus.properties中定义的
在Views/Repositories-->Repositories里进行配置, nexus里可以配置3种类型的仓库,分别是proxy、hosted、group
proxy:是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用
Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted里
Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了右边那个Repository Path可以点击进去.
virtual:也是中央仓库镜像,支持M1老版本
每个仓库的作用
3rd party: 无法从公共仓库获得的第三方发布版本的构件仓库 |
Central Repository
最关键的一个配置, 就是Central Repository的proxy配置,因为大部分的构件,都是要通过这个proxy得到的,
配置HostedRepository
一般会配置3个hosted repository, 分别是3rd party、Snapshots、Releases,分别用来保存第三方jar(典型的比如ojdbc6.jar),项目组内部的快照、项目组内部的发布版, 这里并没有什么特别的配置,只是Deployment Policy这个选项,一般Snapshots会配置成允许,而Releases和3rd party会设置为禁止
配置grouprepository
前面说过group其实是一个虚拟的仓库,通过对实体仓库(proxy、hosted)进行聚合,对外暴露一个统一的地址这里要注意的是,放到左边的仓库,才是会被聚合的仓库