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 destfrom buildProjectName + "/dist/springBoot.sh"into destfrom buildProjectName + "/dist/springBoot.bat"into destfrom buildProjectName + "/dist/startGatewayJavaFx.bat"into destfrom(buildProjectName + "/dist/application-".concat(dest.replace('build/', '')).concat(".yml"))into destrename { 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' 这个放在外层 结果会是trueif (project.name == 'gradleProject') {println 'Build task finished, invoke task'// 在这里添加你希望在构建后执行的代码["build/dev", "build/test", "build/prod"].each { dest ->copy {from "/build/libs/" + jarNameinto destfrom "/dist/springBoot.sh"into destfrom "/dist/springBoot.bat"into destfrom "/dist/startGatewayJavaFx.bat"into destfrom("/dist/application-".concat(dest.replace('build/', '')).concat(".yml"))into destrename { String fileName ->fileName.replace('-'.concat(dest.replace('build/', '')), '')}}}}}}}
}

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

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

相关文章

多线程新手村5--线程池

1.1 线程池是什么 线程诞生的意义是因为进程的创建/销毁开销太大&#xff0c;所以使用线程提高代码的执行效率&#xff1b;那如果想要进一步提升执行效率&#xff0c;该怎么办呢&#xff1f;有一个方法是使用线程池。 首先&#xff0c;什么是线程池&#xff1a;池就是池子&am…

Vue——样式绑定的几种方式

文章目录 前言往期回顾绑定对象绑定对象的另一种写法绑定数组数组与对象的嵌套 前言 样式绑定在vue中属于一种很常见的操作。在之前博客中针对样式的绑定操作&#xff0c;介绍了一个指令v-bind。缩写为:xxx。 vue 官网 样式绑定 往期回顾 先简单回顾下最开始绑定标签样式的操…

vue3_组件间通信方式

目录 一、父子通信 1.父传子&#xff08; defineProps&#xff09; 2.父传子&#xff08;useAttrs&#xff09; 3.子传父&#xff08;ref&#xff0c;defineExpose &#xff09; 4.子传父&#xff08;defineEmits&#xff09; 5.子传父&#xff08;v-model&#xff09; …

车载测试面试题专题 - 如何测试蓝牙电话功能

现代车载系统中&#xff0c;蓝牙电话功能已经成为了一个必不可少的功能。它不仅提高了驾驶安全性&#xff0c;还提供了极大的便利性。作为车载行业的测试人员&#xff0c;如何全面、有效地测试车载蓝牙电话功能是我们工作的重要部分。因此在车载测试的面试过程中&#xff0c;蓝…

k8s怎么监听自定义资源的变更?(1)

这里我们通过 k8s的 code-generate来生成操作自定义资源的代码来监听变更 第一步下载工具 下载安装 k8s code-generate 查看我们的k8s版本 kubectl get node 输出结果为 可以看到我们的k8s版本为 v1.22.0 所以此时我们要下载与之对应的版本的code-generate git clone htt…

深入解析 Web 开发中的强缓存与协商缓存机制

在 Web 开发中,缓存机制是提高页面加载速度和用户体验的重要技术。缓存分为两种主要类型:强缓存和协商缓存。本文将详细介绍这两种缓存机制的原理、实现方式及其区别,并演示如何在 <meta> 元素中和 Nginx 服务器中进行缓存控制。 强缓存 强缓存(Strong Caching)是指…

iPhone的5G设置怎么更改吗?设置好这些能够优化电池的使用寿命

随着5G技术的普及&#xff0c;iPhone用户现在可以享受到更快的网络速度&#xff0c;但这同时也带来了一个问题&#xff1a;如何在使用5G和保持电池寿命之间找到平衡&#xff1f;苹果公司通过引入“5G Auto”设置&#xff0c;为用户提供了一个智能的解决方案&#xff0c;但用户也…

【JAVA WEB实用与优化技巧】如何使用本地.bat/.sh脚本快速将服务发布到测试环境?

文章目录 普通方式的springboot 使用docker打包发布【手动构建镜像模式】1. maven 打包可运行jar包2.手动打包镜像3.运行容器 全自动化本地命令发布到远程服务的方式配置ssh信任公钥获取公钥git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key…

Honor of Kings 2024.06.03 50star (S35) AFK

Honor of Kings 2024.06.03 50star (S35) AFK 来个赛季S35总结吧&#xff0c;这个赛季结束以后&#xff0c;可能要和【魔兽世界】一样AFK了&#xff0c;手游来说肯定没法子和WOW相比&#xff0c;干啥都是有队友才好玩。 我玩的基本都是肉&#xff0c;爆发强的英雄&#xff0c;最…

llama-factory微调大模型

一、背景 微调或者全量调大语言模型&#xff0c;还包括deepseek,想找个快速的微调教程&#xff0c;网上暂时没有 二、原理和步骤 原理&#xff1a;搭建环境太累了&#xff0c;还是docker环境镜像简单快捷 1、先下载模型 如果用本身的会自动从huggingface下载&#xff0c;这…

解决JSON.stringify 方法在序列化 BigInt 类型时的错误

今天学nest时&#xff0c;使用apifox发送请求获取数据&#xff0c;结果还一直报错&#xff0c;而且还是我从未见过的 Do not know how to serialize a BigInt at JSON.stringify (<anonymous>) at stringify&#xff0c; 我都是跟着人家敲的&#xff0c;我就纳闷了&…

vector的使用和实现

目录 一、vector的常用接口说明1.vector的介绍2.vector的使用2.1 vector的定义2.2 vector的遍历operator[ ]迭代器范围for 2.3 vector的空间增长问题size和capacityreserveresize 2.4 vector的增删查改push_back和pop_backinserterasefindsort vector的模拟实现1、基本成员变量…

Linux基础操作——文件系统+find+head+tail

Linux基础操作——文件系统findheadtail 本文主要涉及LINUX的一些基础操作&#xff0c;文件系统与find命令head和tail命令 文章目录 Linux基础操作——文件系统findheadtail一、Linux下的文件类型二、ls -l 后各列的解释三、 find 查找四、 head 与 tail 查看文件的头部尾部 一…

Nginx Rewrite

Nginx Rerite概述 Nginx Rerite基本操作 location与rewrite的区别 location 通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发 rewrite 对用户的URL访问路径进行重写&#xff0c;再重定向跳转访问重写的路径 Nginx正则表达式 校验数字的表达式 数字&a…

家宽动态公网IP,使用docker+ddns 实现动态域名解析

官方地址&#xff1a;https://github.com/jeessy2/ddns-go 安装docker docker pull jeessy/ddns-godocker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/ddns-go然后访问ip端口 配置时注意如下

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

有关RIPv2认证技术与网络安全综合实验

有关RIPv2认证技术与网络安全综合实验 实验拓扑如下&#xff1a; 理论知识&#xff1a; 比较 RIPv1&#xff1a;广播式通信&#xff0c;255.255.255.255&#xff1b;不支持认证&#xff0c;有类不带掩码&#xff1b;不支持VLSM和CIDR RIPV2&#xff1a;组播通信&#xff0c;22…

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景&#xff1a; 在提供了数据查看和修改的表格视图中(如table、a-table等…)&#xff0c;允许用户自行选择多行数据&#xff0c;依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时&#xff0c;页面会即时反…

插入排序(直接插入排序与希尔排序)----数据结构-排序①

1、插入排序 1.1 插入排序的基本思想 将待排序的元素按其数值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的元素插入完为止&#xff0c;就可以得到一个新的有序序列 。 实际上在我们的日常生活中&#xff0c;插入排序的应用是很广泛的&#xff0c;例如我…