gradle构建项目简单入门

gradleProject

搭建gradle项目步骤
官网文档地址:https://docs.gradle.org/current/userguide/userguide.html

Getting Started

1.Gradle核心内容

1.Gradle介绍

image-20240531134245746

  1. Project:类似模块划分
  2. Build Scripts:构建Project
  3. Dependency Management:依赖管理
  4. Tasks:(build.gradle)一个独立的工作单元,可以执行特定的操作,如编译代码、运行测试、打包应用程序等
  5. Plugins:扩展gradle的功能,并可以选择性的向项目插入Tasks
project structure

Gradle项目结构

  1. gradle wrapper:gradle wrapper、gradle和gradle.bat
  2. setting.gradle:项目关系,单个项目可以不需要,多个项目必须有
  3. build.gradle构建脚本
  4. src源码
build gradle

image-20240531135718546

# 安装gradle
gradle build

# gradle wrapper
gradlew build 		# linux
gradlew.bat build 	# windows
2.build.gradle

image-20240531141337018

2.Gradle Tutorial

1.命令行初始化项目
gradle init --type java-application  --dsl groovy

image-20240531143344793

image-20240531143356538

2.gradle tasks
# 查询<project>的依赖信息
./gradlew.bat :<project>:dependencies


IDEA新建gradle项目

image-20240531110355797

关联远程git仓库

image-20240531111247750

SpringBoot项目

  1. 指定SpringBoot的parent
buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://maven.aliyun.com/repository/public" // 使用aliyun仓库镜像
        }
    }
    // 相当于maven中parent的spring-boot版本
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.7.18")
    }
}

  1. dependencies依赖引入
dependencies {
        // 引入依赖的方式
        // implementation 声明在编译时需要但不需要暴露给使用此模块的编译器的依赖
        // compileOnly 声明只在编译时需要,但在运行时不需要的依赖,例如:lombok
        // runtimeOnly 声明只在运行时需要,但在编译时不需要的依赖,例如:JDBC驱动
        // testImplementation 声明只在测试编译和运行时需要的依赖
        // testCompileOnly 只在测试编译时需要的依赖,而在测试运行时不需要
        // testRuntimeOnly 测试运行时需要的依赖,而在测试编译时不需要
        // annotationProcessor 声明注解处理器的依赖,只在编译期间使用,生成代码或其他编译时工件
        // api 用于声明在编译时和运行时都需要的依赖,并且这些依赖对使用此模块的编译器是可见的
        // compileClasspath 配置用于定义编译时的类路径,但不会影响运行时的类路径
        // runtimeClasspath 配置用于定义运行时的类路径,但不会影响编译时的类路径
        // compile 在编译时和运行时都需要的依赖,并且这些依赖对使用此模块的编译器是可见的,已被implementation和api取代
        // runtime 声明了在运行时需要的依赖,已被runtimeOnly取代
        testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
        compileOnly('org.projectlombok:lombok:1.18.32')
        annotationProcessor 'org.projectlombok:lombok:1.18.32'
        testCompileOnly 'org.projectlombok:lombok:1.18.32'
        testAnnotationProcessor 'org.projectlombok:lombok:1.18.32'
}

  1. 项目构建build

image-20240603132452815

bootJar构建

SpringBoot插件提供的一个任务,用于生成可执行的Jar文件。有一下要求

  1. 这个模块中要有main方法
  2. 引入springboot相关的插件
// 这样引入,代码需要在bootJar的前面
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    archiveBaseName = 'gradleSpring' // jar名称
    archiveVersion = '0.1.0' // jar版本
}

自定义task
// root项目下的build.gradle配置
def buildProjectName = "app"
// 在app项目构建之后
// 将app/build/libs/app.jar复制到build/dev、build/test、build/prod
// 将app/build/dist/springBoot.sh复制到build/dev、build/test、build/prod
// 将app/build/dist/springBoot.bat复制到build/dev、build/test、build/prod ...
// 将app/build/dist/application-dev.yml复制到复制到build/dev;app/build/dist/application-test.yml复制到复制到build/test ...
// 将上面所复制的文件,文件名-dev、-test、-prod的替换成空串
task buildJar(dependsOn: buildProjectName + ':build') doLast {
    ["build/dev", "build/test", "build/prod"].each { dest ->
        copy {
            from buildProjectName + "/build/libs/" + buildProjectName + ".jar"
            into dest
            from buildProjectName + "/dist/springBoot.sh"
            into dest
            from buildProjectName + "/dist/springBoot.bat"
            into dest
            from buildProjectName + "/dist/startGatewayJavaFx.bat"
            into dest
            from(buildProjectName + "/dist/application-".concat(dest.replace('build/', '')).concat(".yml"))
            into dest
            rename { String fileName ->
                fileName.replace('-'.concat(dest.replace('build/', '')), '')
            }
        }
    }
    file(buildProjectName + "/build").deleteDir()
}

