Maven讲解与命令解读

如何开始我的第一个Maven项目?

我们现在就开始创建你的第一个Maven项目!要创建我们的第一个Maven项目,我们将使用Maven原型机制。一个原型被定义为相同种类的所有其它项目均采用的一个原始模式或模型。在Maven中,原型是一个项目模板,它基于一些用户输入来生成一个针对用户需求的可工作的Maven项目。我们将告诉你原型机制如何工作,但如果您想了解更多关于原型的信息,请参阅原型介绍

现在创建第一个项目!为了创建最简单的Maven项目,在命令行中运行以下命令:

   mvn -B archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DgroupId=com.mycompany.app \
    -DartifactId=my-app

pom

pom.xml包含了这个项目的项目对象模型(POM)。在Maven中POM是基本工作单位。记住这很重要,因为Maven本质上是以项目为中心,所有东西都围绕着项目的理念。总之,POM包含了关于项目的所有重要信息,基本上可以一站式的找到关于项目的任何东西。理解POM是很重要的,新用户最好参考下POM介绍

这是一个非常简单的POM,但仍然显示了每个POM所包含的关键信息,所以让我们看看它们,来熟悉下POM的要点:

  • project 这是在所有pom.xml文件中最高层的元素
  • modelVersion 这个元素指定了这个POM使用了哪个版本的对象模型。模型本身的版本并不会经常改变但却是必需的,这是为了在Maven开发者认为需要改变模型时保证使用的稳定性。
  • groupId 这个元素指定了创建这个项目的组织或团队的唯一标识符。groupId是项目的关键标识符之一,而且通常基于你的组织的完整有效的域名。例如org.apache.maven.plugins就是为所有Maven插件指定的groupId。
  • artifactId 这个元素指定了这个项目生成的主要工件的唯一基本名。一个项目的主要工件通常是一个JAR文件。像代码包之类的次要工件也使用artifactId作为它们的最终名称的一部分。一个Maven生成的典型工件会有这样的形式:-. (例如, myapp-1.0.jar).
  • packaging 这个元素指定了这个工件的打包类型(如 JAR, WAR, EAR, 等)。这不仅意味着工件会生成JAR, WAR, 或者 EAR,而且也指定了构建过程的一部分所使用的一个特定生命周期。(生命周期是我们会在这篇指南中深入讨论的一个话题。现在,只用记住项目指定的打包类型在定制构建的生命周期时会产生作用。) 这个元素的默认值是JAR,所以大多数项目不用特意指定。
  • version 这个元素指定了项目生成的工件版本。Maven会在版本管理上长期帮助你,而且你将会在version中经常看到SNAPSHOT描述符,它指出这个项目正处于开发当中。我们将在这个指南中讨论Snapshot的用法和它们如何更有效。
  • name 这个元素指定了项目显示的名称。它经常被用于Maven生成的文档。
  • url 这个元素指定了哪里可以找到项目站点。它经常被用于Maven生成的文档。
  • description 这个元素提供了项目的基本描述。它经常被用于Maven生成的文档。

第一个项目原型生成后,你会发现创建好的下面的目录结构:

    my-app
    |-- pom.xml
    `-- src
        |-- main
        |   `-- java
        |       `-- com
        |           `-- mycompany
        |               `-- app
        |                   `-- App.java
        `-- test
            `-- java
                `-- com
                    `-- mycompany
                        `-- app
                            `-- AppTest.java

scope

Maven的依赖项scope有以下几种:

  1. compile:这是默认的范围。如果没有指定,那么依赖项将默认为此范围。对于编译,测试,运行三个阶段,该范围内的依赖项都是可用的。
  2. provided:这个范围的依赖项预期由JDK或容器提供。例如,Servlet API和JDBC API都是由Servlet容器提供的。在编译和测试阶段,这个范围内的依赖项是可用的,但在运行时则不可用。
  3. runtime:这个范围的依赖项只在运行时需要,而在编译和测试阶段则不需要。例如,JDBC驱动通常设置为这个范围。
  4. test:这个范围的依赖项只在测试阶段需要,而在编译和运行阶段则不需要。例如,JUnit通常设置为这个范围。
  5. system:这个范围的依赖项预期由系统提供,并且必须在没有Maven仓库的情况下可用。这是一个特殊范围,通常不建议使用。
  6. import:这个范围的依赖项用于导入依赖项的管理,通常在pom的dependencyManagement部分使用。这也是一个特殊范围,通常不建议在普通依赖项中使用。

