Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布项目信息的方式,以及一种在多个项目中共享JAR的方式。
POM全称是Project Object Model,即项目对象模型。pom.xml是maven的项目描述文件,它类似与antx的project.xml文件。
pom.xml文件以xml的 形式描述项目的信息,包括项目名称、版本、项目id、项目的依赖关系、编译环境、持续集成、项目团队、贡献管理、生成报表等等。总之,它包含了所有的项目 信息。
环境变量: M2_HOME仓库位置选择setting.xml <localRepository>存储位置</localRepository>
创建一个maven项目
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart
mvn archetype:create
-DgroupId=com.burlesontech.sw
-DartifactId=webapp
-DarchetypeArtifactId=maven-archetype-webapp
maven基本目录src/main/java 源码目录
src/main/resources 存放资源文件
src/main/webapp web root
src/test/java 测试源码目录
src/test/resources 测试资源文件
<groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
compile 默认值,适用于所有阶段,会随着项目一起发布。 provided 类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 runtime 只在运行时使用,如JDBC驱动,适用运行和测试阶段。 test 只在测试时使用,用于编译和运行测试代码。不会随项目发布。 system 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
<groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.5.1</version><exclusions><exclusion><groupId>tomcat</groupId><artifactId>jasper-runtime</artifactId></exclusion><exclusion><groupId>tomcat</groupId><artifactId>jasper-compiler</artifactId></exclusion></exclusions></dependency>
<groupId>org.apache.phoenix</groupId><artifactId>phoenix-core</artifactId><version>4.5.0-HBase-1.0</version><exclusions><exclusion><groupId>org.mortbay.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency>
1、子模块没有声明groupId和version, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupId、version ,也可指定;
不应该继承 artifactId, 如果 groupId , version , artifactId 完全继承的话会造成坐标冲突;另外即使使用不同的 groupId 或 version ,同样的 artifactId 也容易产生混淆。
为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库。
<
repositories
>
<
repository
>
<
id
>nexus</
id
>
<
name
>Nexus Repository</
name
>
</
repository
>
</
repositories
>
全局配置:
<profiles>
<profile>
<id>nexusProfile</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<!-- releases默认是true -->
<releases><enabled>true</enabled></releases>
<!-- snapshots默认是false -->
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<!-- 激活nexusRepo这个profile:只有激活才生效 -->
<activeProfile>nexusProfile</activeProfile>
</activeProfiles>
配置Nexus的镜像
<
mirrors
>
<
mirror
>
<
id
>nexusMirror</
id
>
<
mirrorOf
>*</
mirrorOf
>
<
name
>Human Readable Name for this Mirror.</
name
>
</
mirror
>
</
mirrors
>
索引配置
1.手动更新
1. 下载索引文件
在http://repo.maven.apache.org/maven2/.index/ 中下载
nexus-maven-repository-index.gz
nexus-maven-repository-index.properties
然后再下载一个indexer-cli-5.1.0.jar
indexer的下载地址:http://maven.outofmemory.cn/org.apache.maven.indexer/indexer-cli/5.1.0/
indexer的Maven
1
2
3
4
5
|
<
dependency
>
<
groupId
>org.apache.maven.indexer</
groupId
>
<
artifactId
>indexer-cli</
artifactId
>
<
version
>5.1.0</
version
>
</
dependency
>
|
2. 解压缩索引文件
将上面三个文件(.gz & .properties & .jar)放置到同一目录下,运行如下命令
java -jar indexer-cli-5.1.0.jar -u nexus-maven-repository-index.gz -d indexer
3. 停止nexus
4. 删除原有的索引文件
将{nexus_home}\sonatype-work\nexus\indexer\central-ctx下的文件全部删掉
5. 拷贝索引至central-ctx目录下
将nexus-maven-repository-index.gz解压后的indexer目录中所有文件,放到sonatype-work\nexus\indexer\central-ctx下面
6. 启动nexus即自动更新索引
2.自动下载
1. 打开Repositories标签,选中远程仓库并打开Configuration,将Download Romote Location 设置为true;
2. 在远程仓库上右键选择Update Index,Nexus会自动建立一条任务计划;一般远程仓库都比较大,构建会比较多,索引文件会很大,像http://repo1.maven.org/maven2 就有几百M,因此需要的时间就比较长。
3. 可以进入Scheduled Tasks查看任务的执行情况,当执行完成时,远程仓库的索引就已经建立完毕了。
两种方式,只要Browse_Index后看到许多文件的话就说明更新成功
<distributionManagement>
<!-- 两个ID必须与setting.xml中的<server><id>nexus-releases</id></server>保持一致-->
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
2.给用户授权,让其有权发布项目
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
1 . 1 clean生命周期
- pre-clean :执行清理前的工作;
- clean :清理上一次构建生成的所有文件;
- post-clean :执行清理后的工作
1 . 2 default生命周期
default生命周期是最核心的,它包含了构建项目时真正需要执行的所有步骤。
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources :复制和处理资源文件到target目录,准备打包;
- compile :编译项目的源代码;
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile :编译测试源代码;
- process-test-classes
- test :运行测试代码;
- prepare-package
- package :打包成jar或者war或者其他格式的分发包;
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install :将打好的包安装到本地仓库,供其他项目使用;
- deploy :将打好的包安装到远程仓库,供其他项目使用;
1 . 3 site生命周期
- pre-site
- site :生成项目的站点文档;
- post-site
- site-deploy :发布生成的站点文档
Maven的核心文件很小,主要的任务都是由插件来完成。定位到:%本地仓库%\org\apache\maven\plugins,可以看到一些下载好的插件:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target></configuration></plugin>
<plugin>
<!-- 支持tomcat7,8 ,
conf/tomcat-users.xml添加用户名与密码配置,然后启动tomcat,插件通过访问url管理界面,上传war包到tomcat中,实现部署
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="gvc" password="gvc12EE44B110202859" roles="manager-gui,manager-script"/>
1 要求tomcat为还装,webapps下有manager工程
2 远程tomcat开启 startup.sh
只支持发布,重新发布-->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://127.0.0.1:8080/manager/text</url>
<username>tomcat</username>
<password>tomcat</password>
<path>/${project.artifactId}</path>
</configuration>
</plugin>