Maven (3)

Maven

1. Maven仓库

  • Maven有三种类型仓库
    • 本地
      • 默认被创建在%USER_HOME%目录下
      • 要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
    • 中央
    • 远程
      • 如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
      • 通过在POM.xml中指定repositories->repository->id, url
    • 搜索顺序
      • 先本地,再中央,最后远程

2. Maven插件

  • 插件就是目标(goal)的集合
  • 通过以下语法来执行:mvn [plugin-name]:[goal-name]。例如build生命周期里的compile阶段默认是提供了maven-compiler-plugin插件的compile目标的。所以可以通过mvn compile来执行,也可以通过mvn maven-compiler-plugin:compile来执行
  • 常用的一些插件如下:
插件 描述
clean 构建之后清理目标文件。删除目标目录。
compiler 编译 Java 源文件。
surefire 运行 JUnit 单元测试。创建测试报告。
jar 从当前工程中构建 JAR 文件。
war 从当前工程中构建 WAR 文件。
javadoc 为工程生成 Javadoc。
antrun 从构建过程的任意一个阶段中运行一个 ant 任务的集合。

3. Maven插件 - 原型(archetype)插件 - 创建工程

  • Maven 使用原型(archetype)插件创建工程。要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件。
  • 输入命令:mvn archetype:generate,然后根据提示输入groupId, artifactId, archetypeArtifactId(maven 3x版本大概提供了10种archetype,默认是archetype-quickstart),version

4. 构建和测试工程

  • 基于以上创建的工程进行构建与测试:mvn clean package
  • package阶段中应该集成了jar插件的jar目标
  • test阶段中应该集成了surefire插件的test目标
  • compile阶段应该集成了compiler插件的compile目标

5. 外部依赖(第三方包)

  • 当在远程仓库和中央仓库都没有需要的依赖时,可以添加外部依赖,即自己添加jar包。
  • 需要在工程目录里将jar包引入,如在src目录下新建lib目录,将要引用的jar包复制到其中
  • 需要在pom.xml中进行dependency的说明,否则编辑阶段会失败,pom里的示例如下:
    <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/maven-v4_0_0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>com.companyname.bank</groupId>
       <artifactId>consumerBanking</artifactId>
       <packaging>jar</packaging>
       <version>1.0-SNAPSHOT</version>
       <name>consumerBanking</name>
       <url>http://maven.apache.org</url>

       <dependencies>
          <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>3.8.1</version>
             <scope>test</scope>
          </dependency>
          
          <dependency>
             <groupId>ldapjdk</groupId>
             <artifactId>ldapjdk</artifactId>
             <scope>system</scope>
             <version>1.0</version>
             <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
          </dependency>
          
       </dependencies>

    </project>
  • 说明:
    • 指定 groupId 为 library 的名称
    • 指定 artifactId 为 library 的名称
    • 指定作用域(scope)为系统
    • 指定相对于工程位置的系统路径(systemPath)
    • 小技巧: 在IDEA中可以通过输入${dir}来智能提示都有哪些可用的dir可用。

6. 工程文档

  • 在工程目录下执行mvn site进行工程文档的构建
  • 会在target目录下生成site目录,里面就是工程文档了

7. 快照(内部模块包)

  • 大型软件应用程序通常由多个模块组成,各个模块之间可能存在依赖,例如前端应用工程(app-ui.jar:1.0)会依赖于数据服务工程(app-service.jar:1.0)
  • 这种各模块合作的场景下,前端应用工程要依赖于数据服务工程,则在前端应用工程的pom里需要定义dependency,同时需要定义远程仓库
  • 如果数据服务工程一直快速迭代,针对一个版本每天都有很多次修改并release到远程仓库中,此时如果前端应用工程通过版本号对数据服务工程进行依赖,则只会下载一次指定版本,不会尝试从仓库再次下载同版本(1.0)
  • 此时需要通过快照来进行依赖,这样Maven会自动获取同版本最新的快照(1.0-SNAPSHOT)
  • 快照的声明就是把pom的版本version声明为<version>1.0-SNAPSHOT</version>
  • 虽然,对于快照,Maven 每次自动获取最新的快照,但你可以在任何 maven 命令中使用 -U 参数强制 maven 下载最新的快照:mvn clean package -U

8. 构建自动化(被依赖项发生变化时,自动构建依赖方)

  • 可以通过在被依赖项的pom里添加编译目标maven-invoker-plugin:run来提醒相应的依赖方
<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>bus-core-api</groupId>
   <artifactId>bus-core-api</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>
   <build>
   <plugins>
   
   <plugin>
      <artifactId>maven-invoker-plugin</artifactId>
      <version>1.6</version>
      <configuration>
         <debug>true</debug>
         <pomIncludes>
            <pomInclude>app-web-ui/pom.xml</pomInclude>
            <pomInclude>app-desktop-ui/pom.xml</pomInclude> 
         </pomIncludes>
      </configuration>
      <executions>
         <execution>
            <id>build</id>
            <goals>
               <goal>run</goal>
            </goals>
         </execution>
      </executions>
   </plugin>
   
   </plugins>
   <build>
</project>
  • 引时构建被依赖项时会自动构建两个依赖方
  • 另外也可以借助CI集成框架Jenkins来进行这种依赖关系的自动化构建

9. 管理依赖

  • 如果涉及到A依赖B、B依赖C的场景,我们只需要在每个工程的pom文件里去定义直接的依赖关系即可,即在A的pom里只定义依赖B
  • 通常情况下,在一个共通的工程下,有一系列的工程。在这种情况下,我们可以创建一个公共依赖的 pom 文件,该 pom 包含所有的公共的依赖关系,我们称其为其他子工程 pom 的 父pom。父pom中定义的 包类型是pom: <packaging>pom</packaging>
  • 引用父pom的子pom是如下定义:
<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">
      <parent>
         <artifactId>Root</artifactId>
         <groupId>com.companyname.groupname</groupId>
         <version>1.0</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.companyname.groupname</groupId>
      <artifactId>App-Core-lib</artifactId>
      <version>1.0</version> 
      <packaging>jar</packaging>
</project>

10. Maven - Web应用

  • 通过amaven-archetype-webapp插件进行工程创建
  • 编译,mvn clean package,生成war包
  • 通过在pom里设置finalName来指定war包名,定义在build里
  • 部署web应用

猜你喜欢

转载自blog.csdn.net/chenyunqiang/article/details/78978256
今日推荐