JavaRush /Java 博客 /Random-ZH /您想了解的关于 Maven 的一切 - “Java 项目从 A 到 Z”
Roman Beekeeper
第 35 级

您想了解的关于 Maven 的一切 - “Java 项目从 A 到 Z”

已在 Random-ZH 群组中发布
大家好,亲爱的朋友们。我马上道歉:我记得我答应过每周写一篇文章。没有成功。我只是还没有抽出时间坐下来好好地写作,但我不想这样做或那样做。我不会抱怨原因,因为我不需要它,你当然也不感兴趣。该项目并没有死,它处于停滞状态:)我们继续!今天的材料专门针对 Maven。 《Java 项目从头到尾》:您想了解的关于 Maven 的一切 - 1

我们来谈谈Maven

首先您需要安装它。当然,由于我有Mac,所以只能展示Mac的安装。只是运气不好而已。我很久以前就安装了它,所以你必须自己安装:)
本材料中有安装 Maven 的说明。

为什么我们需要 Maven?

Maven 是一个项目构建工具,与 Gradle 和 Ant 一样。因为我将在 JRTB(JavaRush Telegram Bot)中使用它,所以我想向您介绍最新情况。如今,没有一个项目是在没有装配系统的情况下创建的,因为它多次简化了我们的生活。这允许:
  • • 拉起所有必要的库(就组装工具而言——依赖关系(即依赖关系));
  • • 准确确定项目需要如何组装以及组装成什么(例如,我们想要将其收集在 WAR 或 JAR 或可执行 JAR 中);
  • • 将项目版本设置在一处,以便在组装过程中得到指示;
  • • 描述项目及其生命周期;
  • • 添加所谓的插件(英文单词Plugin 的繁体版本);
  • • 在共享存储库中发布库,以便其他项目可以将它们作为依赖项提取。
总的来说,他做的事情很多,而且都是有用的。我想说的是:对于新手工程师来说,没有必要从头到尾了解所有功能。在这里,与 git 一样,了解基础知识和一般概念非常重要。这就是我们要做的。对于我们来说,Maven 从项目根目录中名为pom.xml的 XML 文件开始。我们将在实践中做所有事情,因此首先我们将在 JavaRush 社区中创建我们的第一个项目。为了明智地做每件事,我将使用存储库模板,其中已经配置了我在 JR 上描述过的基本内容。要创建,请转到包含模板的存储库,然后单击“使用此模板”按钮:《Java 项目从头到尾》:您想了解的关于 Maven 的一切 - 2因此,我们在社区中拥有第一个存储库:)我们在本地下载该项目。为此,通过想法,从版本控制转到 File -> New -> Project。在出现的窗口中,输入 Github 上项目的链接(如果每个人都单独创建同一个项目并跟我一起完成所有步骤,效果会更好):“Java 项目从 A 到 Z”:您想了解的关于 Maven 的一切 - 3点击Clone,项目就被克隆了

pom.xml 是一切的头

您需要的一切都在 pom.xml 中。有关项目、其开发人员以及项目存储在哪个远程存储库的所有信息。首先,我们对以下块感兴趣: <project/> - 这是主块,其中包含有关项目的所有信息。所有其他人都将明确或传递地参与其中。在开始标签里面写着这样的内容:
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                     http://maven.apache.org/xsd/maven-4.0.0.xsd">
最重要的是,下一行也是用所有 pomnik 编写的(该俚语据说来自 pom.xml :))。
<modelVersion>4.0.0</modelVersion>
但接下来它会变得更有趣:我们将描述我们如何识别我们的纪念馆所描述的项目。以我的库为例,我将描述它,然后我们将它添加到我们的内存中,添加到新创建的项目中:
<groupId>com.github.romankh3</groupId>
<artifactId>image-comparison</artifactId>
<version>4.4.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Image Comparison</name>
这里主要的事情是:
  • groupId是开发组织或单个工程师的标识符。这通常是域的相反顺序。作为示例,此处描述了 Github 上的romankh3帐户。这是非常重要的。假设 Spring 生态系统是com.springframework。这样你就可以区分原始项目和其他人的分支,或者仅仅通过项目名称的重合来区分。
  • artifaceId已经是该内存中描述的特定项目的名称。
  • version——该项目的版本。这里的一切都一目了然:添加了新功能,修复了旧功能,重构或进行了一些其他更改 - 增加了版本。
  • 打包- 这里我们描述Maven 应如何组装我们的项目。要么在罐子里,要么在战争里,或者其他一些地方
  • 名称- 这是一个更令人愉悦的项目名称。
还有一些东西不需要填写 - Maven 没有它们也能工作 - 但如果你需要发布库供公众使用,那么绝对值得添加它们。这些是什么东西?
  • • 项目存储库的路径,可以从其中下载

    <url>https://romankh3.github.io/image-comparison/</url>

  • • 分发此项目所依据的许可证。而且,可能不止一个,因此需要这样设置:

    <licenses>
     <license>
       <name>The Apache Software License, Version 2.0</name>
       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
     </license>
    </licenses>

  • • 有关创建/正在创建项目的开发人员的信息:

    <developers>
     <developer>
       <id>romankh3</id>
       <name>Roman Beskrovnyi</name>
       <email>roman.beskrovnyy@gmail.com</email>
     </developer>
    </developers>

  • • scm 块,描述如何访问项目:

    <scm>
    <connection>git@github.com:romankh3/image-comparison.git</connection>
    <developerConnection>git@github.com:romankh3/image-comparison.git</developerConnection>
     <url>https://github.com/romankh3/image-comparison</url>
    </scm>

