предисловие
если ты прав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
, если нет, то он пойдет на частный сервер для загрузки, частный сервер не будет загружен с центрального хранилища на частный сервер, а затем загрузит локальное хранилище.
транзит зависимости
maven-a.jar
полагатьсяmaven-b.jar
maven-b.jar
полагатьсяmaven-c.jar
maven-client
Представлено в проектеmaven-a.jar
,Такmaven-b.jar
иmaven-c.jar
будут внесены.
Транзитивность зависимостей следует двум правилам
принцип кратчайшего пути
С транзитивностью зависимостей тоже есть проблема.
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 в путь к классам тестового теста.
тест: запустить модульные тесты
пакет: пакет
установить: установить банку в локальный репозиторий
развернуть: опубликовать банку в удаленном или частном репозитории.
Пользовательские действия на определенном этапе жизненного цикла
<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>
Пакет, как показано ниже
Использовать с SpringBoot
application.yml
spring:
application:
name: flyyou-service
profiles:
active: @profileActive@
Графический интерфейс для переключения среды разработки, нет необходимости постоянно изменять файлы конфигурации
*-local.yml
существует.gitignore
Не обращайте на это внимания, локальные среды разработки не влияют друг на друга.
При автоматической сборке используйте следующую команду для упаковки среды разработки
mvn clean package -Ddev
Эта статья написанаБлог Чжан Паньциня www.mflyyou.cn/творчество. Ее можно свободно воспроизводить и цитировать, но с обязательной подписью автора и указанием источника статьи.
При перепечатке в публичную учетную запись WeChat добавьте QR-код публичной учетной записи автора в конец статьи. Имя общедоступной учетной записи WeChat: Mflyyou