maven整理

本文详细介绍Maven的基础使用方法,包括构建、测试、部署等核心流程,并深入探讨高级特性如依赖管理、聚合与继承等,帮助开发者高效管理和构建项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mvn test:运行test类

mvn compile:下载相关的包

mvn package:应用进行打包

mvn install:将下载的包放到本地的仓库

mvn archetype:generate     下载和archetype相关的包

mvn archetype:generate -DgroupId=zttc.itat.maven -DartifactId=maven-ch04 -Dversion=0.0.1-SNAPSHOT 创建一个maven工程

mvn clean source:jar 可以用来将源文件也打包成功

mvn help:describe

mvn package –Dtest=Hello.java:只执行一个测试类

mvn package –DskipTests=true :跳过测试,不会执行测试

mvn clean install -DskipTests=true:跳过测试直接安装

mvn cobertura:cobertura  这个用来生成测试报告(手动的形式)或者可以使用plugin的形式配置到pom.xml中


-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。

-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。

mvn dependency:tree -->tree.txt  将依赖树信息输出到tree.txt文件中


工厂:http://mvnrepository.com/


2.、集成eclipse

(1)window->preferences->maven->installations点击Add,增加自己下载安装的maven

(2)window->preferences->maven->User Settings 修改自己的setting文件

(3)在eclipse中建立好一个maven工程之后,要增加source folder:src/main/resources和src/test/resources这两个用来放置我们再开发过程中需要的配置文件


3、dbunit可以用来测试数据库,而不影响原有的数据库数据


4、maven隐藏变量

Maven提供了三个隐式的变量可以用来访问环境变量,POM信息,和Maven Settings

env

env变量,暴露了你操作系统或者shell的环境变量。便 如在Maven POM中一个对${env.PATH}的引用将会被${PATH}环境变量替换,在Windows中为%PATH%.

projetc

project变量暴露了POM。可以使用点标记(.)的路径来引用POM元素的值。例如

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<finalName>${project.groupId}-${project.artifactId}</finalName>
</build>
</project>

当你使用mvn help:effective-pom 查看时,你会看到<finalName>org.sonatype.mavenbook-project-a</finalName>

  • ${basedir} 项目根目录
  • ${project.build.directory} 构建目录,缺省为target
  • ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
  • ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
  • ${project.packaging} 打包类型,缺省为jar
  • ${project.xxx} 当前pom文件的任意节点的内容

    settings

    settings变量暴露了Maven settings信息。可以使用点标记(.)的路径来引用settings.xml文件中元素的值。例如${settings.offline}会引用~/.m2/settings.xml文件中offline元素的值。

5、模块开发

加入已经开发好了user-core、user-log的maven工程模块,但是后面写的user-service需要使用上面的两个模块,则需要将user-core和user-log进行install命令,生成到本地的仓库中,这样再service中的pom.xml中进行引用的时候才能够找到。在前面两个模块的pom.xml上右键,run as->maven build->输入clean install就可以生成到本地仓库中,在service中的pom.xml可以通过以下方式引用:

<dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>user-log</artifactId>
      <version>${project.version}</version>
    </dependency>
    
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>user-core</artifactId>
      <version>${project.version}</version>
    </dependency>

6、easymock

假如我已经开发完了service但是别人开发的dao还没有开发完,那么我需要测试与dao的通信是否正常,可以使用easymock

public void testAdd() {
        UserDao userDao = createStrictMock(IUserDao.class);
        UserService userService = new UserService(userDao);
        userDao.add(new User());
        expectLastCall();
        replay(userDao);
        userService.add(new User());//看是否执行
        Verify(userDao);//每一个调用完,调用mock的verify方法来验证userDao
    }


7、依赖特性

<scope>...</scope>中有几个依赖的特性:

(1)compile:在编译、测试、打包都有效,也是默认的情况

(2)provided:在编译和测试时加入依赖,在打包时不加

(3)test:测试范围有效,在编译和打包时不使用这个依赖(重要),只有在src/java/test下的java文件才会使用声明为test的jar包,其它位置的不会使用该jar包,如果其他位置有使用该jar包,那么就得把其它位置的java文件移动到src/java/test下

(4)runtime:编译时候无用,只在测试、运行时有效,如对于mysql-connector的声明


