深入理解Gradle构建系统的工作原理
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
文章目录
- 深入理解Gradle构建系统的工作原理
- 摘要
- 一、引言
- 二、Gradle简介
- 特点和用途
- 构建脚本的基本结构
- 小结
- 三、构建过程
- 1. 项目初始化和配置
- 2. 任务的执行顺序
- 3. 依赖关系管理
- 4. 增量构建能力
- 小结
- 四、Gradle的核心概念
- 1. 任务(Task)
- 2. 项目(Project)
- 3. 插件(Plugin)
- 4. 扩展(Extension)
- 小结
- 五、自定义构建逻辑
- 1. 自定义Gradle任务
- 2. 创建自定义插件
- 3. 应用和配置自定义元素
- 小结
- 六、最佳实践和调优
- 1. 使用最新版本的Gradle
- 2. 避免不必要的依赖
- 3. 使用增量构建
- 4. 并行构建
- 5. 使用本地依赖缓存
- 6. 避免多层级的子项目结构
- 7. 常用任务优化
- 8. 使用Gradle Daemon
- 9. 监控构建性能
- 10. 定期清理无用依赖和缓存
- 小结
- 七、案例分析:使用Gradle构建Java Web项目
- 项目结构
- Gradle构建脚本
- 构建项目
- 运行项目
- 小结
- 八、总结
- 参考资料:
- 参考文献:
- 原创声明
深入理解Gradle构建系统的工作原理
摘要
本博客深入探讨了《深入理解Gradle构建系统的工作原理》这一主题。Gradle是一个面向多项目的自动化构建工具,在软件开发中具有重要的地位。了解其工作原理对于开发人员来说是非常有益的。
在博客中,我首先介绍了Gradle的基本概念和用途。然后深入探讨了Gradle构建过程中的各个步骤,包括项目的初始化和配置、任务的执行顺序以及依赖关系管理。接着,我详细介绍了Gradle的核心概念,包括任务、项目、插件和扩展,并解释了它们在构建过程中的作用。
随后,我讨论了如何在Gradle中实现自定义构建逻辑,包括编写自定义任务、创建自定义插件和扩展,并如何应用和配置这些自定义元素。然后提供了一些关于使用Gradle的最佳实践和调优建议,以优化构建过程,提高开发效率。
最后,我通过一个简单的Java Web项目构建案例,展示了Gradle在实际项目中的应用和优势。本博客旨在帮助读者全面了解Gradle构建系统,并鼓励进一步学习和探索Gradle的更多特性。掌握Gradle的工作原理和技巧,将有助于开发人员更好地应用Gradle,提高构建效率,从而在软件开发中取得更优秀的成果。
一、引言
Gradle是一种现代化的构建系统,广泛用于Java、Android、Kotlin等项目的构建和管理。它采用了基于Groovy和Kotlin的DSL(领域特定语言),使得构建脚本更加简洁、灵活。了解Gradle的工作原理对于开发人员来说是至关重要的,因为它不仅仅是一个构建工具,还可以帮助您管理依赖关系、运行测试、执行任务等。在本博客中,我将深入探讨Gradle构建系统的工作原理和相关概念。
二、Gradle简介
Gradle是一个面向多项目的自动化构建工具。它是一款强大而灵活的构建系统,广泛应用于Java、Android、Kotlin等项目的构建和管理。作为一种基于Groovy和Kotlin的DSL(领域特定语言),Gradle使得构建脚本编写更加简洁、易读,并且具有高度可维护性。它的设计理念旨在提供一种优雅的构建方式,让开发者能够更专注于项目的业务逻辑而不是繁琐的构建配置。
特点和用途
Gradle的特点和用途使其成为开发人员和团队首选的构建工具之一:
-
灵活性:Gradle的灵活性是其最大的优势之一。它允许开发者根据项目的需求和特性进行高度定制。通过插件系统和自定义任务,您可以轻松地适应不同项目类型和技术栈的构建需求。
-
多项目支持:Gradle是面向多项目构建的,这意味着它能够轻松处理由多个子项目组成的复杂项目结构。这种能力使得构建大型项目变得更加容易管理。
-
依赖管理:Gradle提供了强大的依赖管理功能,能够管理项目所需的第三方库和模块依赖。它支持从各种来源获取依赖,包括Maven中央仓库、本地JAR文件和远程仓库。
-
增量构建:Gradle具备优秀的增量构建能力,它只重新构建发生更改的部分,从而显著减少构建时间,特别是在大型项目中,这将极大地提高开发效率。
-
可扩展性:通过编写自定义插件和任务,您可以将Gradle扩展到满足特定项目的需求。并且,有丰富的第三方插件库可供选择,以满足各种构建和部署需求。
构建脚本的基本结构
Gradle构建脚本通常采用Groovy或Kotlin语言编写,它的基本结构包括以下几个重要部分:
-
项目声明:通常以
plugins
块开始,声明了所需的Gradle插件,比如java
插件用于Java项目、android
插件用于Android项目等。 -
仓库声明:使用
repositories
块声明项目依赖的仓库,比如从Maven中央仓库、JCenter等获取依赖。 -
依赖声明:使用
dependencies
块声明项目的第三方依赖,指定所需的库和版本号。 -
任务定义:通过
task
关键字定义自定义任务,以实现项目构建中的特定功能。 -
构建配置:在这一部分,您可以配置和定制Gradle插件和任务的行为,例如编译选项、打包方式等。
-
任务执行顺序:您可以定义任务之间的依赖关系,以确保它们按正确的顺序执行。
-
其他配置:根据项目的需求,您可以添加其他自定义配置,以满足特定的构建需求。
小结
Gradle是一款功能强大、灵活易用的构建工具,它在众多项目中得到广泛应用。通过深入理解其特点和用途,以及掌握构建脚本的基本结构,您将能够更加高效地管理和构建您的项目。在接下来的博客内容中,我将进一步探讨Gradle构建系统的工作原理,帮助您更好地利用Gradle来优化项目的构建过程。敬请期待!
三、构建过程
在本节中,我将深入探讨Gradle构建系统的工作原理,了解其构建过程中涉及的各个步骤。Gradle的构建过程是一个复杂的流程,它涉及项目的初始化和配置、任务的执行顺序以及依赖关系的管理。了解这些步骤将帮助您更好地理解Gradle的工作原理,并能够优化构建过程,提高开发效率。
1. 项目初始化和配置
在构建过程开始之前,Gradle会首先初始化项目。这包括读取项目的构建脚本(如build.gradle文件)以及相关配置文件,构建项目的对象模型(Project Object Model,POM)。项目的POM包含了项目的所有配置信息,包括依赖关系、任务和插件等。
在项目初始化阶段,Gradle还会解析项目的依赖关系,并根据依赖关系构建一个依赖图。依赖图是一个表示项目中各个模块之间依赖关系的数据结构,它指导了后续任务的执行顺序。
2. 任务的执行顺序
在Gradle中,构建过程是通过执行一系列任务来实现的。任务是构建过程的最小单元,它代表着构建过程中的一个操作。Gradle会根据任务之间的依赖关系来确定它们的执行顺序。
当您执行一个Gradle任务时,Gradle会检查该任务所依赖的其他任务,并确保这些依赖任务在该任务执行之前完成。这样可以确保任务按照正确的顺序执行,以满足构建过程中的依赖关系。
3. 依赖关系管理
在构建过程中,项目的依赖关系起着关键作用。Gradle通过依赖管理来管理项目所需的第三方库和模块依赖。您可以在构建脚本中声明项目的依赖,Gradle会根据这些依赖信息自动下载和配置所需的库和模块。
Gradle支持多种依赖管理方式,包括从Maven中央仓库、本地JAR文件和远程仓库获取依赖。您还可以通过配置依赖解析策略来控制依赖的冲突解决方式,以确保项目的稳定性和一致性。
4. 增量构建能力
Gradle具备优秀的增量构建能力,这是其在大型项目中表现优秀的关键之一。增量构建意味着Gradle只重新构建发生更改的部分,而跳过未发生更改的部分。这样可以极大地减少构建时间,特别是在项目规模较大时,能够显著提高开发效率。
Gradle通过对项目资源和任务输出的增量检测,确定哪些部分需要重新构建。这种智能的构建策略使得Gradle在处理大型项目时非常高效。
小结
通过深入了解Gradle构建过程中的各个步骤,包括项目初始化和配置、任务的执行顺序以及依赖关系管理,您将能够更好地应用Gradle构建系统,并且能够根据项目需求优化构建过程,提高开发效率。下一节中,我将继续介绍Gradle的核心概念,以更全面地理解Gradle的工作原理。敬请期待!
四、Gradle的核心概念
在本节中,我将详细介绍Gradle构建系统的核心概念,这些概念包括任务(Task)、项目(Project)、插件(Plugin)和扩展(Extension)。这些概念是Gradle构建过程的基础,理解它们将帮助您更好地掌握Gradle的强大功能,并在构建过程中灵活应用它们。
1. 任务(Task)
任务是Gradle构建过程的最小单元,它代表着构建过程中的一个操作。在Gradle中,您可以执行各种各样的任务,如编译代码、运行测试、打包应用等。每个任务都有一个唯一的名称,通过任务名称可以在命令行中或构建脚本中执行任务。
Gradle任务是可配置的,您可以根据项目的需求,对任务进行不同的配置,包括输入参数、输出结果、执行动作等。任务的执行顺序由依赖关系决定,当一个任务被执行时,Gradle会检查该任务所依赖的其他任务,并确保这些依赖任务在该任务执行之前完成。
2. 项目(Project)
在Gradle中,项目是指构建过程中的一个独立单元,它可以代表一个Java项目、Android项目或任何其他类型的项目。一个Gradle项目通常由多个任务组成,这些任务定义了项目构建过程中的各种操作。
项目是Gradle构建过程的管理单元,每个项目都有一个相关联的构建脚本(通常是build.gradle文件)。构建脚本包含了项目的所有配置信息,包括依赖关系、任务的定义和插件的配置等。
3. 插件(Plugin)
插件是Gradle构建过程的功能扩展单元,它允许您为项目添加额外的功能和特性。Gradle本身只包含一些基本的构建功能,但通过应用插件,您可以为项目添加更多高级功能。
Gradle提供了许多内置的插件,用于支持各种类型的项目,比如Java项目、Android项目、Kotlin项目等。除了内置插件,您还可以编写自己的自定义插件,以满足特定项目的需求。
4. 扩展(Extension)
扩展是Gradle构建过程中配置的一种方式,它允许您向项目中添加自定义配置项。通过扩展,您可以在构建脚本中定义一些自定义属性,这些属性可以在整个项目中使用。
Gradle内置了一些通用的扩展,比如ext
,它允许您在构建脚本中定义全局的属性。此外,您还可以定义自己的扩展,将一组属性打包成一个对象,以便在构建过程中更加结构化地管理配置。
小结
掌握Gradle的核心概念,包括任务、项目、插件和扩展,是使用Gradle构建系统的关键。通过对这些概念的理解,您可以更好地配置和管理项目的构建过程,并能够充分发挥Gradle的强大功能。在下一节中,我将介绍如何在Gradle中实现自定义构建逻辑,让您的项目更加灵活和高效。敬请期待!
五、自定义构建逻辑
Gradle的灵活性使得您可以根据项目的特定需求轻松自定义构建逻辑,使构建过程更加灵活和高效。在本节中,我将深入了解如何编写自定义的Gradle任务、创建自定义插件和扩展,以及如何应用和配置这些自定义元素。
1. 自定义Gradle任务
Gradle任务是构建过程的最小单元,而编写自定义任务是自定义构建逻辑的一种重要方式。您可以通过编写自定义任务来执行项目中特定的操作,或者实现一些非标准的构建需求。
编写自定义任务通常涉及以下几个步骤:
- 创建一个继承自
DefaultTask
的自定义任务类。 - 在任务类中定义任务的输入参数和输出结果。
- 实现任务的执行逻辑,即
doLast
闭包中的代码,指定任务需要执行的操作。
通过编写自定义任务,您可以根据项目的特性和需求,灵活地配置构建过程。
2. 创建自定义插件
除了编写自定义任务,您还可以创建自定义插件来扩展Gradle的功能。自定义插件允许您将一组任务、配置和扩展打包为一个单独的模块,以便在多个项目中重用。
创建自定义插件通常包括以下步骤:
- 创建一个继承自
Plugin
的自定义插件类。 - 在插件类中实现
apply
方法,在该方法中定义插件的功能和任务。 - 将自定义插件的逻辑打包为一个独立的Jar文件,并在项目中应用该插件。
通过自定义插件,您可以将常用的构建逻辑封装为一个可复用的组件,使构建脚本更具可读性和可维护性。
3. 应用和配置自定义元素
在编写自定义任务和插件后,您需要在项目中应用和配置它们,以实现自定义构建逻辑。在项目的构建脚本中,您可以使用apply
函数来应用自定义插件,例如:
plugins {id 'com.example.myplugin' version '1.0'
}
然后,您可以根据需要对自定义任务和插件进行配置。例如,给任务指定输入参数、设置任务的执行顺序、配置插件的属性等。
task myCustomTask(type: com.example.MyCustomTask) {inputParameter = "value"
}myCustomPlugin {property = "value"
}
通过这种方式,您可以在构建脚本中轻松应用和配置自定义任务和插件,使其与项目的其他部分协同工作。
小结
通过编写自定义任务、创建自定义插件和扩展,并在构建脚本中应用和配置这些自定义元素,您可以灵活地满足项目的特定需求,使构建过程更加高效和简化。掌握这些自定义构建逻辑的技巧将帮助您更好地使用Gradle,并根据项目的要求定制化构建流程。在下一节中,我将提供一些关于使用Gradle的最佳实践和调优建议,以帮助您进一步优化构建过程。敬请期待!
六、最佳实践和调优
在使用Gradle构建系统时,遵循最佳实践和调优策略可以提高开发效率并确保构建过程的稳定性。在本节中,我将提供一些关于使用Gradle的最佳实践和调优建议,帮助您优化构建过程,使您的开发流程更加高效和顺畅。
1. 使用最新版本的Gradle
始终确保您使用最新版本的Gradle。每个Gradle版本都会带来新的功能、改进和性能优化。通过升级到最新版本,您可以获得更好的构建体验和更快的构建速度。
2. 避免不必要的依赖
在构建脚本中,只声明项目所需的真正依赖。避免不必要的依赖会减少构建时间并提高构建的稳定性。
3. 使用增量构建
利用Gradle的增量构建能力,只构建发生更改的部分,从而减少整体构建时间。这对于大型项目特别有用,可以显著提高开发效率。
4. 并行构建
通过配置Gradle并行构建选项,您可以同时构建多个项目或任务,从而加快整体构建速度。但要注意,并行构建可能导致资源竞争和内存占用较高,因此在选择并行度时需要根据项目的实际情况进行调整。
5. 使用本地依赖缓存
使用本地依赖缓存可以避免重复下载依赖,加快构建速度。您可以设置Gradle使用本地的Maven仓库或Gradle缓存目录来管理依赖缓存。
6. 避免多层级的子项目结构
在使用Gradle的多项目构建时,避免过多的子项目层级。深层次的子项目结构会增加构建的复杂性和构建时间。
7. 常用任务优化
对于常用的构建任务,您可以针对性地优化它们,比如配置增量编译、并行执行、优化编译选项等,以提高任务执行速度。
8. 使用Gradle Daemon
Gradle Daemon是一个长期运行的后台进程,可以加速构建过程。启用Gradle Daemon可以避免每次构建都重新启动Gradle,从而节省构建时间。
9. 监控构建性能
通过监控构建性能,您可以了解构建过程中哪些任务占用了大量时间,从而有针对性地优化它们,提高构建效率。
10. 定期清理无用依赖和缓存
定期清理无用的依赖和Gradle缓存可以释放磁盘空间并确保构建的稳定性。Gradle提供了一些任务和选项来帮助您进行清理操作。
小结
遵循这些最佳实践和调优建议,您可以优化Gradle构建过程,提高开发效率,并使构建过程更加高效和可靠。通过合理配置Gradle构建选项和优化构建脚本,您可以充分发挥Gradle的强大功能,让您的开发流程更加顺畅和愉快。在下一节中,我将探讨一个可选的主题,即在实际项目中对Gradle的应用和案例分析。敬请期待!
七、案例分析:使用Gradle构建Java Web项目
在本案例中,我将展示如何使用Gradle构建一个简单的Java Web项目,以展示Gradle在实际项目中的应用和好处。这个示例项目是一个简单的Web应用程序,使用Java Servlet和JSP技术,构建一个简单的留言板功能。
项目结构
假设我的Java Web项目的目录结构如下:
my-webapp/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── Message.java
│ │ │ └── MessageServlet.java
│ │ └── webapp/
│ │ ├── WEB-INF/
│ │ │ └── web.xml
│ │ └── index.jsp
│ └── test/
│ ├── java/
│ └── resources/
└── build.gradle
Gradle构建脚本
下面是项目的Gradle构建脚本示例(build.gradle):
plugins {id 'java'id 'war'
}repositories {jcenter()
}dependencies {implementation 'javax.servlet:javax.servlet-api:4.0.1'testImplementation 'junit:junit:4.13.2'
}sourceSets {main {java {srcDir 'src/main/java'}resources {srcDir 'src/main/resources'}output.classesDir = file('build/classes/main')}test {java {srcDir 'src/test/java'}resources {srcDir 'src/test/resources'}output.classesDir = file('build/classes/test')}
}war {archiveName 'my-webapp.war'destinationDir file('build')
}
构建项目
在项目目录下运行以下命令构建项目:
gradle build
Gradle会根据构建脚本中的配置,编译Java代码并生成WAR文件。构建完成后,您可以在build
目录下找到生成的WAR文件。
运行项目
将生成的WAR文件部署到Tomcat或其他Java Web服务器中,并启动服务器。然后访问http://localhost:8080/my-webapp/
即可在浏览器中查看留言板应用。
小结
这个简单的案例分析展示了如何使用Gradle构建一个Java Web项目。通过Gradle的灵活配置和插件支持,我可以轻松地管理项目的依赖、编译Java代码、打包WAR文件,并且构建过程更加高效和简化。这只是Gradle在实际项目中应用的一个简单示例,Gradle在更复杂的项目中也能发挥出其强大的功能和优势。希望这个案例分析能帮助您更好地理解Gradle的应用和好处。
八、总结
本博客深入探讨了Gradle构建系统的工作原理和应用,希望为您提供了全面而深入的了解。在这篇博客中,我按照以下结构介绍了Gradle的重要内容:
-
摘要:简要介绍了Gradle构建系统的工作原理,强调了了解Gradle对于开发人员的益处。
-
GRADLE简介:详细介绍了Gradle构建系统的特点和用途,以及其构建脚本的基本结构。
-
构建过程:深入探讨了Gradle构建系统的工作原理,包括项目的初始化和配置、任务的执行顺序以及依赖关系的管理。
-
GRADLE的核心概念:介绍了Gradle构建系统的核心概念,如任务、项目、插件和扩展,以及它们在构建过程中的作用。
-
自定义构建逻辑:讲解了如何在Gradle中自定义构建逻辑,包括编写自定义任务、创建自定义插件和扩展,并如何应用和配置它们。
-
最佳实践和调优:提供了关于使用Gradle的最佳实践和调优建议,以优化构建过程,提高开发效率。
-
案例分析:展示了一个简单的Java Web项目构建案例,演示了Gradle在实际项目中的应用和优势。
在总结中,我再次强调了解Gradle构建系统的重要性,并鼓励您继续学习和探索Gradle的更多特性。Gradle作为一个强大而灵活的构建工具,在现代软件开发中扮演着重要的角色。希望本博客能为您提供有价值的信息,并在您的开发工作中带来帮助。祝您在使用Gradle时取得愉快的构建体验和卓越的项目成果!如果您有任何问题或需要进一步的帮助,请随时向我咨询。谢谢!
参考资料:
- Gradle官方文档 - Gradle官方用户指南,提供详细的Gradle使用说明和文档。
- Gradle DSL参考 - Gradle的DSL(Domain Specific Language)参考文档,详细解释了Gradle构建脚本中的各种配置选项和属性。
- Gradle用户指南中文版 - Gradle用户指南的中文翻译版本,提供了对Gradle的全面介绍。
- Java Servlet官方文档 - Java Servlet官方规范文档,包含了Java Servlet技术的详细说明和API文档。
参考文献:
- Muschko, Benjamin. “Gradle in Action.” Manning Publications, 2014. - 本书深入介绍了Gradle的基本概念和高级特性,并提供了丰富的示例和实践经验。
- O’Reilly, Tim. “Building and Testing with Gradle.” O’Reilly Media, 2021. - 这本书讲解了如何使用Gradle构建和测试软件项目,并探讨了Gradle在持续集成和持续交付中的应用。
- Berglund, O. “Gradle for Android.” Packt Publishing, 2015. - 本书专注于使用Gradle构建Android应用,详细介绍了在Android开发中使用Gradle的方法和技巧。
希望本博客能够帮助您深入理解Gradle构建系统的工作原理,并使您在项目开发中能够更加得心应手!感谢您的阅读!
原创声明
======= ·
- 原创作者: 猫头虎
作者wx: [ libin9iOak ]
学习 | 复习 |
---|---|
✔ |
本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。
作者保证信息真实可靠,但不对准确性和完整性承担责任。
未经许可,禁止商业用途。
如有疑问或建议,请联系作者。
感谢您的支持与尊重。
点击
下方名片
,加入IT技术核心学习团队。一起探索科技的未来,共同成长。
相关文章:

