你竟然没用 Maven 构建项目?(下)

简介: 一年前,当我和小伙伴小龙一起做一个外包项目的时候,受到了严重的鄙视。我那时候还不知道 Maven,所以搭建项目用的还是最原始的方式,小龙不得已在导入项目的时候花了很长时间去下载项目依赖的开源类库。出于对我的尊重,小龙没有破口大骂,而是非常委婉地说了一句:“二哥,你好歹也有一定的知名度了,竟然没用 Maven 构建项目,真让我大开眼界啊。”作为一名富有上进心的程序员,不能忍啊。借此机会,有必要隆重地向大家介绍一下 Maven 了。

2)变量配置信息

pom.xml 文件的第二部分通常用来配置一些变量信息。

<properties>
    <spring.version>5.1.5.RELEASE</spring.version>
</properties>

有了变量的配置信息后,可以通过 ${spring.version} 的形式来调用这些配置项。这样做的好处显而易见,当依赖项的版本升级的时候,可以直接修改变量值即可。

3)依赖管理

阿里云的 Maven 仓库下有各种各样的第三方类库,换句话说就是,只有你想不到的,没有你找不到的。大多数 Maven 项目的依赖项列表都会很长很长,为了便于说明,下面我只列出某些具有特色的。

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

①、上文中曾提到,<groupId><artifactId><version> 合起来可以准确地定位一个依赖项。那怎么找到想要的依赖项呢?

第一步,进入 MavenRepository 网站,地址如下:

http://mvnrepository.com

然后在搜索框中输入第三方类库的关键字,比如说「spring-core」,点击「search」按钮,可以查看到该类库的链接导航。

第二步,点击链接进入到「spring-core」的主页,可以看到所有版本的「spring-core」,选择一个使用率最高的。使用率高在一定程度上表明这个版本的类库最稳定,它已经得到了广大程序员的认可。

第三步,进入该版本的主页,只需要左键轻轻地在 「Maven」选项卡内点一下,就已经把该类库的 Maven 依赖信息复制到粘贴板了(不需要「Ctrl+C」,非常的人性化),如下图所示。

26.jpg

第四步,将类库的依赖信息粘贴到 pom.xml 文件的 <dependencies> 节点下,然后按下快捷键「Ctrl+S」保存。紧接着,依次展开 test → Java Resources → Libraries → Maven Dependencies 节点,你可以看到该类库已经悄悄地添加进来了。

②、 <exclusions> 主要用于排除依赖。

有时候,我们引入的依赖中可能会包含一些不想要的依赖包,我们想引入自己想要的,这时候就要用到排除依赖了。

使用 <exclusion> 的时候只需要指定 groupId 和 artifactId 就行了,并不需要 version,这是因为 groupId 和 artifactId 就可以定位某种类型的依赖。

③、 <scope> 用来控制依赖的范围。

test:测试依赖范围。典型的例子是 Jnuit,它只有在编译测试代码及运行测试的时候才需要。

compile:编译依赖范围(其实不止是编译,对测试、运行同样有效),缺省项,如果没有指定,就会默认使用该依赖范围。

provided:提供依赖范围。对编译和测试有效,但在运行时候无效。

runtime:运行时依赖范围。对测试和运行有效,但在编译时无效。

PS:如果不知道选哪一种,缺省就对了。

4)构建配置

<build> 元素中包含了执行 Maven 构建周期目标所需的插件以及相关的配置。

