maven技术整理

01_maven概览
        

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、项目的依赖关系、编译环境、持续集成、项目团队、贡献管理、生成报表等等。总之,它包含了所有的项目 信息。

02_maven安装的注意事项
           
Mave  官网 http://maven.apache.org/
Maven  中央仓库 http://mvnrepository.com/
环境变量: 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  测试资源文件


03_在idea中建立简单的项目
            参数优化 -DarchetypeCatalog=internal
04_maven的依赖特性
           1. GAV
                而Maven坐标主要由GAV(groupId, artifactId, version)构成
                 <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
                  </dependency>
          2.依赖传递
                在非maven项目中,你需要使用spring功能,你会想到导入spring的jar包,那么,srping又需要其他依赖jar包支持,所以你又需要去导入其他jar包,多次反复尝试启动项目后,你终于成功了!
                maven项目就不需要这么麻烦,你只要在pom.xml文件中,引入spring相关配置,那么他会自动引入其他依赖jar包,这就是maven的依赖传递。
           3.依赖范围scope
compile 默认值,适用于所有阶段,会随着项目一起发布。
provided 类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
runtime 只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
                4.排除依赖
                    <dependency>
     <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>
使用通配符进行依赖排除
        <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>
    
05_maven的聚合和继承
         依赖
        继承
             <project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook.account</groupId>
    <artifactId> account-parent </artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>Account Parent</name>
</project>


<project>
    <modelVersion>4.0.0</modelVersion>

    < parent >
        <groupId>com.juvenxu.mvnbook.account</groupId>
        <artifactId> account-parent </artifactId>
        <version>1.0.0-SNAPSHOT</version>
        < relativePath >../account-parent/pom.xml</ relativePath>
    </ parent >

    <artifactId> account-email </artifactId>
    <name>Account Email</name>
  ...
</project>

1、子模块没有声明groupIdversion, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupIdversion ,也可指定;


不应该继承 artifactId, 如果 groupId   version artifactId   完全继承的话会造成坐标冲突;另外即使使用不同的   groupId version ,同样的   artifactId 也容易产生混淆。
        聚合
<project>

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.juvenxu.mvnbook.account</groupId>

    <artifactId>account-aggregator</artifactId>

    <version>1.0.0-SNAPSHOT</version>

    <packaging> pom </packaging>

    <name>Account Aggregator</name>

     <modules>

        <module>account-email</module>

        <module>account-persist</module>

     </modules>

</project>


06_nexus的介绍和安装
  为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库。
          nexus地址:  http://www.sonatype.com/download-oss-sonatype





        用户配置    
< repositories >
      < repository >
          < id >nexus</ id >
          < name >Nexus Repository</ name >
          < url >http://localhost:8081/nexus/content/groups/public/</ url >
      </ 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后看到许多文件的话就说明更新成功









07_发布项目到nexus中
       1. 在pom.xml文件中配置需要发布的工厂
<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>

09_生命周期和插件简介
       一个完整的项目构建过程通常包括清理、编译、测试、打包、集成测试、验证、部署等步骤,
            Maven从中抽取了一套完善的、易扩展的生命周期。Maven的生命周期是抽象的,其中的具体任务都交由插件来完成。Maven为大多数构建任务编写并绑定了默认的插件,如针对编译的插                件:maven-compiler-plugin。用户也可自行配置或编写插件。
 Maven定义了三套生命周期:clean、default、site,每个生命周期都包含了一些阶段(phase)。三套生命周期相互独立,但各个生命周期中的phase却是有顺序的,且后面的phase依赖于前面的phase。执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。

1 . 1 clean生命周期

  1. pre-clean    :执行清理前的工作;
  2. clean    :清理上一次构建生成的所有文件;
  3. post-clean    :执行清理后的工作

1 . 2 default生命周期

default生命周期是最核心的,它包含了构建项目时真正需要执行的所有步骤。

  1. validate
  2. initialize
  3. generate-sources
  4. process-sources
  5. generate-resources
  6. process-resources    :复制和处理资源文件到target目录,准备打包;
  7. compile    :编译项目的源代码;
  8. process-classes
  9. generate-test-sources
  10. process-test-sources
  11. generate-test-resources
  12. process-test-resources
  13. test-compile    :编译测试源代码;
  14. process-test-classes
  15. test    :运行测试代码;
  16. prepare-package
  17. package    :打包成jar或者war或者其他格式的分发包;
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install    :将打好的包安装到本地仓库,供其他项目使用;
  23. deploy    :将打好的包安装到远程仓库,供其他项目使用;

1 . 3 site生命周期

  1. pre-site
  2. site    :生成项目的站点文档;
  3. post-site
  4. site-deploy    :发布生成的站点文档



10_插件的应用

        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>
        tomcat插件
    
<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>
 
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值