maven的几个重要配置文件pom.xml、settings.xml;Maven打包生成包含所有依赖的jar包

   一个java项目通过maven自动下载依赖时,会涉级读取三个配置文件,分别是项目下的pom.xml 文件 、用户家目录下的.m2/settings.xml 与 maven 全局配置settings.xml  ,后面两者不难理解,就像linux下的用户一样,有一个/etc/profile ,用户用目录下还有一个.bash_profile 文件是一样的,用户自定义配置会覆盖全局配置。所以三者的级先是 pom.xml  > /home_dir/.m2/settings.xml > /maven_dir/conf/settings.xml

Maven依赖配置

一个dependency的声明可以包含以下元素:

<dependencies>
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>0.8.2.2</version>
        <scope>compile</scope>
        <optional>false</optional>
        <exclusions>
            <exclusion>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
  • groupId+artifactId+version构成了依赖的基本坐标,Maven根据坐标才能找到依赖。
  • scope定义了依赖的范围,默认是compile。
  • optional定义了是否为可选依赖,默认是false。
  • exclusion用来排除传递性依赖

Maven依赖范围

Maven有以下几种依赖范围:

  • compile:编译依赖范围,使用此依赖范围对于编译、测试、运行三种classpath都有效,即在编译、测试和运行时都要使用该依赖jar包;
  • test:测试依赖范围,只对测试有效,表明只在测试的时候需要,在编译和运行时将无法使用该类依赖,如 junit;
  • provided:已提供依赖范围。编译和测试有效,运行无效。如servlet-api,在项目运行时,tomcat等容器已经提供,无需Maven重复引入;
  • runtime:运行时依赖范围。测试和运行有效,编译无效。如 jdbc 驱动实现,编译时只需接口,测试或运行时才需要具体的 jdbc 驱动实现;
  • system:系统依赖范围,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用。

 maven的几个重要配置文件pom.xml、settings.xml;Maven打包生成包含所有依赖的jar包

  maven打包生成的普通jar包,只包含该工程下源码编译结果,不包含依赖内容。同时,maven提供以下方式生成包含所有依赖的jar文件,依赖以class的方式存在; 
将此plugin添加到pom文件中

             <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!--这部分可有可无,加上的话则直接生成可运行jar包-->
                    <!--<archive>-->
                        <!--<manifest>-->
                            <!--<mainClass>${exec.mainClass}</mainClass>-->
                        <!--</manifest>-->
                    <!--</archive>-->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>

  如果出现CLASS重名的情况,这时候就要把最新的版本号添加进去即可,

  在当前项目下执行mvn assembly:assembly, 执行成功后会在target文件夹下多出一个以-jar-with-dependencies结尾的JAR包. 这个JAR包就包含了项目所依赖的所有JAR的CLASS.

  如果不希望依赖的JAR包变成CLASS的话,可以修改ASSEMBLY插件.

    • 找到assembly在本地的地址,一般是 
      c:/users/${your_login_name}/.m2/orgapachemavenpluginsmaven-assembly-plugin2.4
    • 用WINZIP或解压工具打开此目录下的maven-assembly-plugin-2.4.jar, 找到assembliesjar-with-dependencies.xml
    • 把里面的UNPACK改成FALSE即可

refer to:

1、https://www.cnblogs.com/xrq730/p/5530069.html

2、http://www.361way.com/maven-pom-settings/4863.html

3、http://blog.csdn.net/peerless_hero/article/details/57428763

4、https://www.jianshu.com/p/a27dc9832a7c

5、https://mushanshitiancai.github.io/2016/07/29/java/maven/%E8%AF%B4%E8%AF%B4maven%E4%BE%9D%E8%B5%96%E5%86%B2%E7%AA%81-%E4%BE%9D%E8%B5%96%E8%B0%83%E8%A7%A3-%E4%BE%9D%E8%B5%96%E4%BC%A0%E9%80%92%E5%92%8C%E4%BE%9D%E8%B5%96%E8%8C%83%E5%9B%B4/

6、http://www.cnblogs.com/davenkin/p/advanced-maven-resolve-dependencies-conflicts.html