& maven总结

maven

常用命令

常见属性标签

Scope

scope定义了类包在项目的使用阶段。项目阶段包括:编译,运行,测试和发布
scope属性说明

  • compile
    • 默认scope为compile,表示当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包时, 会打到包里面
  • test
    • 该依赖仅仅参与测试相关的内容,包括测试用例的编译和运行,比如定性的Junit
  • runtime
    • 依赖仅参与运行周期中的使用。一般这种类库都是接口与实现相分离的类库,比如JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才需要具体的mysql、oracle等等数据的驱动程序。此类的驱动都是为runtime的类库。
  • provided
    • 该依赖在打包过程中,不需要打进去,这个由运行的环境来提供,比如tomcat或者基础类库等等,事实上,该依赖可以参与编译、测试和运行等周期,与compile等同。区别在于打包阶段进行了exclude操作。
  • system
    • 使用上与provided相同,不同之处在于该依赖不从maven仓库中提取,而是从本地文件系统中提取,其会参照systemPath的属性进行提取依赖。
  • import
    • 这个是maven2.0.9版本后出的属性,import只能在dependencyManagement的中使用,能解决maven单继承问题,import依赖关系实际上并不参与限制依赖关系的传递性。

SystemPath

当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径,例如:

<dependency>
            <groupId>com.taobao</groupId>
            <artifactId>api</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/../rookie-system/src/main/resources/lib/taobao-sdk-java.jar</systemPath>
        </dependency>

打jar包时,includeSystemScope 该标签项可以将外部引用包打包:

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--该配置项的作用是:打包外部jar (scope为system)-->
                <!--
                    <dependency>
                        <groupId>com.taobao</groupId>
                        <artifactId>api</artifactId>
                        <version>1.0</version>
                        <scope>system</scope>
                        <systemPath>${project.basedir}/../rookie-system/src/main/resources/lib/taobao-sdk-java.jar</systemPath>
                    </dependency>
                -->
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>

optional + Exclusions

optional 可选依赖

Exclusions 排除jar包

Optional和Exclusions都是用来排除jar包依赖使用的,两者在使用上却是相反。
Optional定义后,该依赖只能在本项目中传递,不会传递到引用该项目的父项目中,父项目需要主动引用该依赖才行。
Exclusions则是主动排除子项目传递过来的依赖。

用法区别
应用场景:projectA 依赖projectB, projectB 依赖projectC时

B pom.xml

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectC</groupId>
      <artifactId>Project-C</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

如上A依赖B,B依赖C用的true,这时C只能在B中使用,而不会主动传递到A中,A需要主动引用C才有B的依赖。

如果B不用true引用C,则会传递到A中,
**A如果不需要C则需要主动排除B传递过来的C。

<dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <groupId>sample.ProjectC</groupId>
          <artifactId>Project-C</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
</dependencies>
原文地址:https://www.cnblogs.com/doagain/p/14969007.html