实习的一点回顾Gradle

news2024/9/21 23:41:12

1 项目目录下执行 ./gradlew build,用.gradlew自动构建

首先有一个gradlew(linux)或者gradlew.bat(win)是用来检查java配置,环境配置之类的东西

然后去启动gradle/wrapper/gradle-wrapper.jar去检测本地gradle版本是否和配置文件gradle/wrapper/gradle-wrapper.properties中的一样,不一样则下载指定版本。

然后获取到gradle后,会根据build.gradle(类似maven的pom.xml配置库的文件)里的东西加载库。

我们的gradlew脚本去构建的指定版本的gradle
gradle/wrapper/gradle-wrapper.properties中的
distributionUrl=https\://mirrors.huaweicloud.com/gradle/gradle-6.9.1-bin.zip

以下是这个gradlew.bat脚本的主要功能和流程:

  1. 设置环境:脚本首先尝试确定 APP_HOME 目录,这个目录是脚本所在的路径。

  2. 检查 Java 环境:脚本会检查 JAVA_HOME 环境变量,如果没有设置,会尝试使用系统默认的 java 命令。如果找不到 Java,脚本会终止并提示错误。

  3. 设置 JVM 参数:脚本可以接受一些 JVM 参数,例如内存设置 (-Xmx64m-Xms64m)。这些参数可以通过 DEFAULT_JVM_OPTSJAVA_OPTSGRADLE_OPTS 变量来配置。

  4. 处理文件描述符:在某些系统上,脚本会尝试增加最大文件描述符的数量,以提高系统的性能。

  5. OS 特定处理:脚本会根据不同的操作系统做一些特定处理。例如,针对 macOS,脚本会设置应用程序的名称和图标。

  6. 启动 Gradle:最终,脚本会执行 java 命令,运行 org.gradle.wrapper.GradleWrapperMain 类,这个类是 Gradle Wrapper 的核心,它会下载并启动指定版本的 Gradle,并根据项目的 build.gradle 文件执行构建任务。

总结来说,当你运行 ./gradlew 时,这个脚本会确保你的系统上有合适的 Java 环境,配置必要的参数,并启动 Gradle 构建工具来执行你在项目中定义的任务。

Gradle Wrapper 是什么?

Gradle Wrapper 是 Gradle 提供的一种机制,允许项目团队在不同的开发环境中使用一致的 Gradle 版本。它包含几个文件:

  1. gradlewgradlew.bat:用于在类 Unix 系统和 Windows 上启动 Gradle 的脚本文件。
  2. gradle/wrapper/gradle-wrapper.jar:包含 Gradle Wrapper 的 Java 类,用于下载并启动指定版本的 Gradle。
  3. gradle/wrapper/gradle-wrapper.properties:配置文件,用于指定要使用的 Gradle 版本和下载地址。

使用 gradlew 的意义

  1. 一致性:通过 gradlew,项目确保所有开发者使用相同版本的 Gradle,而不依赖于系统上已经安装的 Gradle。这避免了由于 Gradle 版本不一致导致的构建问题。

  2. 简便性:新加入项目的开发者不需要手动安装 Gradle,只需要运行 ./gradlew build,Gradle Wrapper 会自动下载并使用正确版本的 Gradle。

  3. 自动化:在 CI/CD 环境中,通过 gradlew,可以保证构建环境始终使用项目指定的 Gradle 版本,而不需要对构建环境进行额外配置。

Gradle Wrapper (gradlew) 启动流程

Gradle Wrapper (gradlewgradlew.bat) 是一个工具,确保你使用的 Gradle 版本与项目定义的一致。以下是 gradlew 启动的主要流程:

  1. 执行 gradlew 脚本

    • 当你运行 ./gradlew 命令时,操作系统会调用 gradlew 脚本文件(在类 Unix 系统中是一个 Shell 脚本,在 Windows 中是一个批处理文件 gradlew.bat)(我们两个都有)。
  2. 设置环境

    • 脚本会解析和设置运行 Gradle 所需的环境,包括确定脚本的位置,设置 JVM 参数,处理系统特定的配置(如路径转换)。
  3. 检查和下载 Gradle

    • 脚本会检查本地(business-directory/gradle/wrapper下)是否已经存在 gradle-wrapper.jar (用来下载和加载指定版本gradle的包)和指定版本的 Gradle。如果不存在,它会下载指定版本的 Gradle 分发包(由 gradle-wrapper.properties (配置文件,配置需要的版本和配置)文件中的 distributionUrl 定义)。
  4. 运行 Gradle

    • 下载完成后,脚本会运行 gradle-wrapper.jar,该文件启动指定版本的 Gradle 并执行实际的构建任务。
  5. 执行构建任务

    • Gradle 启动后,它会根据 build.gradle 文件中的定义来执行构建任务,如编译代码、运行测试、打包等。

