maven实践–你所急需驾驭的maven

Archrtype

原型(Archetype)是二个Maven工程模板工具包。

maven-archetype-quickstart用得相比多。

创设生命周期是由阶段组成的

八个营造生命周期都以由一多如牛毛不一样的营造阶段组成,每三个构建阶段代表了生命周期的二个等级。

以default生命周期为例,它是由以下的级差组成

  • validate – 验证该品种是还是不是科学,全数供给的消息都以可用的
  • compile – 编写翻译工程源码
  • test –
    使用三个适度的单元测试框架测试编译的源代码。那一个测试的代码不会被打包或布署到项目中
  • package – 将编写翻译的代码打包成它公布的格式,例如JA冠道
  • integration-test –
    假若供给的话,该命令会将工程处理并布署在一个并入测试运营的条件中
  • verify – 运维任何检查以注明该包是不是有效,是还是不是顺应质标
  • install – 将工程打包安装到当地仓库中,以便地面其余项目方可拓展注重
  • deploy –
    在合龙或发表环境中,将最后工程打包复制到远程仓库中,用于与其他开发职员和项目共享

mvn deploy
它不仅执行指定的构建阶段,而且会执行指定构建阶段之前的每一个阶段。因此,执行

依靠排除

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 小技巧:一般在编写翻译时类找不到,可是实际上存在jar争持意况时。在idea中设置Maven
    Helper插件,依照jar名称搜索,定位到实际的依靠,在依靠中消除争持jar包。

命令

  1. mvn clean 清除目标目录中的生成结果
  2. mvn package 根据项目变更 jar 文件,打包此前会开始展览编写翻译,测试
  3. mvn install在本地 Repository 中安装 jar

跳过测试类 : -Dmaven.test.skip=true
下载jar包源码: -DdownloadSource=true
下载javadocs: -DdownloadJavadocs=true

maven assembly

packaging直接影响Maven的构建生命周期。

在Maven 3中,其可用的打包类型如下:

  1. jar,暗中认可类型
  2. war
  3. ejb
  4. ear
  5. rar
  6. par
  7. pom
  8. maven-plugin

只要想3遍打包多少个品种,可采纳聚合类型pom,它平常由多个父模块和多少个子模块组合。

<packaging>pom</packaging>

<modules>
    <module>zy-service-consumer</module>
    <module>zy-eureka-server</module>
    <module>zy-zipkin-service</module>
    <module>zy-hystrix-dashboard</module>
</modules>

创设阶段选用的塑造插件

mvn install


[INFO] ------------------------------------------------------------------------
[INFO] Building zy-zeromq 1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ zy-zeromq ---
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ zy-zeromq ---

