Вы уверены, что знаете все о Maven?

Java

предисловие

если ты правMavenПонимание останавливается только на том, как добавлять пакеты зависимостей, вам действительно нужно прочитать следующий контент.

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
    <dependency>
        <groupId>org.openjdk.jol</groupId>
        <artifactId>jol-core</artifactId>
        <version>0.10</version>
    </dependency>
</dependencies>
  • Зависимости пакетов maven, передача зависимостей и правила, которым следует передача зависимостей
  • Объем зависимых пакетов
  • Как разрешить конфликты пакетов jar
  • Наследование и агрегация проектов
  • жизненный цикл мавена
  • Использование плагина Maven и общие команды
  • Использование частного сервера maven
  • как опубликовать банку
  • maven определяет различные среды конфигурации
  • упаковка maven-assembly-plugin

Maven

Текущий популярный инструмент управления проектами для java-проектов.MavenиGradle. С точки зрения текущего использования,MavenКоэффициент использования выше, чемGradleиз. Когда вы боретесь с тем, какой инструмент управления использоватьMavenПросто сделай это.

существуетMavenпрошедшийPOM-Project Object ModelКонцепции объектной модели проекта для управления проектами. В Maven каждый проект эквивалентен объекту, а объекты (проекты) могут зависеть, наследоваться и объединяться.

Веб-сайт поиска пакетов зависимостей проектаmvnrepository.com

Пакеты зависимостей помещаются вMavenНа складе нам нужно загрузить банку со склада через зависимую координатную информацию.

Информация о координатах: идентификатор группы, идентификатор артефакта, версия.

когда мыpom.xmlпредставитьa.jar , MavenПроверит из локального репозиторияa.jar, если нет, то он пойдет на частный сервер для загрузки, частный сервер не будет загружен с центрального хранилища на частный сервер, а затем загрузит локальное хранилище.

image-20200607151711515

транзит зависимости

maven-a.jarполагатьсяmaven-b.jar

maven-b.jarполагатьсяmaven-c.jar

maven-clientПредставлено в проектеmaven-a.jar,Такmaven-b.jarиmaven-c.jarбудут внесены.

image-20200607154728583

Транзитивность зависимостей следует двум правилам

принцип кратчайшего пути

С транзитивностью зависимостей тоже есть проблема.

maven-a.jarполагатьсяmaven-b.jar

maven-b.jarполагатьсяmaven-c.jar(2.0)

maven-a.jarполагатьсяmaven-c.jar(1.0)

maven-clientПредставлено в проектеmaven-a.jar.

который в итоге будет использованmaven-c.jar

Итак, одно из правил транзитивности зависимостей maven:最短路径原则.

a -> b ->c(2.0)

a -> c(1.0)

maven-clientВ итоге в проекте использовалась версия 1.0 c .

принцип первого заявления

Существует проблема с принципом кратчайшего пути. Что делать, если кратчайшие пути совпадают? Первое утверждение заключается в том, что звуковой эффект возникает при совпадении кратчайших путей.

maven-clientПредставлено в проектеmaven-a.jarиmaven-b.jar

maven-b.jarзависеть только отmaven-c.jar(2.0)

maven-a.jarзависеть только отmaven-c.jar(1.0)

Теперь кратчайший путь зависит от того же

maven-client -> maven-a -> maven-c(1.0)

maven-client -> maven-b -> maven-c(2.0)

существуетmaven-clientпредставлен первымmaven-aТакmaven-c 1.0звуковой эффект

существуетmaven-clientпредставлен первымmaven-bТакmaven-c 2.0звуковой эффект

Первоначальное утверждение было немного не впечатляющим, и я могу исправить это таким образом.

  • Первый — разорвать кратчайший путь зависимостей непосредственно вmaven-clientимпортируйте то, что вы хотитеmaven-cверсия.
<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>maven-a</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>maven-b</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>maven-c</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
  • Во-вторых, исключить банку

Это исключаетmaven-bперешелmaven-c. в соответствии с вашими потребностями

<dependencies>

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>maven-a</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>maven-b</artifactId>
        <version>1.0-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>org.example</groupId>
                <artifactId>maven-c</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

