Skip to content

Latest commit

 

History

History
474 lines (412 loc) · 19 KB

Maven.md

File metadata and controls

474 lines (412 loc) · 19 KB

НАЗАД к СОДЕРЖАНИЮ


У ВК и Яндекс свои собственные сборщики проектов.

Maven - для легаси проектов

Maven - это инструмент для автоматической сборки проектов на основе описания их структуры в специальных файлах на языке POM (Project Object Model)

    <!--after_properties-->
    
    <!--AssertJ-->

        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.24.2</version>
            <scope>test</scope>
        </dependency>


    <!--GSON-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.10.1</version>
            <scope>compile</scope>
        </dependency>
    

    <!--JUnit-->
  
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.10.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <!--Для корректной сборк в jar-->
        <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>org.mainClass.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build></project>


<!--MOCKITO-->
    <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>
<!--MOCKITO АННОТАЦИИ-->
<dependency>
    <groupId>org.mockito</groupId>
     <artifactId>mockito-junit-jupiter</artifactId>
     <version>3.5.10</version>
     <scope>test</scope>
 </dependency>


<!--Testcontainers-->
<!-- https://mvnrepository.com/artifact/org.testcontainers/testcontainers -->
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.17.6</version>
    <scope>test</scope>
</dependency>

<!--HIBERNATE-->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.6.15.Final</version>
</dependency>

<!---MySQL-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

<!-- LOMBOK-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

<!--JAXB для работы с XML-форматом-->
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

<!--SELENIUM_FOR_E2E_TESTS-->
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.8.3</version>
</dependency>

<!--SPRING-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>6.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>6.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.1.2</version>
        </dependency>
        <dependency>
        <!--SPRING (Для работы с MVC-приложениями)-->
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>6.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>6.1.2</version>
        </dependency>

<!--Themeleaf Spring6 шаблонизатор. ВАЖНО!! Версия такая же, как и SPRING!-->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring6</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>

<!--Jakarta Servlet (старая Javax)-->
<!--Использует класс AbstractAnnotationConfigDispatcherServletInitializer, для замены web.xml-->
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>6.0.0</version>
      <scope>provided</scope>
    </dependency>

<!--Hibernate validator-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>8.0.0.Final</version>
</dependency>

<!-- quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

<!--плагн для тестирования ВСЕГО ПРОЕКТА-->
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M5</version>
        </dependency>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>5.7.0</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

<!--плагн для тестирования ВСЕГО ПРОЕКТА + LOMBOK-->

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>5.7.0</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <excludes>
                        <exclude>org.projectlombok:lombok</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

groupId, artifactId и version (GAV) - индентификаторы проекта

  • groupId - наименование организации или подразделения, туда записывают доменное имя организации или сайта проекта. Например: com.google
  • artifactId — название проекта. Например: apache
  • version - версия. Пример: 1.0
<properties></properties> - настройки проекта
<build></build> - параметры сборки проекта

Подуровень "build":

* <resources></resources> - доп.ресурсы. Например, свои доп. каталоги или файлы (например, файл с длинным SQL-запросом) (структура папок должна соответствовать проекту) org/example (именно через слэш, чтобы создалось две папки) и ниже (если есть).
* <finalName>имя, которое будет у проекта (структура папок), игнорируя GAV</finalName> //ХЗ, или в build, или ниже в плагине сборки проекта, под GAV

Доп.инфа
Компиллятор java (тот, который по дефолту указан в "properties"), это плагин maven. Все эти настройки проекта можно также пересобрать в блоке "build".
Вот так:

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

Еще один плагин. "maven assembly" - для упаковывания всех ресурсов(и зависимостей) вместе с проектом в jar-файл. Походу, обязательная история при использовании внешних библиотек

     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>red.dragon.Main</mainClass> <!--точка входа в программу-->
                        </manifest>
                    </archive>
                    <descriptorRefs>
                    <!--настройка, позволяющая упаковывать все зависимости в архив-->
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <!--ПРОСТО ДЛЯ ПРИМЕРА: ФИНАЛЬНОЕ ИМЯ JAR СЮДА:-->
                    <finalName>HelloApp</finalName>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!--plugin_id-->
                        <phase>package</phase> <!--фаза сборки, когда будет испльзоваться-->
                        <goals>
                            <goal>single</goal><!--утилита плагина, которая будет запущена в данной фазе-->
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

