zoukankan      html  css  js  c++  java
  • Maven笔记

    Maven笔记

      maven,项目对象模型(POM project object model),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。

    坐标(gav)

      groupId:定义当前Maven项目隶属的实际项目。
      artifactId:该元素定义实际项目中的一个Maven项目(模块)。
      version:该元素定义Maven项目当前所处的版本。

    Maven中scope参数详解

      scope,配置该依赖的依赖范围。
      Maven坚持惯例优于配置,所以Maven配置中的socpe的默认值是compile。在实际应用过程中经常分不清楚使用哪一个,所以直接就默认了。现在梳理一下Maven的scope:scope分为compile,test,runntime,provided,system五种。

    1. compile
        默认的就是compile,compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
    2. test
        test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
    3. runtime
        runtime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。
    4. provided
        provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
    5. system
        从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
    ![avatar][依赖范围.png]

    scope的依赖传递

      A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?
      答案是: 当C是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C,C的scope继承于B的scope。

    ![avatar][依赖传递.jpg]

    依赖调解

      依赖调解的第一原则是:路径最近者优先。因此X(2.0)会被解析。 如果路径相同,第二原则是:第一声明者优先。在POM中依赖声明的顺序决定了谁会被解析使用,顺序靠前的那个依赖优胜。

    聚合和继承:

    • 聚合:一次性构建多个项目,一般通过建立一个额外的空的工程或者一个额外的pom文件 来实现

    • 继承:继承会产生依赖

      • 依赖传递,第一直接依赖,第二直接依赖
      • 依赖调解,路径最近者优先,第一声明者优先
      • 排除依赖
      • 归类依赖,通过设置 <properties></properties> 属性,以变量的方式来控制相关依赖的版本

    约定由于配置

    生命周期

    • clean
      清理 clean 清理上一次构建生成的文件
    • default
      主要包括:
      • process-source:处理项目主资源文件,一般是对资源文件进行变量替换后,复制到项目输出的主classpath目录中
      • compile:编译项目的主源码
      • test-source:处理项目测试资源文件
      • test-compile:编译项目的测试代码
      • test:使用单元测试框架运行测试,测试代码不会被打包或部署
      • package:接受编译好的代码,打包成可发布的格式,如 jar
      • install:将包安装到maven本地仓库,供本地其他maven项目使用
      • deploy:将最终的包复制到远程仓库,供其他开发人员和maven项目使用
    • site
      • site:生产项目站点文档
      • site-deploy:将生成的项目站点发布到服务器上

    maven中的插件仓库

      maven中,区别对待依赖的远程仓库与插件仓库,所以当Maven错需要的插件在本地仓库不存在时,就需要配置一个远程的插件仓库。
    示例:
      Maven内置的插件仓库配置:

    <pluginRepositories>
        <pluginRepository>
        	<id>center</id>
        	<name>Maven Plugin Repository</name>
        	<url>http://repo1.maven.org/maven2</url>
        	<layout>default</layout>
        	<snapshots>
        		<enabled>false</enabled>
        	</snapshots>
        	<releases>
        		<updatePolicy>never</updatePolicy>
        	</releases>				
        </pluginRepository>
    </pluginRepositories>
    

      阿里云的插件仓库:

    <pluginRepositories>
    	<pluginRepository>
    		<id>public</id>
    		<name>aliyun nexus</name>
    		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    		<releases>
    			<enabled>true</enabled>
    		</releases>
    		<snapshots>
    			<enabled>false</enabled>
    		</snapshots>
    	</pluginRepository>
    </pluginRepositories>
    

      示例中,关闭了对 SNAPSHOT 的支持,以防止引入 SNAPSHOT 版本的插件二导致不稳定的构建。一般来说,中央仓库所包含的插件完全能够满足我们的需要,因此也不需要配置其他的插件仓库

    pom中的build标签

    pluginManagement的配置

      dependencyManagement元素帮助管理依赖,而pluginManagement元素来帮助管理插件,一般在父 pom 中配置。
      在 build 标签下增加如下配置(第一个encoding是否有必要添加?)

    <pluginManagement>
    	<plugins>
    		<plugin>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-compiler-plugin</artifactId>
    			<configuration>
    				<source>${java-version}</source>
    				<target>${java-version}</target>
    				<encoding>UTF-8</encoding>
    			</configuration>
    		</plugin>
    		<plugin>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-resources-plugin</artifactId>
    			<configuration>
    				<encoding>UTF-8</encoding>
    			</configuration>
    		</plugin>
    	</plugins>
    </pluginManagement> 
    

    跳过测试配置

    (版本号是否有必要写?)

    <plugin>
    	<groupId>org.apache.maven.plugins</groupId>
    	<artifactId>maven-surefire-plugin</artifactId>
    	<version>2.5</version>
    	<configuration>
    		<skipTests>true</skipTests>
    	</configuration>
    </plugin>
    

    资源文件的打包

      将非默认路径下的资源文件打包到项目中

    <resources>			    
        <resource>    
            <!-- 设定主资源目录  -->    
            <directory>src/main/java</directory>    
    	<includes>
    	    <include>**/*.xml</include>
            </includes>  
            <!-- 排除如下配置中包含的资源类型文件 -->      
            <excludes>  
                <exclude>**/*.yaml</exclude>  
            </excludes>  
            <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->      
            <!--<targetPath>${build.outputDirectory}</targetPath> -->  
            <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->    
            <filtering>true</filtering>  
        </resource>  			
    </resources>
    

    使用nexus搭建私服

      nexus [ˈnɛksəs] 联结,关系  (耐克 sao s)
      私服的作用:jar包可以从私服上面下载,私服上面没有,在通过私服去连接远程仓库下载,可以在私服上面发布自己的私有的jar包

    Hudson进行持续构建

    m2eclipse

    编写maven插件

    Archetype

  • 相关阅读:
    SpringMVC+bootstrap-fileinput文件上传插件使用入门
    [Java]实现Comparable接口不严谨导致Comparison method violates its general contract!
    2021寒假ACM集训队第一次训练-搜索(一)
    第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛-热身赛
    2021蓝桥杯第三次训练赛
    2021年蓝桥杯第二次训练赛
    2021年蓝桥杯第一次训练赛
    HDU 1312 Red and Black
    HDU 1010 Tempter of the Bone
    HDU 3500 Fling
  • 原文地址:https://www.cnblogs.com/lbd_smile/p/9565666.html
Copyright © 2011-2022 走看看