2.gradle和maven

与 Maven 的不同

Gradle 和 Maven 是两个不同的构建工具,它们在设计理念、功能和使用方式上有一些主要区别:

  1. 构建脚本语言

    • Gradle:使用 Groovy 或 Kotlin DSL 编写构建脚本(build.gradlebuild.gradle.kts)。这种方式更加灵活和可编程。(有点类似于java类里定义属性那个样子)
    • Maven:使用 XML 编写构建配置(pom.xml)。XML 格式结构化清晰,但不如编程语言灵活。(尖括号一层层包裹,类似html5那种,可读性不好)
      这个 build.gradle 文件配置了一个复杂的项目构建过程,包括:
      
      应用插件。
      配置了运行时和测试时的依赖。
      排除和强制使用特定版本的依赖。
      定义了源集和编译任务的依赖。
      配置了编译器的选项。
      
      
      plugins {
          id 'java'
      插件用于扩展 Gradle 的功能,通常包含了构建、编译、测试等方面的配置。
      }
      
      group = 'com.example'
      version = '1.0.0'
      
      repositories {
          mavenCentral()
      }
      
      dependencies {
          implementation 'org.springframework.boot:spring-boot-starter'    项目要用的依赖,三方库和其他子项目的功能
          testImplementation 'junit:junit:4.13.2'  做测试框架的依赖比如junit,mockito,testng
      }
      
      tasks.register('customTask') {
          doLast {
              println 'This is a custom task.'
          }
      }
      
      //配置排除路径,防止冲突
      configurations {
          implementation.exclude module: "infra-auth-hub-public-javaclient"
          implementation.exclude module: "infra-audit-trail-public-javaclient"
      }
      //确保使用指定版本的库
      configurations.all {
          resolutionStrategy {
              force 'com.google.guava:guava:32.0.1-jre'
          }
      }
      
  2. <project>
        <dependencies>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>example-lib</artifactId>
                <version>1.0.0</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    构建逻辑:

    • Maven: 使用生命周期(如 compile, test, package 等)来定义构建过程,生命周期是预定义的,步骤之间的顺序由 Maven 确定。Maven 构建生命周期 | 菜鸟教程 (runoob.com)
    • Gradle: 使用任务(tasks)和任务依赖(task dependencies)来定义构建过程,任务可以自定义,并且可以按需执行,构建过程更具灵活性。
  3. 配置方式:

    • Maven: 配置是静态的,所有的依赖和插件都在 pom.xml 文件中定义。
    • Gradle: 允许动态配置和编程式配置,可以在构建脚本中编写逻辑来处理复杂的构建需求。
  4. 构建缓存和增量构建:

    • Maven: 没有内置的增量构建支持,通常需要重新构建所有内容。
    • Gradle: 提供了增量构建和构建缓存,能够更智能地决定哪些部分需要重新构建,从而提高构建效率。

        5.maven要指定artifactId项目号,gradle不需要,它通过分组和版本来标识。

        6.gradle有tasks,maven没有

  • Maven: Maven 的核心概念是“生命周期”(Lifecycle),包括 compiletestpackage 等阶段。每个阶段会执行一组预定义的插件任务。这些生命周期和阶段使得 Maven 的构建过程更加固定和线性。Maven 主要通过插件来执行具体的任务,插件的配置在 pom.xml 中进行。

  • Gradle: Gradle 提供了更加灵活的任务系统。你可以定义任意数量的任务,并且可以控制任务的执行顺序和条件。Gradle 使用 tasks 来定义和管理这些任务。例如:

  • tasks.register('hello') {
        doLast {
            println 'Hello, world!'
        }
    }
    

    在这个示例中,hello 是一个自定义任务,它在构建过程中可以被执行。Gradle 的任务系统允许你创建复杂的任务依赖和执行逻辑,这使得 Gradle 在处理复杂构建过程时更为灵活。

