Maven使用

原创
2016/12/29 22:59
阅读数 250

一、maven的初步

1、maven的安装

    1.1、配置环境变量

    1.2、测试是否安装、配置成功:

    dos命令下输入命令: mvn -v 

    如果出现如下错误信息:说明安装的maven版本与jdk版本不兼容

2、maven使用

    2.1、创建代码和测试代码

    源代码应该放置到:src/main/java文件夹中

    源代码的资源文件应该放置在:/src/main/resources文件夹中

    测试代码应该放置到:/src/test/java文件夹中

    测试代码的资源文件应该放置在:/src/test/resources文件夹中

    2.2、基本命令的使用

    mvn compile:编译命令,会将代码编译到target文件夹中 (会自动下载编译相关的jar包)

    mvn test:测试方法编译 (会自动下载测试相关的jar包)

    测试报错:

报错原因:没有junit的jar包。

解决办法:在maven的pom.xml配置文件中加入junit  jar包的配置

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"				                            
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 项目的坐标 -->
    <!-- groupId表示项目的名称 -->
	<groupId>org.pm.maven</groupId> 
    <!-- artifactId表示项目的模块名称,建议使用:项目的名称-模块名称来表示 -->
	<artifactId>maven-01</artifactId>
    <!-- version表示这个项目的版本名称 -->
	<version>0.0.1-SNAPSHOT</version>
    
    <!-- 添加jnuit的依赖jar包 -->
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
            <scope>test</scope>
		</dependency>
	</dependencies>

</project>

    mvn clean:清空编译文件夹target中的数据

    mvn clean test:先清空编译文件夹target中的数据,然后进行test测试

    mvn package:将项目打包成jar包

    mvn install:将打包好的jar包安装到本地仓库中

3、maven本地仓库配置

    3.1、修改maven路径下的conf中的的setting.xml文件

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

    <!-- 配置maven本地仓库位置 -->
  <localRepository>D:/Java/maven/repository</localRepository>

    将修改后的setting.xml文件复制一份到本地的仓库目录下(D:/Jvav/maven),原来的不要删除。

4、maven的生成方式

    4.1、maven有固定的生成模式,可以通过如下命令生成:

    mvn archetype:generate:自动完成maven项目骨架的建立

    也可以通过参数创建:

    mvn archetype:generate –DgroupId=org.pm.maven –DartifactId=maven-01
    –Dversion=0.0.1-SNAPSHOT

    4.2、使用eclipse开发maven项目

    默认STS和myeclipse都自带了maven的支持。

    如果是eclipse需要安装m2eclipse插件。

    STS配置maven:

配置maven项目的资源文件夹:

 

    输入相应的运行命令:clean package、test等。

    运行过多个命令以后,可以通过:右键——Run As——Maven Build,就会列出以前使用过的命令。

二、maven的依赖性

