Gradle配置:

Gradle构建脚本 build.gradle
Gradle属性文件 gradle.properties
Gradle设置文件 settings.gradle

build.gradle

先看整个项目的gradle配置文件:

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. }
  5. dependencies {
  6. classpath 'com.android.tools.build:gradle:1.3.0'
  7. // NOTE: Do not place your application dependencies here; they belong
  8. // in the individual module build.gradle files
  9. }
  10. }
  11. allprojects {
  12. repositories {
  13. jcenter()
  14. }
  15. }

内容主要包含了两个方面:一个是声明仓库的源,这里可以看到是指明的jcenter(), 之前版本则是mavenCentral(), jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。
另一个是声明了android gradle plugin的版本,android studio 1.0正式版必须要求支持gradle plugin 1.0的版本

某个Moudle的gradle配置文件:

buildscript

  1. buildscript {
  2. repositories {
  3. maven { url 'http://*********' }
  4. }
  5. dependencies {
  6. classpath 'com.android.tools.build:gradle:1.3.1'
  7. }
  8. }
  • buildscript{}设置脚本的运行环境。
  • repositories{}支持java依赖库管理,用于项目依赖。
  • dependencies{}依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件。如果前面定义了repositories{}maven 库,则使用maven的依赖库,使用时只需要按照用类似于com.android.tools.build:gradle:0.4,gradle 就会自动的往远程库下载相应的依赖。

apply

  1. //声明引用 com.android.application 插件,那么这个模块就是一个Android应用程序
  2. apply plugin: 'com.android.application'
  • apply plugin:声明引用插件的类型。如果是库的话就加
  1. apply plugin: 'com.android.library'
  • apply from:表示引用其他的配置文件,比如 apply from:"config.gradle"

android

这个是 Android 插件引入的 Script blocks

  1. android {
  2. // 编译SDK的版本
  3. compileSdkVersion 22
  4. // build tools的版本
  5. buildToolsVersion "23.0.1"
  6. //aapt配置
  7. aaptOptions {
  8. //不用压缩的文件
  9. noCompress 'pak', 'dat', 'bin', 'notice'
  10. //打包时候要忽略的文件
  11. ignoreAssetsPattern "!.svn:!.git"
  12. //分包
  13. multiDexEnabled true
  14. //--extra-packages是为资源文件设置别名:意思是通过该应用包名+R,com.android.test1.R和com.android.test2.R都可以访问到资源
  15. additionalParameters '--extra-packages', 'com.android.test1','--extra-packages','com.android.test2'
  16. }
  17. //默认配置
  18. defaultConfig {
  19. //应用的包名
  20. applicationId "com.example.heqiang.androiddemo"
  21. minSdkVersion 21
  22. targetSdkVersion 22
  23. versionCode 1
  24. versionName "1.0"
  25. }
  26. //编译配置
  27. compileOptions {
  28. // java版本
  29. sourceCompatibility JavaVersion.VERSION_1_7
  30. targetCompatibility JavaVersion.VERSION_1_7
  31. }
  32. //源文件目录设置
  33. sourceSets {
  34. main {
  35. //jni lib的位置
  36. jniLibs.srcDirs = jniLibs.srcDirs << 'src/jniLibs'
  37. //定义多个资源文件夹,这种情况下,两个资源文件夹具有相同优先级,即如果一个资源在两个文件夹都声明了,合并会报错。
  38. res.srcDirs = ['src/main/res', 'src/main/res2']
  39. //指定多个源文件目录
  40. java.srcDirs = ['src/main/java', 'src/main/aidl']
  41. }
  42. }
  43. //签名配置
  44. signingConfigs {
  45. debug {
  46. keyAlias 'androiddebugkey'
  47. keyPassword 'android'
  48. storeFile file('keystore/debug.keystore')
  49. storePassword 'android'
  50. }
  51. }
  52. buildTypes {
  53. //release版本配置
  54. release {
  55. debuggable false
  56. // 是否进行混淆
  57. minifyEnabled true
  58. //去除没有用到的资源文件,要求minifyEnabled为true才生效
  59. shrinkResources true
  60. // 混淆文件的位置
  61. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  62. signingConfig signingConfigs.debug
  63. //ndk的一些相关配置,也可以放到defaultConfig里面。
  64. //指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,arm-v8之类的so会被过滤掉)
  65. ndk {
  66. abiFilter "armeabi"
  67. }
  68. }
  69. //debug版本配置
  70. debug {
  71. debuggable true
  72. // 是否进行混淆
  73. minifyEnabled false
  74. //去除没有用到的资源文件,要求minifyEnabled为true才生效
  75. shrinkResources true
  76. // 混淆文件的位置
  77. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  78. signingConfig signingConfigs.debug
  79. //ndk的一些相关配置,也可以放到defaultConfig里面。
  80. //指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,arm-v8之类的so会被过滤掉)
  81. ndk {
  82. abiFilter "armeabi"
  83. }
  84. }
  85. }
  86. // lint配置
  87. lintOptions {
  88. //移除lint检查的error
  89. abortOnError false
  90. //禁止掉某些lint检查
  91. disable 'NewApi'
  92. }
  93. }

