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 Files\maven\myrepository</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>

猜你喜欢

转载自www.cnblogs.com/xp0813/p/12311970.html