8、依赖传递

当scope的范围是test的话,那么就不会讲依赖传递给其它模块,其它模块不会自动获得该所需jar包。


9、maven的聚合操作:假如一个功能有好多模块,那么现在的情况就是我们需要对每个模块分别进行编译,打包,这样比较麻烦,可以通过在各个模块统一的根目录下统一建一个pom.xml文件,通过这个文件,来对所有的模块集中进行编译。

在eclipse中建一个maven project,选择创建一个简单project


选择pom


生成的工程什么都不用做,只需要在pom.xml中增加对三个模块的聚合声明,到三个模块上面的共有的根目录下,然后run as ->mvn clean compile就可以直接运行所有的,而不用单独一个一个去运行

<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>zttc.itat.user</groupId>

  <artifactId>user-aggregation</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>pom</packaging>

 

  <!--导入三个模块,对这三个模块做聚合操作 -->

  <modules>

  <module>../user-core</module>

  <module>../user-log</module>

  <module>../user-service</module>

  </modules>

</project>

 

10、maven继承(可以将聚合和继承放在一块)

同上,仍然是建立一个简单project,然后也是只修改新建生成的pom.xml,如user-parent工程,在其pom.xml中写的是各个模块重复的内容,让所有的模块都继承这个pom,比如对于子模块user-core中的pom.xml中,可以使用下面来引用共有的声明

<parent>

  <groupId>zttc.itat.user</groupId>

     <artifactId>user-parent</artifactId>

     <version>0.0.1-SNAPSHOT</version>

     <relativePath>../user-parent/pom.xml</relativePath>

  </parent>

同理,其他模块也加入这个一部分声明。

对于dependency,最好不要使用继承,因为那样会使每个模块都引用相同的依赖,但是又的模块并不需要那么多的依赖,这样会导致性能不好,但是可以在user-parent中pom.xml中通过dependencyManagement这个表签来声明所有的依赖,但是在子模块中仍然要写自己需要的jar,但是就不用写scope和version标签了,这两个标签使用的会直接用parent中的。

<dependencyManagement>

  <dependencies>

      <dependency>

      <groupId>mysql</groupId>

      <artifactId>mysql-connector-java</artifactId>

      <version>5.1.24</version>

    </dependency>

   

    <dependency>

      <groupId>log4j</groupId>

      <artifactId>log4j</artifactId>

      <version>1.2.17</version>

    </dependency>

   

    <dependency>

      <groupId>org.dbunit</groupId>

      <artifactId>dbunit</artifactId>

      <version>2.5.1</version>

    </dependency>

   

    <dependency>

      <groupId>${project.groupId}</groupId>

      <artifactId>user-log</artifactId>

      <version>${project.version}</version>

    </dependency>

  </dependencies>

  </dependencyManagement>

 

11、Nexus sonytype公司生产的私服,主要是为了将我们的依赖放在该私服中,这样就使得自己的机器和该私服处于一个局域网,加快依赖的下载速度,而不用去中央工程去下载,这样比较慢

(1)将nexus的bin目录加入到环境变量,然后就可以在命令行使用nexus

(2)修改……\nexus-2.11.2-06\bin\jsw\conf\wrapper.xml文件,将下面的部分修改为jdk(只能是jdk1.7以上的才可以)的绝对路径


(3)命令行下执行 nexusinstall 安装这个服务

(4)执行nexusstart 启动

(5)使用localhost:8081/nexus访问即可,用户名和密码默认为admin和admin123

(6)hosted工厂主要是局域网中的,不是针对公网,中央工厂下的资源都在Central这种工厂中,Apache Snapshots专门下载apache的snapshot

 

(7)在parent/pom.xml中增加以下内容,该工程就会首先在本地找,本地找不到的话就在nexus中找,最后再向中央工厂去找。

<repositories>

     <repository>

            <id>nexus</id>

            <name>NexusRespository</name>

      <url>http://localhost:8081/nexus/content/groups/public/</url>

     </repository>

  </repositories>

为了增加通用性(这种配置的话,换一个项目就会变换配置一次,太麻烦),让所有的都支持这种方式,增加公共性,那么就在maven的settings.xml中进行设置如下:

<profiles>

<profile>

      <id>nexusProfile</id>

      <repositories>

                   <repository>

                          <id>nexus</id>

                          <name>NexusRespository</name>

                          <url>http://localhost:8081/nexus/content/groups/public/</url>

                          <releases>

                                 <enabled>true</enabled><!--可以下载release的jar包 -->

                          </releases>

                          <snapshots>

                                 <enabled>true</enabled><!--可以下载snapshot的jar包,需要手动开启 -->

                          </snapshots>

                   </repository>

                </repositories>

    </profile>  

  </profiles>

  <!--只有激活之后才可以生效-->

  <activeProfiles>

      <activeProfile>nexusProfile</activeProfile>

  </activeProfiles>

 

如果我要求在nexus中找不到的话也不去中央工厂去找,那么就可以使用镜像配置,同样是在settings.xml中进行配置,注意:mirrorOf的名字可以参考maven-model-builder-3.0.5.jar包中的pom.xml的配置来写,让相同名字的到该镜像中来找

<!--工厂的镜像,只要mirrorOf中的工厂要访问,就会自动来找镜像,如果

     镜像无法访问,就不会去中央工厂,*表示所有的工程都使用镜像,推荐-->

     <mirror>

     <id>nexusMirror</id>

     <!--<mirrorOf>*</mirrorOf>-->

     <mirrorOf>nexus,central</mirrorOf>

      <name>Human ReadableName for this Mirror.</name>

     <url>http://localhost:8081/nexus/content/groups/public/</url>

    </mirror>

12、提交到工厂:mvndeploy进行发布

(1)首先在parent/pom.xml中增加

<distributionManagement>

     <repository>

            <id>user-release</id>

            <name>userreleaseresp</name>

            <url>http://localhost:8081/nexus/content/repositories/releases/</url>

     </repository>

     <snapshotRepository>

            <id>user-snapshot</id>

            <name>usersnapshotresp</name>

            <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>

     </snapshotRepository>

  </distributionManagement>

 

(2)对项目进行授权:在settings.xml中进行上面两个id的server的配置

<server>

     <id>user-release</id>

     <username>deployment</username>

     <password>deployment123</password>

    </server>

    <server>

     <id>user-snapshot</id>

     <username>deployment</username>

     <password>deployment123</password>

    </server>

(3)如果想每个项目建立一个自己的仓库,自己的角色等,那么就先创建release和snapshot的respository,然后就是创建该respository的privileges,然后创建roles,然后创建users,这样一层一层的建立

 

13、声明周期

Clean:①pre-clean ②clean ③post-clean

Compile:….

 

14、插件(要在parent中加入声明<bulid><pluginmagament></pluginmagament ></bulid>,在模块中的<bulid></bulid>标签中加入<plugins><plugin></plugin></plugins>来声明

(1)complier插件,可以用来改变使用的jdk版本

(2)Surefire插件可以用来包含那些测试java的,configuration中的include和exclude都会把相应的测试用的java文件进行加入或者排除,如果不加的话,默认的情况下,maven只会执行Test**、**Test、**TestCase这种测试java文件

 

 

15、webapp

(1)建立webapp的maven工程

(2)建立源文件夹:src/main/java这里面用来存放相关的java代码

(3)建立servlet,因为servlet需要依赖servlet.jar包,所以去中央仓库中寻找servlet-api版本,然后配到parent/pom.xml中

(4)可以将前端的页面,如jsp文件放在工程/src/main/webapp下

(5)执行mvn clean package 会生成相应的war文件,然后将该war放在tomcat中即可

由于每次修改都要重新打包war,那么可以使用一种copy-maven-plugin插件,在执行mvn clean package之后将生成的war包直接拷贝到tomcat的webapp目录下,就不用手动进行拷贝了。

(6)jetty插件来进行发布,增加jetty的插件,然后(该插件大概会每隔10s进行查找)

clean compile jetty:run

然后就可以根据配置的jetty来运行该web工程,这样就不用生成war再拷贝到tomcat了,直接就可以用jetty来作为服务器

 

 

推荐书籍:

(1)       java企业设计模式

(2)       分析模式,可复用的对象模型

http://www.xuexi111.com/jiaocheng/shipin/66165.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值