android{}设置编译android项目的参数,构建android项目的所有配置都写在这里。
除了上面写的,在android{}块中可以包含以下直接配置项:

  • productFlavors{ } 产品风格配置,ProductFlavor类型
  • testOptions{ } 测试配置,TestOptions类型
  • dexOptions{ } dex配置,DexOptions类型
  • packagingOptions{ } PackagingOptions类型
  • jacoco{ } JacocoExtension类型。 用于设定 jacoco版本
  • splits{ } Splits类型。

几点说明:

  • 文件开头apply plugin是最新gradle版本的写法,以前的写法是apply plugin: 'android', 如果还是以前的写法,请改正过来。
  • minifyEnabled也是最新的语法,很早之前是runProguard,这个也需要更新下。
  • proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 sdk目录/tools/proguard/proguard-android.txt , 后一部分是我们项目里的自定义的混淆文件,目录就在 app/proguard-rules.txt , 如果你用Studio 1.0创建的新项目默认生成的文件名是 proguard-rules.pro , 这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则。最终混淆的结果是这两部分文件共同作用的。
  • aaptOptions更多介绍 http://blog.csdn.net/heqiangflytosky/article/details/51009123

变量的引用

比如在gradle的某个地方想使用版本号,可以使用下面的方法:

  1. def getVersionCode() {
  2. int code = android.defaultConfig.versionCode
  3. return code
  4. }

repositories

  1. repositories {
  2. flatDir {
  3. //本地jar依赖包路径
  4. dirs '../../../../main/libs'
  5. }
  6. }

dependencies

  1. dependencies {
  2. compile files('libs/android-support-v4.jar')
  3. //在flatDir.dirs下面找依赖的aar
  4. compile (name:'ui', ext:'aar')
  5. // 编译extras目录下的ShimmerAndroid模块
  6. // 使用transitive属性设置为false来排除所有的传递依赖,默认为true
  7. compile project(':extras:ShimmerAndroid'){
  8. transitive = false
  9. }
  10. // 编译CommonSDK模块,但是去掉此模块中对com.android.support的依赖,防止重复依赖报错
  11. compile (project(':CommonSDK')) { exclude group: "com.android.support" }
  12. provided fileTree(dir: 'src/android5/libs', include: ['*.jar'])
  13. provided 'com.android.support:support-v4:21.0.3'
  14. provided project(':main-host')
  15. //通用使用exclude排除support-compat模块的依赖
  16. compile ('com.jakewharton:butterknife:8.5.1'){
  17. exclude module: 'support-compat'
  18. }
  19. // gradle 3.0以后版本支持的写法
  20. implementation 'com.android.support.constraint:constraint-layout:1.0.2'
  21. api 'com.android.support:design:26.1.0'
  22. }
  • compileprovided
    compile表示编译时提供并打包进apk。
  • implementationapi
    implementation 会将依赖隐藏在内部而不对外公开,就是说使用 implementation 的依赖不会传递。比如:一个项目中app模块依赖A模块,A模块使用 implementation 来依赖 fastjson ,那么app里面如果不添加依赖的话就不能直接引用fastjson。
    api 和以前的 compile 是一样的。
  • exclude 防止重复依赖,后面会重点介绍
  • transitive 排除所有的传递依赖,后面会重点介绍
  • include