描述完一般信息后,我们可以添加一个具有依赖关系的块:
<dependencies>
   <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>2.26.0</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
       <version>5.5.2</version>
       <scope>test</scope>
   </dependency>
<dependency>
   	<groupId>com.github.romankh3</groupId>
   	<artifactId>image-comparison</artifactId>
   	<version>4.3.0</version>
<scope>test</scope>
</dependency>
</dependencies>
这里我添加了两个库用于测试:它们总是需要的。您可能已经注意到,依赖项有一个 Scope - 范围。在我们的例子中,指定了测试,这意味着我们根本不会在主代码中看到这种依赖关系。接下来,为了让一切看起来很漂亮,您可以使用单独的标签来显示<properties/>版本:
<properties>
   <mockito.version>2.26.0</mockito.version>
   <junit.version>5.5.2</junit.version>
   <image.comparison.version>4.3.0</image.comparison.version>
</properties>
因此可以使用${PROPERTY_NAME}构造更新依赖项块:
<dependencies>
   <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>${mockito.version}</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
       <version>${junit.version}</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>com.github.romankh3</groupId>
       <artifactId>image-comparison</artifactId>
       <version>${image.comparison.version}</version>
       <scope>test</scope>
   </dependency>
</dependencies>
接下来是一个大的<build/>块,其中包含一个重要的<plugins/>块,您可以使用它自定义构建过程。您可以在<plugins/>块中添加一个或多个插件,如下所示:
<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
           <version>3.2.0</version>
           <executions>
               <execution>
                   <id>attach-sources</id>
                   <goals>
                       <goal>jar</goal>
                   </goals>
               </execution>
           </executions>
       </plugin>
   </plugins>
</build>
在这里你可以看到我添加了两个插件 - maven-source-pluginmaven-javadoc-plugin。每个插件都有可以设置的设置、属性(参数),从而自定义插件。未来这对我们来说会很有趣。现在,让我们记住并继续前进。与依赖项相同,我们将插件版本放入<properties/>中。在此基础上,您可以创建以下内存:
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0"
        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>com.github.javarushcommunity</groupId>
   <artifactId>maven-demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>Maven Demo Project</name>

   <url>https://github.com/javarushcommunity/maven-demo/</url>

   <properties>
       <mockito.version>2.26.0</mockito.version>
       <junit.version>5.5.2</junit.version>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <source.plugin.version>3.2.0</source.plugin.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
           <version>${mockito.version}</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.junit.jupiter</groupId>
           <artifactId>junit-jupiter-api</artifactId>
           <version>${junit.version}</version>
           <scope>test</scope>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-source-plugin</artifactId>
               <version>${source.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-sources</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>${javadoc.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-javadocs</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>
</project>

Maven 生命周期

Maven 有一个叫做 Maven 生命周期的东西。值得说的是,这是 Maven 可以执行的一组任务。除了maven生命周期之外,可能还有其他任务。这是关于什么的?有一组命令可以用来组装一个项目(再次构建,当然,是英文的描图纸,但没有这个就无处可去),删除 Maven 收集的构建,安装在 Maven 本地,这样你就可以在本地拉取项目作为依赖项,等等。现在让我们更详细地讨论一切。在写下我对这些团队的看法之前,我决定阅读他们在互联网上写的关于此事的内容……并意识到这很难描述。对于工作,对于初始工作,我们需要几个命令。让我们来描述一下它们:
  • 编译— 编译项目。这是第一阶段:在此期间您可以查看项目中是否存在任何编译错误。有时在IDEA中工作会出现各种跨越,这就是为什么编译问题出现在不应该存在的地方。所以这个命令会点所有的 i。
  • test - 运行在JUnit 上运行的所有测试,并且位于Maven 期望的位置(src/test/java是您的队长)。
  • package是下一个命令,它包括前面的两个命令:即首先在其中启动compile命令,然后将test命令发送到编译后的项目,如果这里一切正常,则开始创建存档(我们在<packaging/>中选择的存档))
  • install — когда мы устанавливаем Мавен на машину, у нас появляется локальный гит-репозиторий, в котором хранятся библиотеки, которые мы скачиваем для проектов. Но прелесть Мавена заключается еще и в том, что мы при помощи команды install можем добавить наш проект в локальный гит-репозиторий и локально использовать наш проект How зависимость. Не верите? Попробуйте :) Таким образом можно достаточно быстро посмотреть, How будет выглядеть ваш проект How зависимость у другого.
  • deploy — это венец всего, что было до этого. Команда, которая дарит возможность добавлять проект не только в локальный репозиторий How install, но и на удаленный, откуда каждый человек с доступом сможет использовать его How зависимость.
  • verify — команда, которая все проверит и скажет, готов ли проект к деплою.
  • clean — разумеется, скомпorрованные файлы и архив где-то должны храниться. Для этого у Мавена есть папка target. Это данные, которые проекту не нужны. И перед тем, How собирать проект заново, хорошо бы удалить все, что было до этого. Вот для этого и служит команда clean.

Maven Plugins

Хотел еще поговорить о pluginх, но статья и так уже вышла большая. Будет вам домашним заданием. Разберитесь, что это такое и How этим пользоваться. В продолжении статьи разберемся с Maven на практике.

Список всех материалов серии в начале этой статьи.

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION