/’mevn’/

简介

技术点

  • 生成可执行的jar文件 maven-shade-plugin
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <!-- 执行package的phase -->
                    <phase>package</phase>
                    <!-- 为这个phase绑定goal -->
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <!-- 过滤掉以下文件,不打包 :解决包重复引用导致的打包错误-->
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <!-- 打成可执行的jar包 的主方法入口-->
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.yang.MainTest</mainClass>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <defaultGoal>compile</defaultGoal>
</build>
  • 使用Archetype生成项目骨架

mvn archetype: generate 命令

  • 传递性依赖
  compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一章节依赖的范围一致; 当第二直接依赖的范围是test的时候,依赖不会得以传递 当第二直接依赖的范围是provided的时候,只传递第一直接依赖的范围也为provided的依赖,且传递性依赖的范围同样为provided; 当第二直接依赖的范围是runtime的时候,传递依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性一依赖的范围为runtime

  • 依赖调解

第一原则:路径最近者优先 第二原则:第一声明者优先,在依赖路径长度相等的前提下,在pom中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜

  • 可选依赖不会传递 optional

为什么要使用可选依赖这一特性呢?可能项目B实现了两个特性,其中一个特性依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用两个特性。比如B是持久层隔离工具包,它支持多种数据库,包括MYSQL、PostgreSQL等,在构建这个工具包的时候,需要这两种数据库的驱动程序,但在使用这个工具包的时候,只会依赖一种数据库

  • 依赖排除
<exclusions>
    <exclusion>
        <groupId></groupId>
        <artifactId><artifactId>
    </exclusion>
</exclusions>
  • 归类依赖

依赖的一类版本号可以用常量来定义

<properties>
    <springframework.version>2.5.6</springframework.version>
</properties>
  • 优化依赖
  1. Maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在,在这些工作之后,最后得到的那些依赖被称为已解析依赖(Resolved Dependency)。可以运行如下的命令查看当前项目的已解析依赖:mvn dependency:list

  2. 进一步了解已解析依赖的信息: mvn dependency:tree

  3. mvn dependency:analyze 可以帮助分析当前项目的依赖 Used undeclared dependencies 项目中使用到的,但是没有显式声明的依赖 Unused declared dependencies 项目中未使用的,但是显式声明的依赖 注意:dependency:analyze 只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了