// root项目下的build.gradle配置
// 定义钩子函数,在任务完成之后执行
def jarName = "gradleProject.jar"
gradle.taskGraph.whenReady { taskGraph ->
    taskGraph.allTasks.each { task ->
        if (task.name == 'build') {
            task.doLast {
                // project.name == 'gradleProject' 这个放在外层 结果会是true
                if (project.name == 'gradleProject') {
                    println 'Build task finished, invoke task'
                    // 在这里添加你希望在构建后执行的代码

                    ["build/dev", "build/test", "build/prod"].each { dest ->
                        copy {
                            from "/build/libs/" + jarName
                            into dest
                            from "/dist/springBoot.sh"
                            into dest
                            from "/dist/springBoot.bat"
                            into dest
                            from "/dist/startGatewayJavaFx.bat"
                            into dest
                            from("/dist/application-".concat(dest.replace('build/', '')).concat(".yml"))
                            into dest
                            rename { String fileName ->
                                fileName.replace('-'.concat(dest.replace('build/', '')), '')
                            }
                        }
                    }
                }


            }
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2020长安杯

链接成功 检材一 1检材 1 的操作系统版本是 ()A. CentOS release 6.5 (Final)B. Ubuntu 16.04.3 LTSC. Debian GNU/ Linux 7.8 (wheezy)D. CentOS Linux release 7.6.1810 (Core)D 2检材 1 中&#xff0c;操作系统的内核版本是 ()(答案格式&#xff1a; “1.2.34” 数字和半角…

使用正则表达式分割字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 split()方法用于实现根据正则表达式分割字符串&#xff0c;并以列表的形式返回。其作用同字符串对象的split()方法类似&#xff0c;所不同的就是分割…

多校园在校跑腿小程序 代拿快递+寄取快递+外卖配送等 前后端分离带完整的安装代码包以及搭建教程

系统概述 该系统采用前后端分离的开发模式&#xff0c;后端采用稳定的服务器端架构&#xff0c;确保系统稳定、安全、高效地运行。前端则采用轻量级框架&#xff0c;兼容多平台、多设备&#xff0c;确保用户在不同场景下都能获得流畅的使用体验。同时&#xff0c;还提供了完整…

地理坐标系、投影坐标系、ECEF坐标系(地心地固坐标系)、ENU坐标系(站心坐标系)的区别

地理坐标系、投影坐标系、ECEF坐标系&#xff08;地心地固坐标系&#xff09;、ENU坐标系&#xff08;站心坐标系&#xff09;的区别 1、 地理坐标系1&#xff09;什么是地理坐标系2&#xff09;为什么引入地理坐标系3&#xff09;WGS84和CGCS2000的差别4&#xff09;缺陷5&…

扑克牌游戏

完整代码: #include <iostream>#include <string> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <time.h> #include <algorithm> using namespace std;class Playing_Card //扑克类 {//private: publi…

ERP系统源码:企业资源规划的技术实现与优化

ERP&#xff08;Enterprise Resource Planning&#xff0c;企业资源规划&#xff09;系统是一种集成管理软件&#xff0c;它将企业的所有业务流程&#xff0c;包括采购、生产、库存、销售、财务等集成在一起&#xff0c;实现信息共享和资源优化配置。本文将详细介绍ERP系统的技…

C++入门5——C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在…

【人工智能Ⅱ】实验9:强化学习Q-Learning算法

实验9&#xff1a;强化学习Q-Learning算法 一&#xff1a;实验目的 1&#xff1a;了解强化学习的基本概念。 2&#xff1a;学习强化学习经典算法——Q-Learing算法。 3&#xff1a;通过Q-Learing算法解决问题。 二&#xff1a;实验内容 2.1 强化学习 强化学习&#xff08;…

Pinia的介绍、使用及持久化

Pinia介绍 什么是Pinia&#xff1f; Pinia 是 Vue 的最新 状态管理工具&#xff0c;状态就是数据。 通俗地讲&#xff1a;Pinia 是一个插件&#xff0c;可以帮我们管理 vue 通用的数据 (多组件共享的数据)。 比如一份数据有多个组件需要使用&#xff0c;在学Pinia之前我们需…

nginx 中文文档

nginx 中文文档 中文文档

单枪匹马月入17万美元:数字游民Pieter Levels如何成就商业传奇

了解数字游民的应该都听说过 Pieter Levels&#xff0c;可以说他是数字游民的先驱人物。 他在推特上拥有超过43万的粉丝&#xff0c;仅凭一台笔记本电脑就连续建立了多个高盈利网站&#xff0c;光是推特主页上展示的比较新的几个网站&#xff0c;每月收入加起来就高达 17.6 万…

【机器学习】机器学习与大模型在人工智能领域的融合应用与性能优化新探索

文章目录 引言机器学习与大模型的基本概念机器学习概述监督学习无监督学习强化学习 大模型概述GPT-3BERTResNetTransformer 机器学习与大模型的融合应用自然语言处理文本生成文本分类机器翻译 图像识别自动驾驶医学影像分析 语音识别智能助手语音转文字 大模型性能优化的新探索…

解读信创产业根基,操作系统发展历程

信创产业根基之一操作系统 操作系统是一个关键的控制程序&#xff0c;负责协调、管理和控制计算机硬件和软件资源。作为硬件的首要软件扩展&#xff0c;它位于裸机与用户之间&#xff0c;充当了两者之间的桥梁。通过其核心程序&#xff0c;操作系统高效地管理着系统中的各类资源…

开山之作!Python数据与算法分析手册,登顶GitHub!

若把编写代码比作行军打仗&#xff0c;那么要想称霸沙场&#xff0c;不能仅靠手中的利刃&#xff0c;还需深谙兵法。 Python是一把利刃&#xff0c;数据结构与算法则是兵法。只有熟读兵法&#xff0c;才能使利刃所向披靡。只有洞彻数据结构与算法&#xff0c;才能真正精通Pyth…

营销方案撰写秘籍:包含内容全解析,让你的方案脱颖而出

做了十几年品牌&#xff0c;策划出身&#xff0c;混迹过几个知名广告公司&#xff0c;个人经验供楼主参考。 只要掌握以下这些营销策划案的要点&#xff0c;你就能制作出既全面又专业的策划案&#xff0c;让你的工作成果不仅得到同事的认可&#xff0c;更能赢得老板的赏识&…

Transgaga——人脸与猫脸之间互相转换算法解析

1. 概述 虽然pix2pix作为风格转换模型被提出&#xff0c;但它依赖于成对的数据集。与之相比&#xff0c;CycleGAN通过引入循环损失&#xff0c;实现了无需配对数据的风格转换。不过&#xff0c;CycleGAN在处理需要大幅几何变化的风格转换时表现不佳&#xff0c;仅在如马和斑马…

JAVA流程控制--增强for循环

1.JAVA5引入了一种主要用于数组或集合的增强型for循环 2.JAVA增强for循环语法格式如下&#xff1a; for(声明语句&#xff1a;表达式&#xff09; { //代码句子 } 3.声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型必须和数组元素的类型匹配。其作用域限定在循…

最新鸿蒙南北开发学习路线+学习资料分享

前言 5月29日&#xff0c;“千帆竞发启航 共筑鸿蒙生态”鸿蒙原生应用合作仪式在北京成功举办&#xff0c;近40个应用现场官宣启动鸿蒙原生应用开发。此次官宣启动开发的鸿蒙原生应用不仅包括教育、母婴、出行、医疗健康等多领域的知名应用&#xff0c;还有十多家企业内部办公应…

【C语言】位段(结构体实现位段)

目录 一、位段的定义 二、位段的声明 三、位段的内存分配 四、位段在内存中的存储方式 五、位段的优点 六、位段的跨平台问题 七、位段的应用 八、位段使用的注意事项 一、位段的定义 信息的存取一般以字节为单位。实际上&#xff0c;有时存储一个信息不必用一个或多个字…

参数高效微调PEFT(四)快速入门(IA)3

参数高效微调PEFT(四)快速入门(IA)3 我们已经了解了HuggingFace中peft库的几种高效微调方法。 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT(三)快速入门LoRA、AdaLoRA 今天我…