Maven学习笔记

#Maven约定 默认情况下,在maven中路径为 source code ${basedir}/src/main/java

资源路径: ${basedir}/src/main/resources

Tests: ${basedir}/src/test

编译文件路径: ${basedir}/target/classes

打包JAR文件: ${basedir}/target

#Maven Features

  • Dependency Mangement 项目依赖管理
  • Remote Repositories
  • Universal Reuse of Build Logic
  • Tool Portability/Integration
  • Easy Searching and Filtering of Project Artifacts

#Maven目录文件

LICENESE.txt NOTICE.txt README.txt bin/ boot/ conf/ lib/

lib/ 目录下包含一个JAR文件(maven-core-3.0.3-uber.jar),是maven的核心文件。 *conf/*目录下包含了maven的配置文件

#插件与Goals(目标) Maven插件(Plugin):一个或多个goals的集合。 maven插件可以是由java、ant、Groovy、beanshell、Ruby等语言编写的 目标(goal):代表一个特殊的任务,既可以是一个可单独执行的任务,也可以由多个小任务组成的大任务。goal是maven的“工作单元”(unit of work)。

Jar Plugin:是maven的一个核心插件,目标是创建jar文件。 Compiler plugin:目标包含了编译源文件、单元测试。 Suerfire:目标包含单元测试和生成测试报告。

mvn archetype:generate archetype代表maven插件的名字;generate代表goal。

#Maven生命周期 maven有一系列的生命周期,而插件的goal都依附于特定的生命周期。当执行maven的某个生命周期时,该什么周期中依附的goal都会被执行。

site 阶段: 执行maven site,会在target/site目录下生成一系列的html文件,它们包含了对于项目基本信息的描述,依赖关系的描述、单元测试报告、Javadoc 项目API等等。 #Maven Coordinates 由groupId, artifactId, packaging, version组成,用来唯一标识一个项目。

#Maven Repositories Maven resources:resource 目标会从远程库中下载最新的插件、依赖库等项目。

#Maven 依赖管理 maven会解析POM文件,查找当前项目依赖的库;然后,再解析被依赖项目的POM文件,找到它们所依赖的项目,如此递归下去。 利用命令查看项目完整POM配置

mvn help:effective-pom

依赖范围(scope)

  • test: 依赖关系会在 Compiler:testCompilesurefire:test目标中,被加入classpath,而其在执行其他目标时,是不可见的。
  • provided: 依赖关系在编译过程中有效,但是不会被集成到最终的打包文件中。

mvn dependency:resolve 查看项目依赖情况

mvn dependecy:tree 查看项目依赖树

maven debug标志 -X eg: mvn install -X

#Maven单元测试 ##单元测试类文件,放在src/test目录下和被测试类相同的路径中,例如

被测试文件路径: src/main/java/com/simple/Simple.java 测试文件路径: src/test/java/com/simple/SimpleTest.java

##测试中所用到的资源文件放在

src/test/resources

##执行单元测试

mvn test

##忽略单元测试错误 方法一、POM文件中配置surefire插件

<configuration>
    <testFailureIgnore>true</testFailureIgnore>
</configuration>

方法二、命令行配置

mvn test -Dmaven.test.failure.ignore=true

##跳过单元测试 方法一、POM文件配置

<configuration>
    <skip>true</skip>
</configuration>

方法二、命令行配置

mvn install -Dmaven.test.skip=true

生命周期不一定是install

#打包命令行应用

  1. 配置Assembly Descriptor插件
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef><!--打包后jar文件后半部分的名称-->
            </descriptorRefs>
        </configuration>
</plugin>
  1. 执行打包命令

mvn install assembly:assembly

在install生命周期内执行打包

将打包目标附着到maven生命周期中

在执行 mvn package 时会执行配置的assembly:attached命令, 由于package先于install, 所以执行mvn install同样会完成打包

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef><!--打包后jar文件后半部分的名称-->
            </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>simple-command</id>
            <phase>package</phase> <!--指定插件的生命周期为package-->
            <goals>
              <goal>attached</goal> <!--在package阶段会执行assembly:attached-->
            </goals>
          </execution>
        </executions>
</plugin>

#构建Web项目

  1. 利用 mvn archetype:generate 命令构建web项目时,选择的原型的artifactId为maven-archetype-webapp
  2. 配置maven编译器的版本
 <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
</plugins>

项目的打包文件类型为war,打包后文件的名称为 $ {artifactId}-$ {version}.war 如果设置了finalName元素的话,打包后的文件名称为 $ {finalName}.war

  1. src/main/java目录下编写项目源代码
  2. 配置web.xml文件,添加servlet等参数
  3. 在POM文件中添加servlet-api支持
<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.4</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

因为scop为provided,所以不会将servlet-api打包到war文件中

#Maven多模块项目 ##父模块POM配置 最上层的父模块的配置文件与普通POM.xml基本相同,除了两个地方

  1. 打包类型为pom
  2. modules中填写直属的子模块artifactId
<packaging>pom</packaging>
<modules>
    <module>simple-parent</module>
</modules>

##子模块配置 在子模块的最开始添加父模块信息,子模块同时也可以是其他模块的父模块。

<parent>
  	<groupId>org.sonatype.mavenbook.multi</groupId>
  	<artifactId>parent</artifactId>
  	<version>0.8-SNAPSHOT</version>
</parent>

如果某一个子模块对其他模块有依赖关系,需要在POM的dependency中添加依赖信息

<dependency>
      <groupId>org.sonatype.mavenbook.multispring</groupId>
      <artifactId>simple-weather</artifactId>
      <version>0.8-SNAPSHOT</version>
</dependency>
<dependency>
      <groupId>org.sonatype.mavenbook.multispring</groupId>
      <artifactId>simple-persist</artifactId>
      <version>0.8-SNAPSHOT</version>
</dependency>

当maven对含有子模块的项目进行打包等操作时,它会先载入父模块的POM文件,然后找到所有子模块的POM文件。maven会把这些POM文件加载到Reactor中,分析各个模块的信赖关系,Reactor会保证各个相互依赖模块按照顺序被编译、安装。

#POM优化 多个模块组成的项目,各模块之间的第三方包依赖情况,各模块版本信息都有可能重复设置,这些分散的设置有可能导致项目潜在的不稳定风险,所以需要多项目POM进行优化。 ##依赖优化 如果第三包在多个子模块中有依赖的情况,那么应该将依赖信息提取到父POM中,在子模块的POM文件中只保留groupIdartifactId两项。 在对于其他模块的依赖中,使用内建的项目groupIdversion信息,以确保项目个子模块的groupId和版本信息能够保持同步。

<dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>simple-weather</artifactId>
      <version>${project.version}</version>
</dependency>
<dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>simple-persist</artifactId>
      <version>${project.version}</version>
</dependency>

##插件配置优化 如果多个子模块中存在相同的插件配置,可以把配置信息提取到父POM文件的pluginManaement中。

转载于:https://my.oschina.net/u/189332/blog/518564

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值