1、依赖包的查询

  1.1、所有的依赖都是通过坐标来进行存储的(GAV-->groupId、artifactId、version)。

  1.2、有一些网上的仓库提供了坐标的查询(http://mvnrepository.com)。

  1.3、通过<dependencies>设置依赖。

    <dependencies>
        <dependency>
            <!-- GAV -->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.5.Final</version>
        </dependency>

    maven是如何搜索依赖的?首先会在本地仓库查询,如果本地仓库没有,就去中央仓库查询。

2、依赖的传递性

   2.1、依赖是会被传递:A-->C  B-->A ==> B-->C(这种依赖是基于compile这个范围进行传递)

    <dependencies>
        <dependency>
            <!-- GAV -->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.5.Final</version>
            <!-- 如果没有写scope,默认就是compile范围 -->
        </dependency>

    特别注意:对于依赖的传递而言,主要是针对compile作用域传递。

    传递的冲突问题:

    1、a-->b1.0  c-->b1.1  d-->a和c,这个时候在d的pom中,哪一个依赖先写就使用先写依赖的
        版本。

    如果d--><d>a</d><d>c</d>-->依赖版本是b1.0。

    2、a-->b1.0 c-->b1.1 d-->a和c-->b1.0  f-->d,c,如果路径的长短不一致就选择最小路径,
         f-->b1.1。

    3、如果希望精确的控制依赖包,可以使用依赖的排除功能进行控制

        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>user-log</artifactId>
            <version>${project.version}</version>
            <!-- 可以排除某些依赖,如:jar包冲突的时候。
            <exclusions>
                <exclusion>
                    <groupId></groupId>
                    <artifactId></artifactId>
                </exclusion>
            </exclusions>
            -->
        </dependency>

3、依赖的范围:默认的依赖范围是compile

  3.1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖。

  3.2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去。

  3.3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为
        servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突。

  3.4、runtime在运行的时候依赖,在编译的时候不依赖。

4、聚合和继承

    聚合:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.pm</groupId>
    <artifactId>idea-workspace</artifactId>
    <!-- 注意这里是pom -->
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <!-- 导入了三个模块,把这三个模块聚合到一起了 -->
    <modules>
        <!-- 聚合是模块的位置 -->
        <!-- 特别注意:如果聚合的项目和其它项目在同一级模块中,
            需要使用../xx文件夹名称来设置 -->
        <module>user-core</module>
        <module>user-log</module>
        <module>user-service</module>
    </modules>

    继承(父模块):

   <!-- 对于依赖的继承而言,都需要通过dependencyManagement来完成管理,
        如果不管理子类会全部继承,这种可能会导致一些模块存在不需要的依赖-->
    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>

            <!-- hibernate-core -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.2.5.Final</version>
            </dependency>

    继承(子模块):

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- 继承的绝对路径是pom的文件 -->
    <parent>
        <artifactId>idea-workspace</artifactId>
        <groupId>org.pm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service</artifactId>
    <packaging>jar</packaging>

    <name>user-service</name>
    <url>http://maven.apache.org</url>

5、版本管理:

    总版本号.分支版本号.小版本号-里程碑版本:
    总版本号的变动一般表示框架的变动,
    分支版本号:一般表示增加了一些功能,
    小版本号:在分支版本上面进行bug的修复,
    里程碑:SNAPSHOT-->alpha-->beta-->release(RC)-->GA
    user0.0.1-SNAPSHOT-->user0.0.1-Release--->user1.0.0SHAPSHOT  -->user1.0.0-Release
                           -->user0.1.0-SNAPSHOT-->user0.1.0-Release                   -->user1.1.0-Release

三、仓库

3.1、本地仓库(详见本地仓库配置)

3.2、中心仓库(https://repo.maven.apache.org/maven2)

3.3、私有仓库:局域网内部的仓库

    

  1、nexus的安装

    1.1、下载并且解压缩

    1.2、将bin添加到环境变量

    1.3、修改..\bin\jsw\conf下wrapper.conf文件中的Java路径

# Set the JVM executable
# (modify this to absolute path if you need a Java that is not on the OS path)

#配置Java的jdk路径
wrapper.java.command=D:\Java\JavaSoft\jdk1.8.0_66\bin\java

    1.4、将nexus安装到windows的服务中:nexus install

    1.5、启动服务:nexus start

  2、仓库讲解

    2.1、hosted的仓库,内部项目的发布仓库。

    

    2.2、proxy的仓库,从远程中央仓库中寻找数据的仓库。

    2.3、group仓库,组仓库用来方便开发人员进行设置的仓库。

  3、私有仓库的设置(setting.xml)

    3.1、更新私有仓库的索引(将本地仓库的文件拷贝到私有仓库后会出现索引缺失导致添加依赖的报错)

    或者直接下载索引,将其拷贝到中央仓库的索引存储中。

   3.2、nexus本地仓库设置:

    1、添加本地仓库

    2、提交到工厂仓库命令:mvn:deploy  (处理本地自己编写的jar包)

    将第三方jar包添加到本地工厂:

    

    3、配置maven从本地工厂下载(setting.xml)

	<!-- 配置本地工厂,如果本地nexus服务没有启动,则自动去中央工厂下载 
		 特别注意:如果工厂没有被激活,则以下配置无效 -->
	<profile>
      <id>nexusProfile</id>
		
      <repositories>
        <repository>
			<id>nexus</id>
			<name>Nexus Repository</name>
			<url>http://localhost:8081/nexus/content/groups/public/</url>
			<releases>
				<enabled>true</enabled>
			</releases>
			<!-- snapshots默认是关闭的,需要手动开启 -->
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
      </repositories>

    </profile>
	
	<!-- 设置中央工厂profile,
		 特别注意:中央工厂的snapshots默认是关闭的,可以通过以下配置开启 -->
	<profile>

      <id>centralProfile</id>

		<repositories>
			<repository>
			  <id>central</id>
			  <name>Central Repository</name>
			  <!-- 设置工厂镜像后,此地址无意义,可以随意设置 -->
			  <url>https://*</url>
			  <layout>default</layout>
			  <snapshots>
				<enabled>true</enabled>
			  </snapshots>
			</repository>
		</repositories>

    </profile>

  </profiles>
  
  <!-- 设置要激活的工厂配置 -->
  <activeProfiles>
	<!--激活中央工厂的profile,只有激活之后工厂配置才会生效-->
	<activeProfile>centralProfile</activeProfile>
  </activeProfiles>

    4、配置maven只能通过本地工厂才能下载,如果本地工厂关闭,则不能直接访问中央工厂
            (通过配置镜像地址来实现)

        特别注意:设置镜像地址后,原来profile里面配置的地址url就没有作用了,只会通过镜像地址访问。

	 <!--设置工厂的镜像,只要mirrorOf中的工厂要访问下载,都会自动来找配置的工厂镜像,
		 如果镜像无法访问就不会去中央工厂下载,
		 使用*表示所有的工厂都通过这个镜像进行访问下载,
		 这是推荐的做法-->

	 <mirror>
	  <id>nexusMirror</id>
	  <mirrorOf>*</mirrorOf>
	  <name>My Nexus Mirror.</name>
	  <url>http://localhost:8081/nexus/content/groups/public/</url>
	 </mirror>

  </mirrors>

    5、设置镜像后,中央工厂不能下载Snapshots的jar包,可以通过设置中央工厂profile来下载

	<!-- 设置中央工厂profile,
		 特别注意:中央工厂的snapshots默认是关闭的,可以通过以下配置开启 -->
	<profile>

      <id>centralProfile</id>

		<repositories>
			<repository>
			  <id>central</id>
			  <name>Central Repository</name>
			  <!-- 设置工厂镜像后,此地址无意义,可以随意设置 -->
			  <url>https://*</url>
			  <layout>default</layout>
			  <!-- 打开snapshots -->
			  <snapshots>
				<enabled>true</enabled>
			  </snapshots>
			</repository>
		</repositories>

    </profile>

  </profiles>
  
  <!-- 设置要激活的工厂配置 -->
  <activeProfiles>
	<!--激活中央工厂的profile,只有激活之后工厂配置才会生效-->
	<activeProfile>centralProfile</activeProfile>
  </activeProfiles>

4、项目的发布

    4.1、设定releases工厂和snapshots工厂(pom.xml)

    <!-- 配置将项目发布到本地工厂nexus中,
         特别注意:匿名用户是无法发布项目的,必须设置具有发布项目权限的用户
         进行发布,设置setting.xml配置文件中的server -->
    <distributionManagement>
        <repository>
            <id>user-release</id>
            <name>user release</name>
            <url>http://localhost:8081/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>user-snapshot</id>
            <name>user snapshot</name>
            <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

    4.2、设置发布的权限(setting.xml)

	<!-- 配置发布项目到本地工厂nexus的用户 -->
	<server>
	  <!-- 发布项目的id -->
      <id>user-release</id>
      <username>deployment</username>
      <password>deployment123</password>
    </server>

	<server>
      <id>user-snapshot</id>
      <username>deployment</username>
      <password>deployment123</password>
    </server>

  </servers>

5、创建项目工厂和设置发布权限

    5.1、创建两个工厂:releases和snapshots(hosted,maven2)

    5,2、配置权限(Security--->Privileges)

    5.3、创建角色并且分配权限(Roles---->Configuration)

    5.4、创建用户(Add)

    5.5、创建发布的工厂(pom.xml)

    <!-- 配置将项目发布到本地工厂nexus中,
         特别注意:匿名用户是无法发布项目的,必须设置具有发布项目权限的用户
         进行发布,设置setting.xml配置文件中的server -->
    <distributionManagement>
        <repository>
            <id>user-release</id>
            <name>user release</name>
            <url>http://localhost:8081/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>user-snapshot</id>
            <name>user snapshot</name>
            <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

四、生命周期和插件

4.1、生命周期:三套生命周期

    1、clean:

      pre-clean:  执行一些需要在clean之前完成的工作。
      clean:  移除所有上一次构建生成的文件。
      post-clean : 执行一些需要在clean之后立刻完成的工作。

    2、compile

        validate
        generate-sources
        process-sources
        generate-resources
        process-resources :    复制并处理资源文件,至目标目录,准备打包。
        compile  :   编译项目的源代码。
        process-classes
        generate-test-sources 
        process-test-sources 
        generate-test-resources
        process-test-resources  :   复制并处理资源文件,至目标测试目录。
        test-compile  :   编译测试源代码。
        process-test-classes
        test  :   使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
        prepare-package
        package  :   接受编译好的代码,打包成可发布的格式,如 JAR 。
        pre-integration-test
        integration-test
        post-integration-test
        verify
        install  :   将包安装至本地仓库,以让其它项目依赖。
        deploy  :   将最终的包复制到远程的仓库,以让其它开发人员与项目共享。 

    3、site

        pre-site :    执行一些需要在生成站点文档之前完成的工作。
        site :   生成项目的站点文档。
        post-site :    执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。
        site-deploy  :   将生成的站点文档部署到特定的服务器上。

4.2、插件:插件是maven的核心,所有执行的操作都是基于插件来完成的。
       为了让一个插件中可以实现众多的类似功能,maven为插件设定了目标,一个插件中有可能有多个目标
       其实生命周期中的重要的每个阶段都是由插件的一个具体目标来执行的。

    <!-- maven插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.0.1</version>
                <!-- 将插件绑定到某个生命周期运行 -->
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals><goal>jar</goal><goal>test-jar</goal></goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

五、测试

5.1、测试类

    1、测试基础:所有的基于测试的类都要放到src/test/java资源文件夹中,此文件夹中的文件不会
        被package打包。

    2、测试类的命名:

        并不是所有在src/test/main中的类都会执行测试的,只有:
        **/*Test
        **/Test*
        **/*TestCase
        除了以上三种名称的测试类会执行测试之外,其它都不会执行测试操作。
        但是可以进行特定的配置。

    3、测试的配置:对于Maven的测试而言,使用的是maven-surefire-plugin插件

                <!-- 测试插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.19.1</version>
                    <configuration>
                    <!-- 默认会执行:**/Test*,**/*Test,**/*TestCase,
                         但是当使用include之后就不会再包含默认的测试类型,只会包含include中的测试类型 -->
                        <!--设置包含的测试类-->
                        <!--<includes>
                            <include>**/Hello*</include>
                        </includes>-->
                        <!--设置不进行测试的类-->
                        <!--<excludes>
                            <exclude>Test*</exclude>
                        </excludes>-->
                        <!--跳过所有测试阶段,一般不推荐使用-->
                        <!--<skip>true</skip>-->
                    </configuration>
                </plugin>

    4、在运行时手动指定测试类:

        动态测试:mvn test -Dtest=HelloWorld,mvn test -Dtest=Test*。

        注意,在配置surefire插件时如果指定版本号之后,动态测试会抛出异常。

5.2、跳过测试

    1、动态跳过:mvn xxx -DskipTests 就可以跳过测试。

    2、在配置文件中配置:(skip)

<!-- 测试插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.19.1</version>
                    <configuration>
                        <!--设置包含的测试类-->
                        <!--<includes>
                            <include>**/Hello*</include>
                        </includes>-->
                        <!--设置不进行测试的类-->
                        <!--<excludes>
                            <exclude>Test*</exclude>
                        </excludes>-->
                        <!--跳过所有测试阶段,一般不推荐使用-->
                        <!--<skip>true</skip>-->
                    </configuration>
                </plugin>

    3、跳过测试代码的编译:(skip)

                <!-- 设置编译环境jdk版本插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.6.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <!--跳过所有的测试编译,一般不推荐使用-->
                        <!--<skip>true</skip>-->
                    </configuration>
                </plugin>

5.3、测试报告

    1、基本配置:

                <!--生成测试覆盖率插件-->
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>cobertura-maven-plugin</artifactId>
                    <version>2.7</version>
                    <configuration>
                        <formats>
                            <format>html</format>
                            <format>xml</format>
                        </formats>
                    </configuration>
                    <executions>
                        <execution>
                            <id>cobertura-report</id>
                            <goals><goal>cobertura</goal></goals>
                            <phase>test</phase>
                        </execution>
                    </executions>
                </plugin>

六、web的发布

    6.1、基于jetty插件发布

                <!--jetty插件,可以用来配置web服务器-->
                <plugin>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <version>9.4.0.v20161208</version>
                    <configuration>
                        <!--每个10秒钟进行刷新-->
                        <scanIntervalSeconds>10</scanIntervalSeconds>
                        <webApp>
                            <!--上下文路径-->
                            <contextPath>/hello</contextPath>
                        </webApp>
                        <!--配置访问端口-->
                        <httpConnector>
                            <port>8888</port>
                            <idleTimeout>60000</idleTimeout>
                        </httpConnector>
                    </configuration>
                </plugin>

 

展开阅读全文
打赏
2
18 收藏
分享
加载中
更多评论
打赏
0 评论
18 收藏
2
分享
返回顶部
顶部