CommonSDK模块的定义可以参考settings.gradle
其他的介绍可以参考 依赖库管理。

几点说明

  • 看到上面的两个一模一样的repositoriesdependencies了吗?他们的作用是不一样的,在buildscript里面的那个是插件初始化环境用的,用于设定插件的下载仓库,而外面的这个是设定工程依赖的一些模块和远程library的下载仓库的。

settings.gradle

这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module。
一般在setting.gradle中主要是调用include方法,导入工程下的各个子模块。
那我们在setting.gradle里面还能写什么呢?因为setting.gradle对应的是gradle中的Settings对象,那查下Settings的文档(https://docs.gradle.org/current/dsl/org.gradle.api.initialization.Settings.html),看下它都有哪些方法,哪些属性,就知道在setting.gradle能写什么了;

  1. include ':AndroidDemo'
  2. include ':CommonSDK'
  3. project(':CommonSDK').projectDir = new File(settingsDir, '../../CommonSDK/')

include调用后,生成了一个名为:CommonSDKProject对象,project(':CommonSDK')取出这个对象,设置ProjectprojectDir属性。projectDir哪里来的?请看Project类的文档。

gradle.properties

可以在 gradle.properties 文件中配置一些变量,这些变量在这个工程下的所有module的build.gradle文件里都可以使用。这样就可以把一些共用的变量放到这里,这样后面修改的时候就可以只修改这个变量,不用各个模块都要修改了。
比如我们在 gradle.properties SDK 版本以及应用的版本号:

  1. MIN_SDK_VERSION=21
  2. TARGET_SDK_VERSION=22
  3. VERSION_CODE=200100
  4. VERSION_NAME=2.1.0
  5. RX_ANDROID_VERSION=1.2.0

那么在 build.gradle 中可以通过project进行获取或者 "${RX_ANDROID_VERSION}" 引用:

  1. defaultConfig {
  2. applicationId "com.example.heqiang.testsomething"
  3. minSdkVersion project.MIN_SDK_VERSION as int
  4. targetSdkVersion project.TARGET_SDK_VERSION as int
  5. versionCode project.VERSION_CODE as int
  6. versionName project.VERSION_NAME
  7. /*
  8. * as int 关键字是用来进行类型转换的,因为从配置里面读取出来的默认是字符串
  9. *还可以使用 versionCode Integer.parseInt(project.VERSION_CODE)
  10. * */
  11. }
  12. // 还可以这样用
  13. dependencies {
  14. compile "io.reactivex:rxandroid:${RX_ANDROID_VERSION}"
  15. compile "io.reactivex:rxjava:${RX_JAVA_VERSION}"
  16. }

或者在 gradle.properties 中添加:

  1. systemProp.versionName=1.0.0
  2. systemProp.versionCode=100

可以通过 System.properties进行引用:

  1. def code = System.properties['versionCode']
  2. def name = System.properties['versionName']

调试

我们在进行一些配置的时候可能需要知道一些变量的值,这时候可以在 build.gradle 中添加打印进行调试,比如:

  1. defaultConfig {
  2. applicationId "com.example.hq.testsomething"
  3. minSdkVersion project.MIN_SDK_VERSION as int
  4. targetSdkVersion project.TARGET_SDK_VERSION as int
  5. versionCode project.VERSION_CODE as int
  6. versionName project.VERSION_NAME
  7. println('** build versionName=' + versionName)
  8. }

在 Gradle Console 中就可以看到打印:

  1. ** build versionName=2.1.0

依赖库管理

本地依赖

  1. dependencies {
  2. //单文件依赖
  3. compile files('libs/android-support-v4.jar')
  4. //某个文件夹下面全部依赖
  5. compile fileTree(dir: 'src/android6/libs', include: ['*.jar'])
  6. compile (name:'ui', ext:'aar')
  7. compile (project(':CommonSDK')) { exclude group: "com.android.support" }
  8. provided fileTree(dir: 'src/android5/libs', include: ['*.jar'])
  9. provided 'com.android.support:support-v4:21.0.3'
  10. provided project(':main-host')
  11. }

远程依赖

gradle同时支持mavenivy,以maven作为例子:

  1. repositories {
  2. //从中央库里面获取依赖
  3. mavenCentral()
  4. //或者使用指定的本地maven 库
  5. maven{
  6. url "file://F:/githubrepo/releases"
  7. }
  8. //或者使用指定的远程maven库
  9. maven{
  10. url "https://github.com/youxiachai/youxiachai-mvn-repo/raw/master/releases"
  11. }
  12. }
  13. dependencies {
  14. //应用格式: packageName:artifactId:version
  15. compile 'com.google.android:support-v4:r13'
  16. }

项目依赖

对于项目依赖android library的话,在这里需要使用gradle mulit project机制。
Mulit project设置是gradle约定的一种格式,如果需要编译某个项目之前,要先编译另外一个项目的时候,就需要用到。结构如下(来自于官方文档):

  1. MyProject/
  2. | settings.gradle
  3. + app/
  4. | build.gradle
  5. + libraries/
  6. + lib1/
  7. | build.gradle
  8. + lib2/
  9. | build.gradle

需要在workplace目录下面创建settings.gradle 的文件,然后在里面写上:

  1. include ':app', ':libraries:lib1', ':libraries:lib2'

例如:

  1. include ':AndroidDemo'
  2. include ':CommonSDK'
  3. project(':CommonSDK').projectDir = new File(settingsDir, '../../CommonSDK/')

如此,gradle mutil project 就设置完毕。
对于app project如果需要应用libraries目录下的lib1,只需要在app project的build.gradle文件里的依赖中这么写:

  1. compile project(':libraries:lib1')

类似前面的

  1. provided project(':main-host')

即可完成,写完以后可以用gradle dependencies可以检查依赖状况

Gradle依赖的统一管理

我们可以在项目的根目录创建一个gradle配置文件config.gradle,内容如下:

  1. ext{
  2. android=[
  3. compileSdkVersion: 22,
  4. buildToolsVersion: "23.0.1",
  5. minSdkVersion: 21,
  6. targetSdkVersion: 22,
  7. versionCode: 1,
  8. versionName: "1.0"
  9. ]
  10. dependencies=[
  11. compile:'com.android.support:support-v4:21.0.3',
  12. compile: (project(':CommonSDK')) { exclude group: "com.android.support" },
  13. provided: fileTree(dir: 'src/android5/libs', include: ['*.jar']),
  14. provided: project(':main-host')
  15. ]
  16. }

targetSdkVersion的版本还有依赖库的版本升级都在这里进行统一管理,所有的module以及主项目都从这里同意读取就可以了。
在build.gradle文件中加入:

  1. apply from:"config.gradle"

意思是所有的子项目或者所有的modules都可以从这个配置文件中读取内容。
android节点读取ext中android对应项,dependencies读取dependencies对应项,如果配置有变化就可以只在config.gradle中修改,是不是很方便进行配置的管理呢?

检查依赖报告

运行命令./gradlew <projectname>:dependencies --configuration compile (projectname为settings.gradle里面配置的各个project,如果没有配置,直接运行./gradlew dependencies --configuration compile),会把依赖树会打印出来,依赖树显示了你 build 脚本声明的顶级依赖和它们的传递依赖:

仔细观察你会发现有些传递依赖标注了*号,表示这个依赖被忽略了,这是因为其他顶级依赖中也依赖了这个传递的依赖,Gradle会自动分析下载最合适的依赖。

排除传递依赖

Gradle允许你完全控制传递依赖,你可以选择排除全部的传递依赖也可以排除指定的依赖。

  • exclude:前面已经介绍过,可以设置不编译指定的模块,排除指定模块的依赖。后的参数有groupmodule,可以分别单独使用,会排除所有匹配项。
  1. // 编译CommonSDK模块,但是去掉此模块中对com.android.support的依赖,防止重复依赖报错
  2. compile (project(':CommonSDK')) { exclude group: "com.android.support" }
  3. compile ('com.jakewharton:butterknife:8.5.1'){
  4. exclude module: 'support-compat'
  5. exclude group: 'com.android.**.***', module: '***-***'
  6. }
  • transitive:前面已经介绍过,用于自动处理子依赖项,默认为true,gradle自动添加子依赖项。设置为false排除所有的传递依赖,可以用来解决一些依赖冲突的问题,比如一些 Error:java.io.IOException: Duplicate zip entry 报错。
  1. // 使用transitive属性设置为false来排除所有的传递依赖
  2. compile project(':extras:ShimmerAndroid'){
  3. transitive = false
  4. }
  • force:强制设置某个模块的版本。
  1. configurations.all{
  2. resolutionStrategy{
  3. force'org.hamcrest:hamcrest-core:1.3'
  4. }
  5. }

这样,应用中对org.hamcrest:hamcrest-core 依赖就会变成1.3版本。

动态版本声明

如果你想使用一个依赖的最新版本,你可以使用latest.integration,比如声明 Cargo Ant tasks的最新版本,你可以这样写org.codehaus .cargo:cargo-ant:latest-integration,你也可以用一个+号来动态的声明:

  1. dependencies {
  2. //依赖最新的1.x版本
  3. compile "org.codehaus.cargo:cargo-ant:1.+"
  4. }

然后在依赖树里面可以清晰的看到选择了哪个版本:

  1. \--- org.codehaus.cargo:cargo-ant:1.+ -> 1.3.1

http://www.open-open.com/lib/view/open1431391503529.html
http://www.jianshu.com/p/429733dbbc34

多渠道打包:

主要借助

  1. android {
  2. productFlavors{
  3. ……
  4. }
  5. }

来实现。
网上多是类似友盟的配置,copy过来:
http://blog.csdn.net/maosidiaoxian/article/details/42000913
https://segmentfault.com/a/1190000004050697
AndroidManifest.xml里面写上:

  1. <meta-data
  2. android:name="UMENG_CHANNEL"
  3. android:value="Channel_ID" />

里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。

  1. android {
  2. productFlavors {
  3. xiaomi {
  4. manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
  5. }
  6. _360 {
  7. manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
  8. }
  9. baidu {
  10. manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
  11. }
  12. wandoujia {
  13. manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
  14. }
  15. }
  16. }

或者批量修改

  1. android {
  2. productFlavors {
  3. xiaomi {}
  4. _360 {}
  5. baidu {}
  6. wandoujia {}
  7. }
  8. productFlavors.all {
  9. flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
  10. }
  11. }

然后用 ./gradlew assembleRelease 这条命令会把Product Flavor下的所有渠道的Release版本都打出来。
assemble<Product Flavor Name>: 允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1DebugFlavor1Release两个Variant版本。
在上面当中,我们也可以指定一个默认的渠道名,如果需要的话。指定默认的值是在defaultConfig节点当中添加如下内容:

  1. manifestPlaceholders = [ CHANNEL_NAME:"Unspecified"]

这里的Unspecified换成你实际上的默认的渠道名。
使用manifestPlaceholders的这种配置,同样适用于manifest的其他配置。比如你需要在不同渠道发布的apk里面,指定不同的启动Activity。比如在豌豆荚里面发布的,启动的Activity显示的是豌豆荚首发的界面,应用宝里面启动的是应用宝首发的界面(哈哈,有点坏),你就可以对你的activity的值使用 {activity_name}的方式,然后在productFlavors里面配置这个{activity_name}的值。

另外这里记录一个 productFlavors 和 applicationId 关系的小知识。
参考文档
每个 Android 应用均有一个唯一的应用 ID,我们可以在通过 productFlavors 构建的应用变体中配置不同的应用 ID。

  1. android {
  2. defaultConfig {
  3. applicationId "com.example.myapp"
  4. }
  5. productFlavors {
  6. free {
  7. applicationIdSuffix ".free"
  8. }
  9. pro {
  10. applicationIdSuffix ".pro"
  11. }
  12. }
  13. }

这样,“免费”的 applicationId 就变为“com.example.myapp.free”。

Gradle入门--基本配置的更多相关文章

  1. 项目自动化建构工具gradle 入门5——在intellij中做一个gradle的web工程

    之前的几个小节,都是纯手工建文件夹,纯手工拷贝war包,或者纯手工解压个zip看看结果,,,,这还是我写了玩的helloWorld.若是玩大工程.几十个人的团队协同开发时,这么玩,,,,暴躁的程序员估 ...

  2. 项目自动化建构工具gradle 入门2——log4j输出helloWorld

    上一章节呢,有一个能跑的程序了.但是对做工程的人来说,用日志输出感觉比用System.out要有档次一点.比如使用log4j.直接上例子: 1进入D:\work\gradle\log目录  ,您电脑没 ...

  3. gradle init.gradle的文件配置 使用

    init.gradle文件在build开始之前执行,所以你可以在这个文件配置一些你想预先加载的操作例如配置build日志输出.配置你的机器信息,比如jdk安装目录,配置在build时必须个人信息,比如 ...

  4. 【Gradle】Gradle入门

    Gradle入门 配置Gradle环境 安装之前确保已经安装配置好Java环境,要求JDK6以上,并且在环境变量里配置了JAVA_HOME,查看Java版本可以在终端输入如下命令: java -ver ...

  5. gradle入门

    gradle入门 简介: Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于 ...

  6. 项目自动化建构工具gradle 入门4——javaWeb在浏览器中显示helloWorld

    在java应用中,其实做的最多的还是java web应用.所以现在我们做的就是用gradle构建一个简单的web项目,简单点,直接上代码吧. 1.进入目录D:\work\gradle\web,新建文件 ...

  7. 项目自动化建构工具gradle 入门3——生一个exe的helloWorld

    前两次呢,我们能够用一个外部的jar 来实现输出helloWorld.但问题是我每次都要用java -jar 来执行,这样我们自己玩还可以,让用户玩就不好了.所以我们生成一个exe给他们吧.这次我们仍 ...

  8. Android studio下gradle Robolectric单元测试配置

    android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供 ...

  9. Java Gradle入门指南之简介、安装与任务管理

        这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍.    ...

随机推荐

  1. JS 实现MVC的写法

    案例:当select 下拉选择框值变化时,显示其值(不是文本) 常规写法 <h3>JavaScript no MVC</h3>  <div>   <selec ...

  2. linux下的Shell编程(8)自定义函数

    Shell Script中也可以使用自定义的函数,其语法形式如下: functionname() { - }

  3. NHibernate与IbatisNet的简单比较

    NHibernate是当前最流行的Java O/R mapping框架Hibernate的移植版本,当前版本是1.0 rc-1.它出身于sf.net..IbatisNet是另外一种优秀的Java O/ ...

  4. JAVA通过注解处理器重构代码,遵循单一职责

    前言:最近在看一个内部网关代码的时候,发现处理Redis返回数据这块写的不错,今天有时间好好研究下里面的知识点. 业务流程介绍: #项目是采用Spring Boot框架搭建的.定义了一个@Redis注 ...

  5. spark2.1操作json(save/read)

    建筑物配置信息: case class BuildingConfig(buildingid: String, building_height: Long, gridcount: Long, gis_d ...

  6. POJ-1287 Networking---裸的不能再裸的MST

    题目链接: https://vjudge.net/problem/POJ-1287 题目大意: 模板 #include<iostream> #include<cstdio> # ...

  7. 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务

    搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...

  8. Python将excel文件从xls转换为xlsx

    本文使用场景:将一个xls格式Excel文件转换为xlsx文件格式.接下来将一步一步演示该操作.你也可以对代码进行修改使其适用于你所需的场景. 安装Python3 首先需要安装Python,我这里安装 ...

  9. java--- 使用interrupte中断线程的真正用途

    Java线程之中,一个线程的生命周期分为:初始.就绪.运行.阻塞以及结束.当然,其中也可以有四种状态,初始.就绪.运行以及结束. 一般而言,可能有三种原因引起阻塞:等待阻塞.同步阻塞以及其他阻塞(睡眠 ...

  10. [LeetCode] Best Time to Buy and Sell Stock with Transaction Fee 买股票的最佳时间含交易费

    Your are given an array of integers prices, for which the i-th element is the price of a given stock ...