mvn site

Maven的"site"命令可以生成项目的站点信息,包括各种文档和报告。执行该命令后,会在target/site目录下生成一个网站,可以通过任何web浏览器打开index.html文件来查看这个网站。

需要注意的是,mvn site是一个强大的工具,可以为开发团队提供有关项目的详细信息和各种报告,但需要花一些时间来仔细阅读和理解生成的报告。

mvn clean

mvn clean命令用于删除target文件夹,也就是删除所有生成的文件。这个命令通常在运行mvn package,mvn install或者mvn site等命令前执行,以确保项目的构建环境是干净的。当你重新运行mvn clean时,Maven会重新创建target文件夹。

mvn deploy

mvn deploy命令用于将项目的构建结果(如JAR、WAR等)部署到远程仓库,以便其他项目可以使用。Maven支持将构建结果部署到多种类型的仓库,如本地仓库、远程仓库或私有仓库。

部署的过程包括以下步骤:

  1. 首先,执行mvn package命令,将项目构建成可部署的格式(如JAR、WAR等)。
  2. 然后,执行mvn deploy命令,将构建结果部署到指定的远程仓库。

mvn deploy命令的配置信息通常位于项目的pom.xml文件中,包括要部署的文件、部署到的远程仓库地址以及部署的用户名和密码等信息。

需要注意的是,部署操作需要具有相应的权限才能执行。通常,只有项目的维护者或管理员才有权限执行部署操作。

总之,mvn deploy命令用于将项目的构建结果部署到远程仓库,以便其他项目可以使用。这是一个重要的步骤,确保项目的构建结果能够被其他项目方便地获取和使用。

mvn package

mvn package是Maven生命周期中的一个阶段,它主要用于将项目打包成可执行的JAR或WAR文件。

执行mvn package命令时,Maven会按照项目的构建配置,将编译后的class文件和资源文件打包成一个压缩文件,这个压缩文件的格式可以在pom.xml中进行配置,默认为JAR格式。对于web项目,一般配置为WAR格式。在执行mvn package命令的过程中,会自动执行先前的命令,例如mvn compile、mvn test-compile和mvn test。

在正常的情况下,执行完mvn package命令后,会在项目的target目录下生成一个以项目名称命名的压缩文件,例如my-project-1.0.0.jar或my-project-1.0.0.war。

以上内容仅供参考,如有任何疑问,请咨询Maven专业人士。

mvn install

mvn install命令用于将mvn package命令打包生成的文件安装到本地Maven仓库,以便其他项目可以使用。在执行mvn install命令时,Maven会将打包后的文件安装到默认的本地仓库中,通常位于用户主目录下的.m2/repository文件夹中。

对于项目的维护者和开发者来说,mvn install命令非常重要,因为它可以将项目构建后的结果保存到本地仓库中,以便其他项目可以直接使用这些构建结果而无需重新构建。此外,它还可以确保不同项目之间使用相同版本的的核心依赖,从而避免因版本不一致而引起的冲突问题。

需要注意的是,mvn install命令不会将项目依赖项安装到本地仓库中,只会将项目构建结果安装到本地仓库。如果项目依赖项没有在本地仓库中可用,需要手动将其安装到本地仓库中。

总之,mvn install命令用于将项目构建结果安装到本地Maven仓库,以便其他项目可以方便地使用这些构建结果。

mvn compile

mvn compile命令是Maven生命周期中的一个阶段,它用于将Java源代码编译为可执行的class文件。

在执行mvn compile命令时,Maven会按照项目的构建配置,将src/main/目录下的Java代码编译为.class文件,并将这些文件拷贝到target/classes/目录下。这个目录也是存放类文件的根目录,也叫做类路径。

同时,对于资源文件,如src/main/resources/目录下的文件,Maven也会将其拷贝到target/classes/目录中。

需要注意的是,mvn compile命令只会编译选定的目标,不管之前是否已经编译过,它会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件。