<build>
       <finalName>test</finalName>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>2.3.2</version>
               <configuration>
                   <source>${jdk.version}</source>
                   <target>${jdk.version}</target>
               </configuration>
           </plugin>
       </plugins>
       <resources>
           <resource>
               <directory>src/main/java</directory>
               <includes>
                   <include>**/*.xml</include>
               </includes>
           </resource>
       </resources>
</build>

①、<finalName>,打成 jar 包或者 war 包时的名称。上文中曾提到,项目打包后的输出目录为 ${basedir}/target

②、<plugins> 用于指定项目在构建过程中使用的插件。

  • <groupId><artifactId><version> 用于确定使用的插件。
  • configuration,该插件所需要的特殊配置。Maven 3 默认使用的是 JDK 1.5,本例中我们使用了 JDK 1.8。

③、<resources> 描述了各个资源在 Maven 项目中的具体路径。

  • <directory>,资源文件的路径,默认位于 ${basedir}/src/main/resources/ 目录下。
  • includes,用于指定在构建过程中被处理的资源文件;对应 excludes 用于省去不被处理的资源文件。

05、使用 Maven 对项目进行清理、编译、测试、打包

1)清理:mvn clean,该命令会删除 target 目录。可以直接在命令行中执行该命令,只需要切换到项目所在的路径下即可。

27.jpg

2)编译:mvn complie,该命令会编译 src/main/java 目录下的源码。同时,Maven 还会处理在 src/main/resources 目录下的资源文件,确保它们作为编译的一部分。

28.jpg

不过,很遗憾的是,执行该命令会报错。该命令给出的提示是,查看 [Help 1] 给出的地址,我尝试了一下,可以将 mvn complie 命令替换为 mvn compiler:compile 命令执行,结果如下图所示。

30.jpg

编译后可以在 target 目录下查看字节码文件。

3)测试:mvn test,test 命令在运行时,会执行 compile 命令;而之前我们已经执行过一次 compile 命令,为了确保结果的准确性,可以执行 mvn clean test 命令确保测试之前没有残余物,结果如下图所示。

31.jpg

Maven 会通过 Surefire 插件,使用 pom.xml 文件中的测试提供者(通常是 Junit)运行测试。执行 test 命令不仅会运行测试,还会产生报告文件,此时 target 目录下的截图如下:

32.jpg

4)打包:mvn install,该命令会按照 pom.xml 文件中 <packaging> 指定的方式(本例为 jar)对编译结果打包。同时,还会把打包好的文件放到本地的 Maven 仓库中,以便其他项目把它当做依赖项使用。命令执行结果如下图所示。

33.jpg

查看本地的 Maven 仓库,可以看到刚刚打包好的文件。

34.png

06、最后

在 Maven 出现之前,流行的构建工具是 Ant;在 Maven 出现之后,还有一种新兴的构建工具 Gradle,它有意选择了和 Maven 相反的原则,不会强制使用者遵循刻板的构建周期。

总之,Maven 是一款优秀的构建工具,Java 项目的开发者很有必要熟练地掌握它。


相关文章
|
1天前
|
Java jenkins 持续交付
Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试
【7月更文挑战第1天】Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试。成功后,Jenkins执行部署任务,发布到服务器或云环境。使用Jenkins能提升效率,保证软件质量,加速上线,并需维护其稳定运行。
11 0
|
2天前
|
Java 测试技术 Maven
Maven 构建生命周期
Maven的构建生命周期包括Clean、Default和Site三个阶段,用于项目构建、清理和文档生成。Default生命周期中的validate、compile、test、package、verify、install和deploy步骤依次执行,完成从验证到部署的全过程。插件目标如`dependency:copy-dependencies`可独立于构建阶段调用,如`mvn clean dependency:copy-dependencies package`先清理、复制依赖,再打包。
|
2天前
|
Java Maven
Maven 自动化构建
**Maven自动化构建确保依赖稳定性。当bus-core-api(1.0-SNAPSHOT)构建完成后,app-web-ui和app-desktop-ui这两个依赖它的项目自动触发构建,维持版本协调。**
|
3天前
|
Java Shell Apache
Maven 项目文档
使用 Maven 创建 `consumerBanking` 项目,命令行输入: ```sh mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false ``` 确保 `pom.xml` 包含最新 `maven-site-plugin`(v3.3+)和 `maven-project-info-reports-plugin`(v2.7+)
|
4天前
|
数据可视化 Java Apache
Maven Dependency Tree:深入理解你的项目依赖
Maven Dependency Tree:深入理解你的项目依赖
20 0
|
5天前
|
Java 测试技术 Maven
Maven 构建生命周期
Maven生命周期包括Clean(clean)、Default(validate, compile, test, package, verify, install, deploy)和Site(site, deploy-site)。Clean清除编译输出,Default处理验证、编译、测试、打包、检查、安装和部署,Site生成项目文档。阶段按序执行,插件目标如dependency:copy-dependencies可独立调用。例如,`mvn clean dependency:copy-dependencies package`先执行清理,然后复制依赖,最后打包。
|
5天前
|
Java Maven
Maven 自动化构建
**Maven自动化构建确保依赖稳定性**:当`bus-core-api`构建完成后,`app-web-ui`和`app-desktop-ui`这两个依赖它的项目自动构建。`app-web-ui`引用`bus-core-api`的1.0-SNAPSHOT,同样`app-desktop-ui`也依赖相同的版本。
|
5天前
|
XML Java Maven
Maven 构建配置文件
Maven构建配置文件用于定制构建,默认值可通过pom.xml中的profiles或activeProfiles调整,适应不同环境如生产和开发。配置文件分项目级、用户级和全局级。激活方式包括命令行、Maven设置、环境变量、操作系统设置及文件存在。示例中,env.properties为基础配置,env.test.properties和env.prod.properties对应测试和生产环境。AntRun插件常用于生命周期绑定,但与配置文件功能本身无关。
|
5天前
|
Java 测试技术 Maven
Maven打包使用多线程加速构建过程
Maven打包使用多线程加速构建过程
30 0
|
5天前
|
Java Maven
Maven如何创建Maven web项目
Maven如何创建Maven web项目