Область зависимости

Объем зависимостей определяет, когда jar вступает в силу и упакован ли он в war или jar.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

scopeРазные значения имеют разные значения.

compile

scopeЗначение по умолчаниюcompileИдентифицирует текущий пакет зависимостей и участвует в компиляции, запуске, тестировании и упаковке проекта.

runtime

runtimeУказывает, что он не участвует в компиляции проекта, но участвует в выполнении, тестировании и упаковке проекта.

provided

providedУказывает на участие в компиляции, запуске и тестировании проекта, но не в упаковке.

system

systemОн используется для некоторых сторонних библиотек, разработанных нами, но не может быть опубликован в Интернете и может использоваться в этом сценарии. По умолчанию этот jar не будет запакован, и нам нужно его настроить.

Участие в компиляции, запуске и тестировании проектов.

<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>maven-d.jar</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>system</scope>
        <systemPath>${basedir}/lib/maven-d.jar</systemPath>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>${basedir}/lib</directory>
            <targetPath>BOOT-INF/lib/</targetPath>
            <includes>
                <include>**/*.jar</include>
            </includes>
        </resource>
    </resources>
</build>

test

testФлаг нужен только при компиляции тестового кода и запуске тестового кода, больше ничего, и он не будет включен при упаковке.

import

Обычно мы будем использовать эту область в родительском проекте. Представляет конфигурацию, которая импортирует зависимости из другого файла pom.xml.

Например, нашему собственному родительскому проекту требуется только управление зависимостями Springboot.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Наследование и агрегация

наследовать

maven-clientнаследоватьmaven-demo

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <parent>
        <artifactId>maven-demo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>maven-client</artifactId>
</project>

полимеризация

maven-demoОбъединяются пять проектов.

<?xml version="1.0" encoding="UTF-8"?>
<project >
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.example</groupId>
    <artifactId>maven-demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>maven-a</module>
        <module>maven-b</module>
        <module>maven-c</module>
        <module>maven-client</module>
        <module>maven-d</module>
    </modules>
</project>

Наследование используется для устранения избыточной конфигурации, такой как конфигурация упаковки некоторых конфигураций, переменные конфигурации, зависимости проекта и управление версиями зависимостей плагинов.

Агрегаты используются для быстрого создания проектов.

Чтобы упаковать a,b,c,d,clent перед агрегацией, вам нужно запустить пакет mvn отдельно.

После агрегации нам просто нужно запустить пакет mvn под maven-demo.

жизненный цикл

Внутри maven есть три цикла сборки. чистый, по умолчанию, сайт.

где default — это время жизни, которое мы часто используем.

чистый жизненный цикл

Просто сделайте одно, удалите скомпилированные вещи.

жизненный цикл по умолчанию

Жизненный цикл по умолчанию примерно состоит из следующих фаз.

resources -> compile -> testResources -> testCompile -> test -> package -> install -> deploy

Представьте наши обычно используемые.

ресурсы: скопируйте ресурсы из src/main/resources в путь к классам.

compile: скомпилировать исходный код проекта

testResources: скопируйте src/test/resources в путь к классам тестового теста.

тест: запустить модульные тесты

пакет: пакет

установить: установить банку в локальный репозиторий

развернуть: опубликовать банку в удаленном или частном репозитории.

image-20200607175812514

Пользовательские действия на определенном этапе жизненного цикла

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptors>
            <descriptor>${basedir}/assembly/package.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Различные жизненные циклы работают вместе.

mvn clean package

ограничительныйcleanжизненный цикл, повторное выполнениеdefaultжизненный цикл доpackageсцена.

Использование приватных серверов и зеркал

Настроить зеркалирование

MirrorOf указывает файл settings.xml репозитория прокси для настройки зеркала.

<localRepository>
    /Users/zhangpanqin/.m2/repository
</localRepository>
<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <!-- 被镜像的中央仓库 id -->
        <mirrorOf>central</mirrorOf>
        <name>中央仓库镜像</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>

Вы также можете настроить частный сервер в pom.xml

<repositories>
    <repository>
        <id>ali_maven</id>
        <url>https://maven.aliyun.com/repository/central/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

Определение различных конфигурационных сред

Вы также можете запускать разные среды jdk в соответствии с разными средами конфигурации или запускать разные зеркала в соответствии с разными средами.

Конфигурация settings.xml.

<profiles>
    <profile>
        <id>test-1</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <repositories>
            <repository>
                <id>public-snapshots</id>
                <name>public-snapshots</name>
                <url>http://mvn.uinnova.cn/nexus/content/groups/public</url>
                <releases>
                    <enabled>true</enabled>
                    <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
                    <updatePolicy>daily</updatePolicy>
                    <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
                    <checksumPolicy>warn</checksumPolicy>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
    </profile>
</profiles>

Его также можно настроить для конкретных проектов.

<profiles>
    <!--  定义配置环境 打包的环境 mvn clean package -Pdev -->
    <profile>
        <id>local</id>
        <properties>
            <profileActive>local</profileActive>
        </properties>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
    </profile>

    <profile>
        <id>dev</id>
        <properties>
            <profileActive>dev</profileActive>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <profileActive>prod</profileActive>
        </properties>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
    </profile>

    <profile>
        <id>test</id>
        <properties>
            <profileActive>test</profileActive>
        </properties>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
    </profile>
</profiles>

упаковка maven-assembly-plugin

конфигурация pom.xml

<build>
    <finalName>flyyou</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptors>
                    <descriptor>${basedir}/assembly/package.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

package.xml

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    <!--  id 标识符,添加到生成文件名称的后缀符。如果指定 id 的话,目标文件则是 ${artifactId}-${id}.tar.gz-->
    <id>${project.version}-${profileActive}-bin</id>
    <!-- 指定打的包是否包含打包层目录(比如finalName是terminal-dispatch,当值为true,所有文件被放在包内的terminal-dispatch目录下,否则直接放在包的根目录下)-->
    <!--    <includeBaseDirectory>true</includeBaseDirectory>-->
    <!--   打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war,可以同时指定多个打包格式-->
    <formats>
        <format>tar.gz</format>
        <format>zip</format>
    </formats>

    <fileSets>
        <!-- target 目录下的 jar,打包进zip文件的 lib 目录 -->

        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <!--  项目根目录下的 bin 目录打包进 zip bin -->
        <fileSet>
            <directory>${basedir}/bin</directory>
            <outputDirectory>bin</outputDirectory>
            <includes>
                <include>*.sh</include>
                <include>*.bat</include>
            </includes>
        </fileSet>
        <!--  把项目根目录下的 doc 目录打包进 zip 中的 doc -->
        <fileSet>
            <directory>${basedir}/doc</directory>
            <outputDirectory>doc</outputDirectory>
            <includes>
                <include>pic/**</include>
                <include>*.md</include>
                <include>*.pdf</include>
            </includes>
        </fileSet>

        <!--  把编译路径 classes 下的配置文件和日志配置文件放到 zip 中的 conf -->
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory>conf</outputDirectory>
            <includes>
                <include>application-${profileActive}.yml</include>
                <include>logback-spring.xml</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

Пакет, как показано ниже

image-20200607182606397

Использовать с SpringBoot

application.yml

spring:
  application:
    name: flyyou-service
  profiles:
    active:  @profileActive@

Графический интерфейс для переключения среды разработки, нет необходимости постоянно изменять файлы конфигурации

*-local.ymlсуществует.gitignoreНе обращайте на это внимания, локальные среды разработки не влияют друг на друга.

image-20200607182749440

При автоматической сборке используйте следующую команду для упаковки среды разработки

mvn clean package -Ddev


Эта статья написанаБлог Чжан Паньциня www.mflyyou.cn/творчество. Ее можно свободно воспроизводить и цитировать, но с обязательной подписью автора и указанием источника статьи.

При перепечатке в публичную учетную запись WeChat добавьте QR-код публичной учетной записи автора в конец статьи. Имя общедоступной учетной записи WeChat: Mflyyou