(查看完整的生命周期阶段列表,请参考生命周期参考

营造生命周期

Maven中放置了四个塑造生命周期:default,clean和site。default生命周期处理工科程的配备,clean生命周期处理工科程的清理,而site生命周期则承担成立工程的站点文书档案。

依赖

私服

私服的利益:节约外网的带宽,加快Maven的创设,方便安顿第叁方构件,稳定等

图片 1

依傍调解原则

接触Maven
2.0.9开端,POM中凭借评释的相继决定了哪些版本会被使用,也叫作”第贰声称原则”。

参考文献


tips:本文属于本人上学和实践进度的记录,很多图和文字都粘贴自网上作品,没有注脚引用请见谅!如有任何难题请留言或邮件布告,小编会立马还原。

借助范围

  • compile 暗中认可的scope,表示 dependency
    都得以在生命周期中接纳。而且,这个dependencies
    会传递到依靠的品类中。适用于具有阶段,会趁机项目协办发布
  • provided 跟compile相似,不过表明了dependency
    由JDK可能容器提供,例如Servlet AP和一些Java EE APIs。这几个scope
    只好功效在编写翻译和测试时,同时没有传递性。

    <dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
    </dependency>
    
  • runtime
    代表dependency不功效在编写翻译时,但会成效在运作和测试时,如JDBC驱动,适用运转和测试阶段。

  • system 跟provided
    相似,可是在系统中要以外部JACR-V包的款型提供,maven不会在repository查找它。
  • import(Maven2.0.9及以上)
    import范围只适用于pom文件中的
  • test
    范围注明使用此注重范围的依赖,只在编写翻译测试代码和周转测试的时候须要,应用的正规运作不必要此类依赖。

是什么?

Maven是一个强硬的Java项目营造筑工程具。

何以是塑造筑工程具?

营造工具是将软件项目营造相关的进度自动化的工具。创设二个软件项目一般包涵以下三个或多少个进度:

  1. 变迁源码(假使项目利用自动生王彤码);
  2. 从源码生成项目文档;
  3. 编写翻译源码;
  4. 运作单元测试
  5. 将编写翻译后的代码打包成JA昂Cora文件可能ZIP文件;
  6. 将打包好的代码安装到服务器、仓库或然其余的地点;
  7. 讲述项目间的借助关系

有个别项目或许须要越来越多的经过才能成就塑造,那几个进程相似也能够组成到创设筑工程具中,由此它们也落到实处自动化。

自动化营造进度的功利是将手动营造进度中犯错的高风险降到最低。而且,自动营造筑工程具平常要比手动执行同样的创设过程要快。

仓库

库房只分为两类:本地仓库和长距离仓库。

当Maven依照坐标寻找营造的时候,首先会翻动本地仓库,借使当地仓仓库储存在此部件,则平昔运用;倘若当地仓库不存在此部件,也许须要查阅是或不是有立异的预制构件版本,Maven就会到长途仓库查找,发现须要的构件后,将其下载到本地仓库再选拔。假如当地仓库和长距离仓库都不设有须求的部件,则报错。

图片 2

基本概念

简易运转

当你安装好了Maven,并且在档次的根目录下开创了POM文件,能够在类型上运维Maven了。

mvn clean install

该命令首先执行clean构建周期,删除Maven输出目录中已编译的类文件,然后执行install构建阶段。

骨干概念:POM文件(POM project object mode项目对象模型)

POM文件是以XML文件的花样表明项目标能源,如源码、测试代码、依赖(用到的表面Jar包)等。

pom主要组成都部队分:
图片 3

自定义打包maven-assembly-plugin

在运营mapreduce/storm时,一般是以jar包形式运行,每一种jar包中凭借的jar的包,能够采用maven-assembly-plugin。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
                <finalName>${project.artifactId}-${project.version}</finalName>
                <attach>false</attach>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase><!-- 绑定到package生命周期阶段上 -->    
                    <goals>
                        <goal>single</goal><!-- 只运行一次 --> 
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

assembly.xml

<!--是否生成和项目名相同的根目录-->
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>${project.basedir}/target/classes</directory>
        <outputDirectory>.</outputDirectory>
    </fileSet>
    <!--<fileSet>
        <directory>${project.basedir}/src/main/resources</directory>
        <outputDirectory>./</outputDirectory>
    </fileSet>-->
</fileSets>
<dependencySets>
    <dependencySet>
        <!--是否把本项目添加到依赖文件夹下-->
        <useProjectArtifact>false</useProjectArtifact>
        <outputDirectory>/lib</outputDirectory>
        <!--<excludes>
            <exclude>org.apache.storm:storm-core</exclude>
        </excludes>-->
    </dependencySet>
</dependencySets>

别的大规模配置格局

<configuration>
    <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    ...
</configuration>
这种方式打出的包是fat jar,也就是把依赖的jar包全部解压成class文件后,再与自己的代码打成一个jar包。

布局到长途仓库

将本项目jar包上传到私服、远程仓库,供项目组或其余人使用。配置如下:

pom.xml
<distributionManagement>
    <repository>
        <id>thirdparty</id>
        <name>3rd party</name>
        <url>http://192.168.100.103:8081/nexus/content/repositories/thirdparty/</url>
    </repository>
</distributionManagement>

settigns.xml配置认证
<servers>
    <server>
        <id>thirdparty</id>
        <username>repo-user</username>
        <password>repo-psw</password>
    </server>
</servers>


mvn命令:
本地仓库 的更新
mvn  clean package install 
远程 仓库 的更新
mvn clean package deploy

如果编译出问题时,可以执行如下命令
mvn clean install -e -U
-e详细异常,-U强制更新 

为了加快下载,能够安顿部分镜像mirror。

可选依赖

可选的重视工作原理

Project-A -> Project-B
下面的图表示项目A重视于项目B,当A在它的POM文件中把B注明为一个可选的正视,他们的关联依然没有改观。仅仅就如1次正常的构建,在这一次创设中,项目B将会被添加进classpath。

Project-X -> Project-A
唯独当3个别的的门类(项目X)在它的POM文件中宣称项目A为1个借助,这几个可选的依赖就发挥效率了。你将会注意到项目X的classpath不会含有项目B:为了把B包蕴进项目X的classpath,你要求在您的POM文件中一向证明。

例子:

有3个名为X2的档次,这么些项目和hibernate有一些看似的效应,援救广大数据库驱动/信赖,比如说MySQL,postgre,oracle等。为了构建X2,全数的那个正视都以必须的,但是对于你的类型来说却不是必须的,所以对于X2把这个注重评释为可选的是可怜实用的,不论哪一天当你在POM文件中把X2注解为二个平素注重的时候,全部被X2支持的驱动不会活动的被含有进你的档次的classpath,你要求一贯注解你就要利用的数据库的重视性/驱动。

maven vs gradle

  • maven和gradle的可比与行使
    总的看,gradle相比较于maven有很打客车面面俱圆,近期gradle的使用者越来越多。而出于maven在此以前处于主流,并且在少数方面maven较gradle还有局地优点,所以maven和gradle并存。在github上海高校部分美好的开源项目及其时提供maven和gradle三种丰裕正视的措施。

依靠传递性

  1. 子项目能够持续父项目标信赖性
  2. 品种A重视项目B,项目A–>项目B,项目B中的依赖也会被参与到项目A中。

由于重视的传递性,导致品种中设有四个同名的jar包,存在jar包争持等。maven提供的以下机制来消除这么些标题:

maven深切执行

凭借管理

在多模块应用中,可能三个子项目会有协同的信赖。

在顶层的pom中钦点依赖项的本子,以便让全数的子项目使用同样版本。dependency
management只是依靠的八个声称,子项目需显式引用,但绝不钦定版本号。

父项目pom
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>


子项目pom,需显式引用依赖,但不用指定版本号。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

相关文章