3.常用属性

在 Maven 和 Gradle 中,有一些常用的属性和配置选项,用于定义和管理构建过程。以下是一些常见的属性及其意义:

Maven 常用属性

  1. groupId

    • 意义: 定义项目的组 ID,通常是组织或公司的唯一标识符。
    • 示例: <groupId>com.example</groupId>
  2. artifactId

    • 意义: 定义项目的唯一 ID,通常是项目的名称或模块的名称。
    • 示例: <artifactId>my-app</artifactId>
  3. version

    • 意义: 定义项目的版本号,用于标识不同版本的发布。
    • 示例: <version>1.0.0</version>
  4. packaging

    • 意义: 定义项目的打包方式,例如 JAR、WAR、POM 等。
    • 示例: <packaging>jar</packaging>
  5. dependencies

    • 意义: 定义项目所需的外部依赖,包括其坐标(groupId, artifactId, version)。
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.10</version>
    </dependency>
</dependencies>

6repositories

  • 意义: 定义项目的依赖库所在的仓库地址。
​
<repositories>
    <repository>
        <id>central</id>
        <url>https://repo1.maven.org/maven2</url>
    </repository>
</repositories>

​

7plugins

  • 意义: 定义项目使用的插件及其配置,插件用于扩展构建功能。
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Gradle 常用属性

  1. group

    • 意义: 定义项目的组 ID,类似于 Maven 的 groupId
    • 示例: group = 'com.example'
  2. version

    • 意义: 定义项目的版本号,类似于 Maven 的 version
    • 示例: version = '1.0.0'
  3. sourceCompatibility

    • 意义: 定义 Java 源代码的兼容版本。
    • 示例: sourceCompatibility = '1.8'
  4. targetCompatibility

    • 意义: 定义生成的字节码的兼容版本。
    • 示例: targetCompatibility = '1.8'
  5. repositories

    • 意义: 定义项目的依赖库所在的仓库地址。
repositories {
    mavenCentral()
    maven { url 'https://repo1.maven.org/maven2' }
}

在 Maven 和 Gradle 中,有一些常用的属性和配置选项,用于定义和管理构建过程。以下是一些常见的属性及其意义:

Maven 常用属性

  1. groupId

    • 意义: 定义项目的组 ID,通常是组织或公司的唯一标识符。
    • 示例: <groupId>com.example</groupId>
  2. artifactId

    • 意义: 定义项目的唯一 ID,通常是项目的名称或模块的名称。
    • 示例: <artifactId>my-app</artifactId>
  3. version

    • 意义: 定义项目的版本号,用于标识不同版本的发布。
    • 示例: <version>1.0.0</version>
  4. packaging

    • 意义: 定义项目的打包方式,例如 JAR、WAR、POM 等。
    • 示例: <packaging>jar</packaging>
  5. dependencies

    • 意义: 定义项目所需的外部依赖,包括其坐标(groupId, artifactId, version)。
    • 示例:
       xml 

      复制代码

      <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.10</version> </dependency> </dependencies>

  6. repositories

    • 意义: 定义项目的依赖库所在的仓库地址。
    • 示例:
       xml 

      复制代码

      <repositories> <repository> <id>central</id> <url>https://repo1.maven.org/maven2</url> </repository> </repositories>

  7. plugins

    • 意义: 定义项目使用的插件及其配置,插件用于扩展构建功能。
    • 示例:
       xml 

      复制代码

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

Gradle 常用属性

  1. group

    • 意义: 定义项目的组 ID,类似于 Maven 的 groupId
    • 示例: group = 'com.example'
  2. version

    • 意义: 定义项目的版本号,类似于 Maven 的 version
    • 示例: version = '1.0.0'
  3. sourceCompatibility

    • 意义: 定义 Java 源代码的兼容版本。
    • 示例: sourceCompatibility = '1.8'
  4. targetCompatibility

    • 意义: 定义生成的字节码的兼容版本。
    • 示例: targetCompatibility = '1.8'
  5. repositories

    • 意义: 定义项目的依赖库所在的仓库地址。
    • 示例:
       
      repositories {
          mavenCentral()
          maven { url 'https://repo1.maven.org/maven2' }
      }
      

  6. dependencies

    • 意义: 定义项目所需的外部依赖。