总的来说,mvn compile是Maven项目中非常重要的一条命令,它使得开发者可以专注于编码,而不需要手动进行代码编译。

···

  1. Mvn install最终会将打好的jar包放到哪个目录。

    Maven的install命令会将构建的jar文件安装到本地Maven仓库,通常是在你的用户目录下的.m2/repository目录。具体的路径可能会根据你的操作系统和配置有所不同。

  2. 如果再POM中定义了某个依赖的jar包,在我们公司的开发环境和配置下,maven会先后到哪些地方寻找这个包的文件。

    当你执行Maven构建并且在POM文件中定义了某个依赖的jar包时,Maven会按照以下顺序在以下位置寻找这个jar包:

    1. 本地仓库(Local Repository):Maven首先会在本地仓库中查找这个jar包。本地仓库默认的位置是在用户目录下的.m2/repository目录。如果在这个目录下找到了对应的jar包,Maven就会直接使用这个jar包。
    2. 远程仓库(Remote Repository):如果在本地仓库中没有找到对应的jar包,Maven会开始在远程仓库中查找。在POM文件中,你可以通过<repositories>标签来定义Maven应该搜索哪些远程仓库。如果你没有定义任何远程仓库,Maven会使用默认的中央仓库(Central Repository)。
    3. 中央仓库(Central Repository):中央仓库是Maven的默认远程仓库,它包含了大量的开源项目和jar包。如果你在POM文件中没有定义任何远程仓库,Maven会默认在中央仓库中查找jar包。
    4. 私服(Private Repository):如果你的公司有自己的Maven私服,你可以通过<repositories>标签来定义这个私服,以便让Maven在这里查找jar包。

    以上就是Maven寻找jar包的顺序和位置。如果在这个过程中Maven找到了对应的jar包,它就会下载并安装到本地仓库中,以便下次构建时使用。

  3. 对以下默认的基本生命周期按照执行顺序进行排序:validate,test,deploy,install,compile。

    尽管很难有一个详尽的列表,但列出的这些就是大多数被执行的通用的默认生命周期阶段。

    1. validate: 验证项目正确性以及所有需要的信息都可用
    2. compile: 编译项目的源码
    3. test: 使用合适的单元测试框架测试编译好的源码。这些测试不应该要求代码被打包或部署。
    4. package: 取得编译好的代码并打包成一个可发布的格式,例如JAR
    5. integration-test: 处理并部署包到可以运行集成测试的环境中
    6. verify: 运行所有的检查条件来验证包的有效性并满足质量标准。
    7. install: 把包安装到本地仓库,用来给本地的其它项目提供依赖
    8. deploy: 在集成或发布环境中完成,复制最终的包到远程仓库,共享给其它开发人员或项目。

    除了以上默认列表中的Maven生命周期,还有另外两个:

    • clean: 清除之前构建中生成的工件
    • site: 为项目生成站点文档

    生命周期的构建和它们的阶段依次是:

    • clean - pre-clean, clean, post-clean
    • default - validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy
    • site - pre-site, site, post-site, site-deploy
  4. 如果想发布一个snapshot 的包,但执行mvn deploy后发现pom中的版本号(如1.0)未加-snapshot,应如何补救。

    如果你想要发布一个SNAPSHOT版本的包,但是在执行mvn deploy后发现POM文件中的版本号(例如1.0)没有添加-SNAPSHOT后缀,你可以采取以下步骤来修复这个问题:

    1. 首先,你需要修改POM文件中的版本号,添加-SNAPSHOT后缀。例如,将<version>1.0</version>修改为<version>1.0-SNAPSHOT</version>
    2. 接下来,你需要在命令行中执行mvn clean命令来撤销之前的构建。
    3. 然后,再次执行mvn deploy命令以重新构建和发布你的项目。

    这样,Maven将会重新构建你的项目,并使用正确的SNAPSHOT版本号进行发布。

  5. 对于scope为provided的依赖项,需要如何提供需要的jar包。

    这个范围的依赖项预期由JDK或容器提供。例如,Servlet API和JDBC API都是由Servlet容器提供的。在编译和测试阶段,这个范围内的依赖项是可用的,但在运行时则不可用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值