<!--для сборки Spring-приложения в JAR-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                <!--jar можно будет запускать на винде-->
                    <executable>true</executable>
                </configuration>
            </plugin>

<!--правила, проверяемые при сборке проекта-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>3.0.0-M2</version>
                <executions>
                    <execution>
                        <id>enforce</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <!--запрет дупликации зависимостей в проекте-->
                            <rules>
                                <banDuplicatePomDependencyVersions/>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

<!--ЧЕКСТАЙЛ-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>${checkstyle-plugin.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>com.puppycrawl.tools</groupId>
                        <artifactId>checkstyle</artifactId>
                        <version>${checkstyle.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <configLocation>${checkstyle.config.url}</configLocation>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Жизненный цикл Maven - описывает жизненный цикл разработки ПО

  • default - основной. Отвечает за сборку, тестирование, пакетирование и развертывание проекта
  • clean - чистит проект от target и out (ранее скомпиллированные классы)
  • validate - проверяет структуру и отсуствтие некорректных зависимостей (например, циклические зависимости, когда есть две зависимости, зависящие друг от друга). Maven ожидает, что все зависимости выстроятся в древовидную структуру, а не созависимую.
  • compile - откомпиллит классы в target
  • test - выполнение всех юнит-тестов в проекте
  • package - создание jar
  • verify - проверка, что пакет соответствует критериям проекта
  • install - собранный артефакт сохраняется в локальный репозиторий на диске. В дальнейшем, можно будет либо испльзовать программу в других проектах, либо залить на maven repo
    • путь к локальному репо по умолчанию: «C:\Users${UserName}.m2\repository», где UserName это имя вашей учетной записи
  • site - генерация документации
  • deploy - заливка приложения на удаленный сервер и его запуск

как добавить переменную в pom.xml:

<spring.version>6.1.2</spring.version>

и в нужное место - ${}


С курса по спрингу:

Плагины — это расширения Maven, предоставляющие дополнительные функции и возможности для управления процессом сборки вашего проекта. Плагины состоят из одной или нескольких задач (goals), которые могут быть вызваны в различных фазах жизненного цикла сборки. Размещаются в

<build><plugins><plugin>here</plugin></plugins></build>

Репозитории — это централизованные хранилища артефактов, таких как библиотеки и плагины. В Maven существует три типа репозиториев: локальный, центральный, удаленный. В случае с банком - это всегда локальный репозиторий (типа Nexus)
Пример:

    <repositories>
        <repository>
            <id>example-repo</id>
            <url>https://example.com/repo</url>
        </repository>
    </repositories>

Настройка проекта Maven

maven-настройка

profiles - настройка запуска приложения на разных средах

профили

УСТАНОВКА MAVEN:
https://maven.apache.org/install.html (распаковать и добавить в PATH папку bin)

Команды mvn:

mvn archetype:generate -DgroupID=ru.geekbrains -DafrifactId="myProject" -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false #DarchetypeArtifactId - шаблон проекта, DinteractiveMode=false - создание папок с дефолтными именами  
mvn archetype:generate #создание проекта в интерактивном режиме  
mvn package # - сборка  
mvn package -P development # подключить профиль   development  

плагин для проверки чистоты кода - checkstyle plugin

Для исключения зависимости из сборки - scope

исключение зависимости из сборки

Создание собственного плагина: /sping_GB

<packing>maven-plugin</packing>  
А также, добавить зависимость maven-plugin-api
Создать класс, наследующий от AbstractMojo

Версия проекта 1.0.0 - мажор/минор/патч

Для исключения отдельных компонентов зависимости

<exclusions></exclusions>

Для исключения данной библиотеки

<optional>true</optional>

Подбор версий зависимостей автоматически и сбор проекта - используя https://start.spring.io/