• IDEA中maven的使用


    一、背景

      1.项目中jar包资源越来越多,jar包的管理越来越繁琐。要为每个项目导入所需的jar,需要自己搜集全部jar --繁琐
      2.项目中的jar如果需要版本升级,就需要再重新搜集jar --复杂
      3.相同的jar在不同的项目中保存了多份--存储冗余,散乱
    java项目需要一个统一的便捷的管理方案-------maven。
    Maven是一个基于项目对象模型(POM)的概念的纯java开发的开源的项目管理工具。主要用来管理java项目,进行依赖管理(jar包管理,能自动分析项目所需的依赖软件包,并到Maven仓库区下载)
    和项目构建(项目编译、打包、测试、部署)。此外还能分块开发,提高开发效率。

    二.Maven下载

      http://maven.apache.org/download.cgi

    三. Maven安装

    3.1解压

      注意:解压文件尽量不要放在含有中文或者特殊字符的目录下。
      解压后,有如下目录:
      

    3.2环境变量

      maven依赖java环境,所以要确保java环境已配置好(maven-3.3+需要jdk7+)

      `MAVEN_HOME = maven的安装目录`

      `PATH = maven的安装目录下的bin目录

    3.3测试  

    #查看maven版本信息:mvn - v
     

    4. maven配置

      maven的conf目录下,有maven的配置文件settings.xml  
      添加<localRepository>配置maven的"本地仓库"位置,用于存放项目中的相关依赖(比如所有jar)

      

    <settings xmlns = "http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <!-- localRepository
    | The path to the local repository maven will use to store artifacts.
    |
    | Default: ${user.home}/.m2/repository
    <localRepository>/path/to/local/repo</localRepository>
    -->
    <localRepository>D:Program Filesmavenmyrepository</localRepository>
    在<profiles>标签中增加一个<profile>标签,限定maven项目默认的jdk版本
    .内容如下

      

    <profiles>
    <!-- 在已有的profiles标签中添加profile标签 -->
        <profile>
            <id>myjdk </id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
               <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles>
    <!-- 让增加的profile生效 -->
    <activeProfiles>
        <activeProfile>myjdk</activeProfile>
    </activeProfiles>                        

    五.仓库

    Maven仓库在Maven的术语中,仓库是一个位置(place)。Maven仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为
    构件。Maven仓库能帮助我们存储、管理构件的地方。操作模式:开发人员定义简单的配置,描述需要哪些依赖,maven自动从仓库中下载依赖( jar)

    5.1仓库分类

    5.2本地仓库

      1>在安装Maven后并不会创建,第一次执行maven时才创建。
      2>Maven所需要的构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
      3>默认情况下,不管Linux还是Windows,每个用户在自己的用户目录下都有一个路径名为.m2/respository/的本地仓库目录。可以在setttings.xml中修改。

    5.3远程仓库

      5.3.1中央仓库    
        Maven中央仓库是由Maven社区提供的仓库,其中包含了绝大多数流行的开源Java构件。是默认的远程仓库。
        https://mvnrepository.com/可以搜索需要的依赖的相关信息(仓库搜索服务)
        http://repo.maven.apache.org/maven2/     中央仓库地址
      5.3.2远程仓库
        如果Maven在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven提供了远程仓库的概念,它是开发人员自己定制仓库。
        比如aliyun仓库(http://maven.aliyun.com/nexus/content/groups/public/)

    6. idea-maven

      6.1在idea中关联maven

        

      6.2创建Maven项目

        6.2.1选择⻣架

          

      6.2.2指定项目名

          

        6.2.3设置maven

          

         6.2.4项目位置

          

       6.2.5项目结构

        

       6.4.6导入依赖

         maven-web项目中没有携带servlet相关的依赖,所以需要导入。否则,servlet相关的组件不能使用,jsp也不能使用

         

    <dependency>
        <!-- jstl 支持 -->
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
        </dependency><dependency>
        <!-- servlet编译环境 -->
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
        </dependency><dependency>
        <!-- jsp编译环境-->
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>

    7.Aliyun仓库(必需)

      中央仓库在国外,下载速度很慢,国内的aliyun仓库是一款很优秀的maven仓库。强烈建议使用

      

    <mirrors>
        <mirror>
            <id>aliyun</id>
            <!-- 中心仓库的 mirror(镜像) -->
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <!-- aliyun仓库地址以后所有要指向中心仓库的请求,都由aliyun仓库接替->
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    8.maven特性

      8.1传递性

        所谓传递性,是指,在项目中导入了依赖A,而A内部依赖了B,则A会自动触发B也被导入项目

          好处:没必要导入所有依赖在项目中,传递性会自动导入一些依赖。简化依赖导入管理

          坏处:jar冲
        8.1.1 jar冲突
    <!-- 冲突示例 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.3</version>
    </dependency>

    jar冲突:A依赖B B依赖C和d-1.0 c依赖d-2.0。则此时导入A依赖,那么项目中会采用d-1.0还是d-2.0?
    maven默认的选择原则是“最短路径“”最短路径”:d-1.0的路径A->B->d-1.0d-2.0的路径A->B->C->d-2.0则最终选择的是d-1.0 (如果路径等⻓,则先声明的优先)
      解决方案:
      
        1>排除原则:
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.6.RELEASE</version>
        <exclusions>
            <!-- 排除一个依赖,则此依赖不会被spring-context-suport传递导入-->
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
            </exclusion>
        </exclusions>
    </dependency>    
        2>明确定义:直接定义<dependency><dependency>,则根据最短路径,设置明确版本
        3>在父项目中定义,则子项目中在传递依赖时会以父项目中的声明为准。
     
         8.1.2传递依赖范围

         前置概念:项目A中依赖B库,B库依赖C库;则A对B是第一直接依赖,B对C是第二直接依赖,A对C是传递性依赖

        如果第一直接依赖范围是:compile,第二直接依赖范围:compile,则传递性依赖范围就是:compile则,传递性依赖的范围取决于第一和第二直接依赖

     8.2继承     

        多个maven项目间难免有重复的pom配置,重复的配置没必要重复写,maven提供了pom的父子集成机制,类似java的父子类。将共用的pom配置定义在父pom中,子pom继承后就等价持有了父pom
      中的内容。实现pom复用。项目中的诸多依赖,需要统一管理版本,不建议每个开发者随意指定版本。可以在父项目中声明版本信息,子项目延用即可
      8.2.1定义父项目

      创建浮父项目

        定义空白的maven项目(不用写任何代码,只用他的pom文件)

        

         注意:子项目中如果明确定义了版本,则父项目中的声明会失效。所以父项目中声明的版本,子项目中不允许再定义。

     
      8.2.2子项目继承

        子项目pom中继承父pom

        

    8.3聚合

       一个项目(projectproject),可以分为多个模块(module),使得项目更加层次清晰,利于管理。利于模块复用

      模块的划分,常用的方式之一:基于MVC划分模块,进一步树立项目层次,对于大型项目尤为实用。
      每个模块都是一个单独的maven项目,由一个父项目来做聚合。模块之间可以互相依赖。对父项目做编译,清理,打包等行为会传播给所有模块
      8.3.1创建父模块

        可以基于“quick-start”⻣架建立项目,或建立一个空白项目均可。模块必须是pom打包!!,其他没特殊要求。

      

      8.3.2创建子模块

        父模块作为:Project,再建项目作为:Module

        注意:dao和service模块打包格式为jar,web模块打包格式为war

      1.在父模块上"右键",为其新建Module

        

      2. Module的创建,选择⻣架时,按需选择即可;如下填写Module的项目名即可

         

       3.创建完毕后,如下

        

      4.重复如上过程,再多创建几个Module

        

      5.父项目的pom,已经发生了改变,<moludels><moludels>标签即在做多模块聚合

        

      8.3.3父项目中定义版本管理
    <!-- 共用的依赖定义-->
    <dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
        ....
    </dependencies>
    <!-- 依赖版本统一管理 -->
    <dependencyManagement>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
        ....
    </dependencyManagement>
           
    统一管理:如上可以避免在每个子模块中都声明版本号,这样想升级或者切换到另一个版本时,只需要在父模块里更新,不需要任何一个子模块的修改;
    自定义:如果某个子模块需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子模块就会使用子模块声明的版本号,不继承于父模块版本号。
        在做依赖管理时,也有时会在父项目中不做依赖管理,而是明确导入所有依赖,子模块直接继承后就拥有哪些依赖。service模块只需要单独导入dao,web模块只需要单独导入service。
      8.3.4相关指令

      

    # 测试,对父模块做打包操作
    mvn package
    # 测试,对父模块做清理并编译
    mvn clean compile
    # 测试,对父模块做清理并打包
    mvn clean package
    # 
    # 注意:对父模块做的操作都会同步到每个模块上。

    9.私服

      官网:https://blog.sonatype.com/
      下载nexus-2.x-bundle.zip,解压即可
      解压后在bin目录中执行:nexus install在系统中安装nexus服务
                  nexus uninstall卸载
                  nexus start启动服务
                  nexus stop停止服务

      访问私服:http://localhost:8081/nexus/

      登录私服:admin/admin123

      

      9.2 Nexus登录

        

      9.3仓库列表

      group:包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件

      hosted:私服服务器本地的仓库,其中存储诸多构件。
      3rd:存放中央仓库没有的,如ojdbc.jar,可以上传到私服的该库中。
      Releases:存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库。
      Snapshots:对应不稳定的发布版本
      proxy:代理仓库,其会关联一个远程仓库,比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载。

      

      9.4导入第三方jar到私服

        有些jar在中心库中是没有的,比如oracle的数据库驱动jar:ojdb6.jar.可以自己下载jar,然后上传到私服中。此种构件,我们建议放在"3rd party"仓库中(存放第三方构件

         

         

      9.5 maven配置私服

        在maven中配置私服,使得maven可以从私服上获取构件

        9.5.1仓库组

        而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢?

          私服中有一个仓库组,组中包含多个仓库,可以指定仓库组的url,即可从多个仓库中获取构件

        

        9.5.2 maven关联私服

          配置settings.xml,设置私服地址、认证等信息

          配置私服username/password

            

          配置私服为maven的远程仓库,注意:【此处的repository的id要和上图中server的id保持一致,才可以在私服认证通过

            

          使profile配置生效

            

        至此,maven项目中需要依赖时,maven会从私服中下载

      9.6 maven项目部署到私服

        在项目的pom中配置部署仓库位置:

        执行:mvn deploy即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar

            

         注意:如上的repository的id依然是要和settings.xml中配置的server中的id对应才能通过私服的认证

    10. mave常用指令

    mvn compile     编译
    mvn clean    清除上次编译的内容
    mvn clean compile   清除并编译
    mvn package   打包

    11. Resources

      Resources插件,负责将配置文件复制到编译目录中。两种配置文件,main-resources、test-resources
      Maven默认只关注resources目录下的配置文件,其他目录下的配置文件会被忽略。

      11.1增加资源目录

        如果有配置文件不在resources目录下,则需要额外配置:

    <build>
        <resources>
        <!-- src/main/java目录也是一个资源目录,其中的配置文件也会被复制到编译目录->
            <resource>
                <directory>src/main/java</directory>
            </resource>
        </resources>
    </build>                    

      11.2排除或包含

        如果有资源目录中有需要排除的配置文件,可以如下设置:

    <resource>
        <directory>src/main/java</directory>
        <!--**代表src/main/java下的子目录或子目录的子目录..*.txt 代表所有txt文件。
            所有文 件可以用:*.* 或 *【排除所有txt文件,其他文件都会被复制】-->
        <excludes>
            <exclude>**/*.txt</exclude>
        </excludes>
    </resource>    

    如果有资源目录中有需要包含的配置文件,可以如下设置:

    <resource> <directory>src/main/java</directory> <!--**代表src/main/java下的子目录或子目录的子目录..*.txt 代表所有txt文件。 所有文件可以用:*.* 或 *【复制所有txt文件,其他文件都会被忽略】--> <includes> <include>**/*.txt</include> </includes> </resource>
  • 相关阅读:
    汇编入门学习笔记 (十二)—— int指令、port
    c#List泛型数据扩展,把List&lt;&gt;型数据格式化成List&lt;SelectListItem&gt;,用来作dropdownlist的数据
    使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
    Centos6.5 VNC 配置
    HP服务器更换主板前后的注意事项
    【转】BCSphere入门教程01:Immediate Alert--不错
    【转】命令行使用7zip
    【转】 Android BCM4330 蓝牙BT驱动调试记录
    【转】android-support-v7-appcompat.jar 的安装及相关问题解决 --- 汇总整理
    【转】如何在eclipse里关联查看android源码
  • 原文地址:https://www.cnblogs.com/xp0813/p/12311970.html
Copyright © 2020-2023  润新知