Maven学习--001--坐标、依赖、多环境切换

Maven坐标

  • 一个完整的坐标信息,由 groupId、artifactId、version、packaging、classifier 组成,如下是一个简单的坐标定义。
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.2.3</version>
    <packaging>jar</packaging>
    
    • groupid:定义当前 Maven 项目从属的实际项目
    • artifactId:定义实际项目中的一个 Maven 项目(实际项目中的一个模块),比如,org.springframework 是实际项目名称,而现在用的是其中的核心模块,它的 artifactId 为 spring-core。
    • version:版本信息
    • packaging:打包方式,上面的打包方式为jar包

Maven依赖

  • maven依赖,pom.xml表示为,根据坐标从仓库中找到对应的包,然后引入到maven项目中来。
  • 配置代码
    <project>
        ...
        <dependencies>
            <dependency>
                <!--基本坐标,用来从仓库中找到包-->
                <groupId>...</groupId>
                <artifactId>
                    ...
                </artifactId>
                <version>...</version>
                
                <!--依赖的属性配置-->
                <type>...</type>
                <scope>...</scope>
                <optional>...</optional>
                <exclusions>
                    <exclusion>...</exclusion>
                </exclusions>
            </dependency>
            ...
        </dependencies>
        ...
    </project>
    
依赖的范围scope
  • maven与JVM编译一样
    • 在编译项目主代码的时候,使用一套classpath来对代码进行编译
    • 在测试代码编译和执行时,使用另外一套classpath来对diam进行编译
    • 在运行代码的时候,又有一套独立的classpath
  • 依赖的范围目的:在于确定引入的依赖到底是执行在哪个范围,哪个阶段可以进行使用
  • 类型
    • complie
      • 编译依赖范围。如果在配置的时候没有指定,就默认使用这个范围。使用该范围的依赖,对编译、测试、运行三种 classpath 都有效
    • test
      • 测试依赖范围。使用该范围的依赖只对测试 classpath 有效,在编译主代码或运行项目的时候,这种依赖是无效的。
    • provided
      • 已提供依赖范围。使用此范围的依赖,只在编译和测试 classpath 的时候有效,运行项目的时候是无效的。比如 Web 应用中的 servlet-api,编译和测试的时候就需要该依赖,运行的时候,因为容器中自带了 servlet-api,就没必要使用了。如果使用了,反而有可能出现版本不一致的冲突。
    • runtime
      • 运行时依赖范围。使用该范围的依赖,只对测试和运行的 classpath 有效,但在编译主代码时是无效的。比如 JDBC 驱动实现类,就需要在运行测试和运行主代码时候使用,编译的时候,只需 JDBC 接口就行。
    • system
      • 系统依赖范围。该范围与 classpath 的关系,同 provided 一样。但是,使用 system 访问时,必须通过 systemPath 元素指定依赖文件的路径。因为该依赖不是通过 Maven 仓库解析的,建议谨慎使用。
    • import
      • 导入依赖范围。该依赖范围不会对三种 classpath 产生实际的影响。它的作用是将其他模块定义好的 dependencyManagement 导入当前 Maven 项目 pom 的 dependencyManagement 中。比如有个 SpringPOM Maven 工程,它的 pom 中的 dependencyManagement 配置如下:
      <project>
          ...
          <groupId>cn.com.mvn.pom</groupId>
          <artifactId>SpringPOM</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <packaging>pom</packaging>
          ...
          <dependencyManagement>
              <dependencies>
                  <!-- spring -->
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-core</artifactId>
                      <version>${project.build.spring.version}</version>
                  </dependency>
      
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-aop</artifactId>
                      <version>${project.build.spring.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-beans</artifactId>
                      <version>${project.build.spring.version}</version>
                  </dependency>
              </dependencies>
          </dependencyManagement>
          ...
      </project>
      
      • 接下来创建一个新的 Maven 工程 Second,要将 First 工程中 pom 中定义的 dependency-Management 原样合并过来,除了复制、继承之外,还可以编写如下代码,将它们导入进去。
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>cn.com.mvn.pom</groupId>
                  <artifactId>SpringPOM</artifactId>
                  <version>0.0.1-SNAPSHOT</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
      

Profile的配置

  • 目的:为了实现不同环境构建的不同需求(最近项目中使用的方式),profile能够在构建时修改pom的一个子集,或者添加额外的配置元素。
  • 代码:配置了连个profile,那么如何激活呢,或者是使用呢???
    <profiles>
        <profile>
            <id>dev_evn</id>
            <properties>
                <db.driver>com.mysql.jdbc.Driver</db.driver>
                <db.url>jdbc:mysql://localhost:3306/test</db.url>
                <db.username>root</db.username>
                <db.password>root</db.password>
            </properties>
        </profile>
        <profile>
            <id>test_evn</id>
            <properties>
                <db.driver>com.mysql.jdbc.Driver</db.driver>
                <db.url>jdbc:mysql://localhost:3306/test_db</db.url>
                <db.username>root</db.username>
                <db.password>root</db.password>
            </properties>
        </profile>
    </profiles>
    
  • 激活方法
    • 命令行激活:在 mvn 命令行中添加参数“-P”,指定要激活的 profile 的 id。如果一次要激活多个 profile,可以用逗号分开一起激活。例如:
      mvn clean install -Pdev_env,test_evn
      
    • Settings文件显示激活:希望某个 profile 默认一直处于激活状态,可以在 settings.xml 中配置 activeProfiles 元素,指定某个 profile 为默认激活状态,样例配置代码如下:
      <settings>
          ...
          <activeProfiles>
              <activeProfile>dev_evn</activeProfile>
          </activeProfiles>
          ...
      </settings>
      
    • 系统属性激活
      //表示当存在profileProperty属性时激活
      <profiles>
          <profile>
              ...
              <activation>
                  <property>
                      <name>profileProperty</name>
                  </property>
              </activation>
          </profile>
      </profiles>
      
      • 甚至还可以进一步配置某个属性的值是什么时候激活,例如
      <profiles>
          <profile>
              ...
              <activation>
                  <property>
                      <name>profileProperty</name>
                      <value>dev</value>
                  </property>
              </activation>
          </profile>
      </profiles>
      
      • 在 mvn 中用“-D”参数来指定激活,例如:表示激活属性名称为profileProperty,值为dev的profile,实质上,此处也是一种命令激活profile的方法,只是用的是-D参数指定激活的属性和值,而前面使用的是-P参数指定激活的profile的id而已
      mvn clean install -DprofileProperty=dev
      
    • 文件存在与否激活:通过配置判断某个文件存在与否来决定是否激活 profile
      <profiles>
          <profile>
              <activation>
                  <file>
                      <missing>t1.properties</missing>
                      <exists>t2.properties</exists>
                  </file>
              </activation>
          </profile>
      </profiles>
      
    • 默认激活:如果 pom 中有任何一个 profile 通过其他方式被激活的话,所有配置成默认激活的 profile 都会自动失效。
      <profiles>
          <profile>
              <activation>
                  <activeByDefault>true</activeByDefault>
              </activation>
          </profile>
      </profiles>
      
      • 可以使用如下命令查看当前激活的 profile。
      mvn help:active-profiles
      
      或者
      mvn help:all-profiles
      
问题点
  • 当存在多个默认的激活profile时,是什么情况
    • 案例:通过不同的profile激活,查看依赖包的引用情况,没有激活的任何配置,所以应该是使用所有的默认激活profile
      在这里插入图片描述
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值