Java 杂谈Spring-Boot

认识Maven

2018-09-13  本文已影响16人  打铁大师

Maven是构建工具,能把项目抽象成POM(project object model),Maven使用POM对项目进行构建、打包、文档化等操作。最重要的是解决了项目需要类库的依赖管理,简化了项目开发环境搭建的过程,使得我们开发一个从简单到大型的复杂项目变得很容易。

Maven介绍

Maven采用了不同方式对项目构建进行抽象,比如源码位置总是在src/main/java,配置文件则在src/main/resources中,编译好的类总是放在项目的target目录下,总的来说,Maven实现了以下目标:

POM文件

Maven的核心是pom.xml,用XML方式描述了项目模型,如下:

  <?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>me.rowkey</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>antares</name>
  <url>http://maven.apache.org</url>

  <repositories>
      <repository>
          <id>nexus-suishen</id>
          <name>Nexus suishen</name>
          <url>http://maven.etouch.cn/nexus/content/groups/public/</url>
          <snapshots>
              <enabled>true</enabled>
              <updatePolicy>always</updatePolicy>
              <checksumPolicy>warn</checksumPolicy>
          </snapshots>
      </repository>
  </repositories>

  <properties>
      <slf4j.version>1.7.21</slf4j.version>
  </properties>

  <dependencies>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>${slf5j.version}</version>
      </dependency>

      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.8.2</version>
          <scope>test</scope>
      </dependency>
  </dependencies>

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>2.3.2</version>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
              </configuration>
          </plugin>
      </plugins>
  </build>

</project>

pom.xml通常有以下元素:

通常来说,项目版本号分三段,主版本号.次版本号.修订版本号。主版本号变动代表架构变动或者不兼容实现,次版本号是兼容性修改、功能增强,修订版本则是bug修复。

pom的继承

可以通过parent实现POM的继承以完成统一配置管理,子POM中的配置优先级高于父POM。

例如,以Spring Boot为基础的项目中,pom.xml文件中往往有如下属性:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

这样spring-boot-starter-*依赖就不需要指明version版本了,起到了统一控制版本的作用:

<dependencies>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

能够继承的元素如下:

此外,<dependencyManagement>和<pluginManagement>可以统一做依赖和插件的配置管理,不同于<dependencies>和<plugins>的是,如果子POM中没有声明<dependency>和<plugin>则并不生效。

标准Web项目结构

在Maven中,一个Web项目的标准结构,如下所示:

2291536764978_.pic.jpg

其中:

自定义项目结构

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
            </configuration>
        </plugin>
    </plugins>
    <sourceDirectory>src</sourceDirectory>
    <testSourceDirectory>test/java</testSourceDirectory>
    <testResources>
        <testResource>
            <directory>test/resources</directory>
        </testResource>
    </testResources>
    <directory>build</directory>
</build>

这里,Java代码目录移到了./src中,测试代码目录移到了./test/java中,测试资源也移到了./test/resources中,同时编译结果目录变成了./build。此外,在maven-war-plugin中,也把Web目录的war源码目录改为了./WebContent。

配置仓库

在最开始的maven配置文件中,有个repository的配置。此外,Maven还有一个镜像库的配置,即在Maven的setting.xml中配置Maven镜像库。和pom.xml中的repository不同的是,镜像会拦截住对远程中央库的请求,只在镜像库中进行依赖的搜索以及下载。而如果只是配置了repository,那么当在repository中找不到想应的依赖时,会继续去远程中央库进行搜索和下载。

添加仓库镜像

注意:镜像不一定包含所有的依赖库,如果Maven在构建项目中报出缺少依赖库,请暂时注释掉这个镜像并重新构建,切换到中心仓库。

项目构建流程

Maven的构建生命周期中几个常见阶段如下:

profile

现实开发中一个常见的需求就是需要根据不同的环境打包不同的文件。Maven中的profile即可解决此问题。

 <profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <resources.dir>src/main/resources/dev</resources.dir>
        </properties>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <resources.dir>src/main/resources/test</resources.dir>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <resources.dir>src/main/resources/prod</resources.dir>
        </properties>
    </profile>
</profiles>
<build>
    <resources>
        <resource>
            <directory>${resources.dir}}</directory>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

如此,分为dev、test和prod共3种环境,对应每一种环境,其资源文件路径都不一样。在使用MVN时,使用-p参数指定profile即可生效。

Maven常用插件

Maven的常用命令

此外,可以使用-q参数是Maven的日志输出只包含错误信息。

Maven仓库

Maven的仓库有两大类,第一类是远程仓库,包括中心仓库,位于http://search.maven.org/; 还包括镜像仓库,比如国内常用的镜像http://maven.aliyun.com/nexus/,还有利用nexus软件自己搭建的公司私服。

还有一类是本地仓库,位于用户目录的.m2目录下,远程仓库加载的库总是会先放到本地仓库作为缓存。

最后

下面是一些提示:

参考书籍:

上一篇 下一篇

猜你喜欢

热点阅读