深入理解Gradle构建系统的工作原理
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

STM32F030C8T6输出3路PWM
1,常规套餐 上电初始化 SystemInit(); TIM1_Init(); 2,TIMI1初始化 TIM_TimeBaseInitTypeDef TIM1_TimeBaseStructure; TIM_OCInitTypeDef TIM1_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //记得打开时钟 RCC_AHBPeriphClo…...

如何理解原型及原型链?js的继承方式
原型与原型链 原型 在js中,每个对象都有一个原型(prototype)。原型是一个对象,其他对象可以通过原型来共享属性和方法。当我们创建一个对象时,它会自动关联到一个原型对象。 例如:function Person(name, a…...

C# 按表格中的某列排序/查询
using System; using System.Data; using System.Linq;class Program {static void Main(){// 创建一个示例的 DataTable 对象DataTable table new DataTable();table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.R…...

【Vue】】img使用 :src 动态绑定图片地址,但是加载图片不成功
问题复现: img标签直接动态绑定图片的相对路径的时候,图片不能正常显示。代码如下所示 <view style"margin: 20rpx" v-for"(item, index) in showSampleImage" :key"index"><u-image :src"item.src"…...

list模拟
之前模拟了string,vector,再到现在的list,list的迭代器封装最让我影响深刻。本次模拟的list是双向带头节点的循环链表,该结构虽然看起来比较复杂,但是却非常有利于我们做删除节点的操作,结构图如下。 由于其节点结构特…...

python字典:怎么取出key对应的值
目录 python中的字典是什么 怎么判断key是否在字典中 怎么取出key对应的值 总结 python中的字典是什么 在Python中,字典(Dictionary)是一种无序且可变的数据类型,用于存储键-值(Key-Value)对。字典通过…...

okvis
论文 Keyframe-Based Visual-Inertial SLAM Using Nonlinear Optimization 摘要 由于两种感知模式的互补性,视觉和惯性线索的融合在机器人中变得很流行。虽然迄今为止大多数融合策略都依赖于过滤方案,但视觉机器人界最近转向了非线性优化方法&#x…...

fabric js双击弹出菜单, 双击弹出输入框 修改文字 群组对象
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试1</title><style type"text/css">body {background-color: #ccc;float: left;}#main {background-color: #fff;border: 1px…...

路由器工作原理
路由器原理 路由概述 路由:跨越从源主机到目标主机的一个互联网络来转发数据包的过程。(为数据包选择路径的过程) 作用:路由器是连接不同网段的。 转发依据: 路由表:路径选择全看路由表,根…...

在centos 7系统docker上构建mysql 5.7
一、VM上已经安装centos 7.9,且已完成docker的构建 二、安装mysql5.7 安装镜像:[rootlocalhost lll]# docker pull mysql:5.7 查看镜像[rootlocalhost lll]# docker images 根据镜像id构建mysql容器,且分配端口号[rootlocalhost lll]# dock…...

数据库的介绍和分类
目录 一、数据库的介绍和分类 二、命令行客户端 三、数据操作 四、查询的基本操作 五、条件查询 六、分组和聚合 资料获取方法 一、数据库的介绍和分类 数据库:长期存储在计算机内、有组织的数据集合 数据库的分类: 关系型数据库 以表格的形式…...

职责链模式——请求的链式处理
1、简介 1.1、概述 很多情况下,在一个软件系统中可以处理某个请求的对象不止一个。例如SCM系统中的采购单审批,主任、副董事长、董事长和董事会都可以处理采购单,他们可以构成一条处理采购单的链式结构。采购单沿着这条链进行传递ÿ…...

docker中涉及的挂载点总结
文章目录 1.场景描述2. 容器信息在主机上位置3. 通过docker run 命令4、通过Dockerfile创建挂载点5、容器共享卷(挂载点)6、最佳实践:数据容器 1.场景描述 在介绍VOLUME指令之前,我们来看下如下场景需求: 1ÿ…...

elasticsearch 官方优化建议
.一般建议 a.不要返回过大的结果集。这个建议对一般数据库都是适用的,如果要获取大量结果,可以使用search_after api,或者scroll (新版本中已经不推荐)。 b.避免大的文档。 2. 如何提高索引速度 a.使用批量请求。为了…...

Kubernetes(K8s)从入门到精通系列之五:K8s的基本概念和术语之应用类
Kubernetes K8s从入门到精通系列之五:K8s的基本概念和术语之应用类 一、Service与Pod二、Label与标签选择器三、Pod与Deployment四、Service的ClusterIP地址五、Service的外网访问问题六、有状态的应用集群七、批处理应用八、应用配置问题九、应用的运维一、Service与Pod Ser…...

DevOps(四)
CD(二) 1. CDStep 1 - 上传代码Step 2 - 下载代码Step 3 - 检查代码Step 4 - 编译代码Step 5 - 上传仓库Step 6 - 下载软件Step 7 - 制作镜像Step 8 - 上传镜像Step 9 - 部署服务2. 整体预览2.1 预览1. 修改代码2. 查看sonarqube检查结果3. 查看nexus仓库4. 查看harbor仓库5.…...

Element-plus侧边栏踩坑
问题描述 el-menu直接嵌套el-menu-item菜单,折叠时不会出现文字显示和小箭头无法隐藏的问题,但是实际开发需求中难免需要把el-menu-item封装为组件 解决 vue3项目中嵌套两层template <template><template v-for"item in list" :k…...

支持多种通信方式和协议方便接入第三方服务器或云平台
2路RS485串口是一种常用的通信接口,可以支持Modbus Slave协议,并可接入SCADA、HMI、DSC、PLC等上位机。它还支持Modbus RTU Master协议,可用于扩展多达48个Modbus Slave设备,如Modbus RTU远程数据采集模块、电表、水表、柴油发电机…...

使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)
写在前面 工作中遇到,简单整理人脸识别中,对于模糊程度较高的图像数据,识别率低,错误率高。虽然使用 AdaFace 模型,对低质量人脸表现尤为突出。但是还是需要对 模糊程度高的图像进行丢弃处理当前通过阈值分类ÿ…...

神经网络简单介绍
人工神经网络(artififial neural network) 简称神经网络,它是一种模仿生物神经网络结构和功能的非线性数学模型。 神经网络通过输入层接受原始特征信息,再通过隐藏层进行特征信息的加工和提取,最后通过输出层输出结果。 根据需要神经网络可以…...

16位S912ZVML32F3MKH、S912ZVML31F1WKF、S912ZVML31F1MKH混合信号MCU,适用于汽车和工业电机控制应用。
S12 MagniV微控制器是易于使用且高度集成的混合信号MCU,非常适合用于汽车和工业应用。S12 MagniV MCU提供单芯片解决方案,是基于成熟的S12技术的完整系统级封装 (SiP) 解决方案,在整个产品组合内软件和工具都兼容。 S12 MagniV系统级封装 (S…...

力扣 509. 斐波那契数
题目来源:https://leetcode.cn/problems/fibonacci-number/description/ C题解1:根据题意,直接用递归函数。 class Solution { public:int fib(int n) {if(n 0) return 0;else if(n 1) return 1;else return(fib(n-1) fib(n-2));} }; C题…...

使用 DolphinDB TopN 函数探索高效的Alpha因子
DolphinDB 已经有非常多的窗口计算函数,例如 m 系列的滑动窗口计算,cum 系列累计窗口计算,tm 系列的的时间窗口滑动计算。但是所有这类函数都是对窗口内的所有记录进行指标计算,难免包含很多噪音。 DolphinDB 的金融领域用户反馈…...

超聚变和厦门大学助力兴业银行构建智慧金融隐私计算平台,助力信用卡业务精准营销...
兴业银行与超聚变数字技术有限公司、厦门大学携手,发挥产学研用一体化整体优势联合建设,厦门大学提供先进的算法模型及科研能力,超聚变提供产品解决方案及工程能力,兴业银行提供金融实践能力,三方发挥各自领域优势&…...

docker 的compose安装
1. Docker Compose 环境安装 Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose docker compose 实现单机容器集群编排管理(使用一个模板文件定义多个应用容器的启动参数和依赖关系,并使用docker co…...

JavaScript---事件对象event
获取事件对象: 事件对象:是个对象,这个对象里有事件触发时的相关信息,在事件绑定的回调函数的第一个参数就是事件对象,一般命名为event、ev、e eg: 元素.addEventListener(click,function (e){}) 部分常用属性&…...

Day 15 C++对象模型和this指针
目录 C对象模型 类内的成员变量和成员函数分开存储 总结 this指针 概念 示例 用途 当形参和成员变量同名时 在非静态成员函数中,如果希望返回对象本身 例子 空指针访问成员函数 示例 const修饰成员函数 常函数(const member function&…...

HarmonyOS/OpenHarmony元服务开发-卡片生命周期管理
创建ArkTS卡片,需实现FormExtensionAbility生命周期接口。 1.在EntryFormAbility.ts中,导入相关模块。 import formInfo from ohos.app.form.formInfo; import formBindingData from ohos.app.form.formBindingData; import FormExtensionAbility from …...

软件工程01
软件工程原则: 开闭原则: open closed principle : 对扩展开放,对修改关闭,,,只让扩展,不让修改,用新增的类去替代修改的类 扩展之后,代码不用改变ÿ…...