2018.5.3 maven

时间:2021-09-13 23:58:53

 1  maven基本概念

2018.5.3  maven

 1.1maven是什么

1)软件项目管理和理解工具
      2)项目对象模型(Project Object Model,POM)
      3)项目的构建、报告和文档的中心信息

1.2maven仓库

2018.5.3  maven

1.3 pom.xml

2018.5.3  maven

a)groupId:项目或者组织的唯一标志

b)artifactId: 项目的通用名称

c)version:项目的版本

d)packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar

1.4 lifecycle

  • 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     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

1.5 常用命令

mvn compile

mvn package

mvn install

mvn clean package -DskipTests

2  maven插件

2.1简介

Maven 是一个执行插件的框架,每一个任务实际上是由插件完成的。Maven 插件通常用于:

  • 创建 jar 文件

  • 创建 war 文件

  • 编译代码文件

  • 进行代码单元测试

  • 创建项目文档

  • 创建项目报告

一个插件通常提供了一组目标,可使用以下语法来执行:

mvn [plugin-name]:[goal-name]

例 mvn compile:compile

2.2 插件解析机制

Maven插件的来源:基本所有主要的maven插件都来自于Apache和CodeHaus,与依赖构件一样,插件构件同样基于坐标存储在Maven仓库中。

在需要的时候,Maven会从本地仓库寻找插件,如果不存在,则从远程插件仓库查找。找到插件之后,再下载到本地仓库使用

maven内置仓库配置如下,关闭了SNAPSHOT

<pluginRepositories>
<pluginRepository>
<id>central</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>

3  maven常见问题及解决思路

3.1 IDEA提示不能解析配置文件(文件已存在)

出现这个问题的原因在于IDEA没有识别到该配置文件的路径,绝大的原因在于Maven的索引没有该文件 
- 首先, 必须确定该资源文件的路径正确
- 然后, 更新maven的索引:【选择项目】---【右键】---【maven】—【Reimport】

3.2 项目依赖本地jar包(不想install到mvn的repository中),怎么配置? 

<dependency>

    <groupId>com.dtdream.uim</groupId>
    <artifactId>uim-server-sdk</artifactId>
    <version>1.0.4-SNAPSHOT</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/uim-server-sdk.jar</systemPath>
</dependency>

maven 打包的时候默认是不加入依赖的jar包的,所以如果想打出一个独立的可运行的包时,需要加入如下plugin(以打war包为例):

<build>
    <finalName>ipa</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
        <webResources>
          <resource>
          <directory>${project.basedir}/lib</directory>
          <targetPath>WEB-INF/lib</targetPath>
          <filtering>false</filtering>
          <includes>
            <include>**/*.jar</include>
          </includes>
          </resource>
        </webResources>
        </configuration>
        <version>2.1.1</version>
     </plugin>
    </plugins>
</build>

3.3 程序中有些单元测试有错误,如何忽略测试步骤

(1) mvn package -DskipTests   不执行测试用例,但编译测试用例生成相应的class文件至target/test-classes下,可以在pom 文件中做如下修改:

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

(2) mvn package -Dmaven.test.skip=true 不执行测试用例,也不编译测试用例 ,可以在pom文件中做如下修改:

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

3.4 maven类包冲突

1)找到传递依赖的鬼出在哪里?
mvn dependency:tree -Dverbose -Dincludes=[groupId]:[artifactId]:[version]

2)将不想要的传递依赖剪除掉

假设我们不希望asm:asm:jar:1.5.3出现,根据分析,我们知道它是经由org.unitils:unitils-dbmaintainer:jar:3.3引入的,那么在pom.xml中找到这个依赖,做其它的调整:

<dependency> 
    <groupId>org.unitils</groupId> 
    <artifactId>unitils-dbmaintainer</artifactId> 
<version>${unitils.version}</version> 
  <exclusions> 
    <exclusion> 
      <artifactId>asm</artifactId> 
      <groupId>asm</groupId> 
    </exclusion> 
  </exclusions> 
</dependency>

3)清理IDEA缓存

前两个步骤完成之后,还提示有jar包冲突(典型症状是java.lang.ClassNotFoundException或Method不兼容等异常)。这种情况通常是由IEDA缓存造成的,建议Reimport一下maven列表就可以。

3.5 项目发布到远程仓库

<distributionManagement>
    <!-- 发布版本的构件的仓库 -->
        <repository>
        <id>releases</id>
        <name>Releases</name>
        <url>http://maven.dtdream.com/content/repositories/releases/</url>
        </repository>
<!-- 快照版本的仓库-->
    <snapshotRepository>
      <id>snapshots</id>
        <name>Snapshots</name>
        <url>http://maven.dtdream.com/content/repositories/snapshots/</url>
   </snapshotRepository>
</distributionManagement>