dependencies {
    implementation 'org.springframework:spring-core:5.3.10'
}

7plugins

  • 意义: 定义项目使用的插件及其配置,插件用于扩展构建功能。
plugins {
    id 'java'
    id 'application'
}

8tasks

  • 意义: 定义和配置构建任务。
tasks.register('hello') {
    doLast {
        println 'Hello, world!'
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Google Play版】bilibili 3.19.2最新国际版(如何鉴别是否官方?)

相信玩 B 站的小伙伴也不少&#xff0c;国内版确实太臃肿了&#xff0c;已经“变质”了。 这是主界面&#xff0c;我没有做任何设置&#xff0c;刚装好就是这样&#xff1a; 摘自 Play 最新的评论&#xff1a; “3.19非常好&#xff0c;解决了我之前两个痛点。一是首页的自动…

基于PCA-SVM的人脸识别系统(MATLAB GUI)

matlab人脸识别系统(GUI),PCASVM方法 源码详细注释以及适配于本系统的5k字的理论资料&#xff08;方便学习&#xff09; GUI里的人脸识别算法&#xff1a;PCA-SVM 功能&#xff1a;利用ORL数据库&#xff0c;进行训练&#xff0c;测试&#xff0c;并可对单张图片进行识别 两个界…

ArrayList的详细使用教程

ArrayList实现了List接口&#xff0c;是顺序容器&#xff0c;即元素存放的数据与放进去的顺序相同&#xff0c;允许放入null元素&#xff0c;底层通过数组实现。除该类未实现同步外&#xff0c;其余跟Vector大致相同。每个ArrayList都有一个容量(capacity)&#xff0c;表示底层…

vscode写markdown(引入html及css语法)

vscode写markdown 下载插件插入代码markdown中引入html和css语法导出pdf 下载插件 Markdown All in OneMarkdown Preview EnhancedPaste Image 插入代码 afdfafamarkdown中引入html和css语法 呵呵 用ctrlshiftp 搜索"Markdown Preview Enhanced:Customize CSS"在…

个人旅游网(2)——功能详解——用户登录注册

文章目录 一、用户登录1.1、接口详解1.1.1、isLogged (判断用户是否登录)1.1.2、find-by-telephone&#xff08;输入手机号时校验手机号是否注册&#xff09;1.1.3、send-message&#xff08;发送验证码&#xff09;1.1.4、login-by-telephone&#xff08;登录按钮&#xff09;…

Guarded Suspension 保护性暂定模式 以及嵌套死锁问题

多线程交互时&#xff0c;满足条件才去执行&#xff0c;否则阻塞一直到满足条件。当然可以用wait/notify实现。 本文用JUC包下的reentrantlock和其条件变量来完成。 文章目录 首先定义Predicate 和GuardAction&#xff1b;然后定义Blocker如何使用完整代码如下嵌套死锁问题 首…

PWMI模式测频率占空比

开启时钟 GPIO 时基单元 输入捕获初始化部分 配置两个IC通道同时捕获同一个引脚的模式 //快捷将电路配置成PWMI标准的标准结构&#xff0c;只支持通道1、2不支持3、4 //只需要传入一个通道的函数&#xff0c;此函数同时会把另一个通道配置为相反的配置&#xff0c;实现PWMI…

python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存及转存关于OSI的七层模型和TCP/IP四层模型

一、python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存 做一个简单的事&#xff1a;使用python读取一个txt文件&#xff0c;里面存储着N行用户id&#xff0c;需要一行行读取后再读取另一个存储用户昵称的txt文件&#xff0c;判断昵称是否有重复&am…

已知一个有序表为(13,18,24,35,47,50,62,83,90,115,134),当二分检索值为90的元素时,检索成功需比较的次数是( )。A.1

已知一个有序表为&#xff08;13&#xff0c;18&#xff0c;24&#xff0c;35&#xff0c;47&#xff0c;50&#xff0c;62&#xff0c;83&#xff0c;90&#xff0c;115&#xff0c;134&#xff09;&#xff0c;当二分检索值为90的元素时&#xff0c;检索成功需比较的次数是&a…

【Python系列】text二进制方式写入文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C++笔记---模板初阶

1. 初识模板 模板是什么 模板就是一种通用的模型&#xff0c;只要我们给出模板&#xff0c;编译器就可以自动帮助我们自动生成函数或类。 模板又分为函数模板和类模板。 模板的意义 我们在使用函数重载的过程中&#xff0c;常常会遇见下面的情况&#xff1a; void Swap(i…

业务资源管理模式语言03

示例&#xff1a; 图3 表示了IdentifyTheResource 模式的实例&#xff0c;其中“Product”扮演“Resource”角色。 图3 ——IdentifyTheResource 模式的实例 下一个模式&#xff1a; 完成IdentifyTheResource&#xff0c;下一个模式是QualifyTheResource&#xff08;2&#…

使用 nuxi clean 命令清理 Nuxt 项目

title: 使用 nuxi clean 命令清理 Nuxt 项目 date: 2024/9/1 updated: 2024/9/1 author: cmdragon excerpt: nuxi clean 命令是管理和维护 Nuxt 项目的重要工具,它帮助你快速清理生成的文件和缓存,确保开发环境的干净。通过定期使用这个命令,你可以避免由于缓存或生成文件…

python 天气与股票的关系--第3部分,建立模型

起因(目的): 继续瞎折腾。 过程: 假设有下面这些规则: 天气中的温度&#xff0c; 如果最高温度大于 36&#xff0c; 那么就是坏天气。如果最低温度小于 5&#xff0c; 那么也是坏天气。如果下雨, 下雪&#xff0c; 那么也是坏天气。其他情况为 好天气 import pandas as pd…

AVL树建立

AVL树是在二叉搜索树基础上实现的&#xff0c;与二叉搜索树不同的是&#xff0c;AVL树的左右子树高度相差不超过1. AVL树的旋转 大致分为四类&#xff1a; 单旋&#xff1a; 左左——右旋&#xff1a;使平衡因子为-2的父节点与左子树相连&#xff0c;该节点的左节点与左孩子…

spring boot 项目 prometheus 自定义指标收集和 grafana 查询--方法耗时分位数指标

auth author JellyfishMIX - github / blog.jellyfishmix.comLICENSE LICENSE-2.0 说明 网上有很多 promehteus 和 grafana 配置&#xff0c;本文不再重复&#xff0c;只介绍自定义部分。目前只介绍了分位数指标的收集和查询&#xff0c;常用于方法耗时的指标监控。 自定义…

Python函数(进程和线程)

Python基础语法文章导航&#xff1a; Python基础&#xff08;01初识数据类型&变量&#xff09;Python基础&#xff08;02条件&循环语句&#xff09;Python基础&#xff08;03字符串格式化&运算符&进制&编码&#xff09;Python基础&#xff08;04 基础练习…

【媒体人必备】免费的 AI 配音神器,还有黑神话悟空的配音

【媒体人必备】免费的 AI 配音神器&#xff0c;还有黑神话悟空的配音 在短视频风靡全球的时代&#xff0c;TikTokVoice 提供了一个功能强大、操作简单的在线文字转语音工具&#xff0c;支持多种语言和热门AI配音角色。本文将带你了解这个工具的独特之处&#xff0c;以及如何利用…

【计算机组成原理】计算机系统的层次结构——计算机软件

计算机系统的层次结构 导读一、计算机软件的分类二、计算机语言三、计算机系统的层次结构3.1 从计算机语言的角度来理解多级层次结构3.2 计算机层次之间的关系3.3 指令集体系结构&#xff08;ISA&#xff09; 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&a…

Redis(13)| 主从复制

关键词&#xff1a;主从复制&#xff0c;主从数据一致性&#xff0c;同步 带着问题阅读 主从复制解决了什么问题&#xff1f;主从复制的原理&#xff08;过程&#xff09;是什么&#xff1f;主从切换时是如何减少数据丢失的 前言 我在前已经给大家图解了 AOF 和 RDB&#x…