当前位置: 首页 > news >正文

升级Room引发的惨案!!

kotlin升级

在升级kotlin的时候,直接升级到大版本的kotlin(比如1.7以上),直接报错,只是报错不知道原因。
koltin Release details
后来把koltin版本改成1.6.0,报如下的错,我们才知道gradle是需要先升级的

所以 升级kotlin版本有问题,可以换一个别的kotlin版本试试
在这里插入图片描述
gradle升级也是一堆坑,我一开始想升级到比较新的版本7.3.3
Android Gradle 插件版本说明

可以在 Android Studio 的 File > Project Structure > Project 菜单中指定插件版本
在这里插入图片描述
但是,升级到最新版本报各种错,而且语法也变了。

7.3.3是gradle的版本,是gradle-wrapper中配置的,7.2.1是gradle的插件版本,这两个得匹配才行,在上面的文章中有对应说明。
gradle插件是配置在这儿的在这里插入图片描述
后来妥协了,只要6.1.1以上就行
gradle是6.3,gradle插件是4.0.1

kotlin 1.6.0 会在kaptGenerateStubDebugKolin卡住

不知道为什么,把kotlin版本换成了1.6.10正常了

gradle 升级过程中有个报错

gradle是6.3,gradle插件是4.0.1

没有这个问题

Caused by: java.lang.RuntimeException: Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken because the classes and Android resources from any local .aar file dependencies would not be packaged in the resulting AAR. Previous versions of the Android Gradle Plugin produce broken AARs in this case too (despite not throwing this error). The following direct local .aar file dependencies of the :modules:module_push project caused this error: /Users/zhongyili/work/AndroidStudioProjects/sohuvideo_gradle/modules/module_push/libs/vivo_pushSDK_v3.0.0.4_484.aar, /Users/zhongyili/work/AndroidStudioProjects/sohuvideo_gradle/modules/module_push/libs/com.heytap.msp.aarat com.android.build.gradle.tasks.BundleAar.getHasLocalAarDeps(BundleAar.kt:61)at jdk.internal.reflect.GeneratedMethodAccessor603.invoke(Unknown Source)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1$1.create(AbstractNestedRuntimeBeanNode.java:79)at org.gradle.internal.deprecation.DeprecationLogger.whileDisabled(DeprecationLogger.java:225)at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1.get(AbstractNestedRuntimeBeanNode.java:75)at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue.call(AbstractNestedRuntimeBeanNode.java:145)at org.gradle.api.internal.tasks.properties.AbstractValidatingProperty.validate(AbstractValidatingProperty.java:39)at org.gradle.api.internal.tasks.properties.DefaultTaskProperties.validate(DefaultTaskProperties.java:193)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.validate(ExecuteActionsTaskExecuter.java:505)at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:50)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:192)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:184)at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)... 116 more

这个意思是,library被打成aar包,里面放的aar包不会被打进最终的aar包里面,这个应该是gradle版本不同导致的,之前没升级gradle之前没事。
修改办法,在library中如下修改

-    implementation files('libs/vivo_pushSDK_v3.0.0.4_484.aar')
-    implementation files('libs/com.heytap.msp.aar')
+
+    compileOnly(name: 'vivo_pushSDK_v3.0.0.4_484', ext: 'aar')
+    compileOnly(name: 'com.heytap.msp', ext: 'aar')

把编译方式从implementation变成compileOnly

在工程的build.gradle文件中加入如下代码:

allprojects {repositories {flatDir { dirs '../frameworks/baseAarInfoLib/libs', '../baseAarInfoLib/libs', '../modules/module_push/libs' }}
}

其实就是把library中的libs文件夹作为aar包的加载源。

在application module的build.gradle文件中加入如下代码:

    api(name: 'vivo_pushSDK_v3.0.0.4_484', ext: 'aar')api(name: 'com.heytap.msp', ext: 'aar')

room升级到2.5.0

升级koltin原因就是升级了room,导致了gradle也升级

通过Android studio build 结果编译的时候一直报错,也看不出什么错
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

得通过下面的命令编译,能看到错误信息

./gradlew assembleDebug --stacktrace
Caused by: java.lang.IllegalArgumentException: Modifiers [PRIVATE] are not allowed on Kotlin parameters. Allowed modifiers: [VARARG, NOINLINE, CROSSINLINE]at com.squareup.kotlinpoet.ParameterSpec.<init>(ParameterSpec.kt:41)at com.squareup.kotlinpoet.ParameterSpec.<init>(ParameterSpec.kt:29)at com.squareup.kotlinpoet.ParameterSpec$Builder.build(ParameterSpec.kt:157)at com.squareup.kotlinpoet.FunSpec$Builder.addParameter(FunSpec.kt:500)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createPermissionRequestClass(KotlinBaseProcessorUnit.kt:452)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createPermissionRequestClasses(KotlinBaseProcessorUnit.kt:415)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createFile(KotlinBaseProcessorUnit.kt:43)at permissions.dispatcher.processor.impl.kotlin.KotlinBaseProcessorUnit.createFile(KotlinBaseProcessorUnit.kt:17)at permissions.dispatcher.processor.PermissionsProcessor.processKotlin(PermissionsProcessor.kt:68)at permissions.dispatcher.processor.PermissionsProcessor.process(PermissionsProcessor.kt:58)at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:188)at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)... 38 more

通过如下命令能知道依赖关系

 ./gradlew :sohuVideoMobile:dependencies > /Users/zhongyili/Downloads/depen6
kapt
+--- androidx.room:room-compiler:2.5.0
|    +--- androidx.room:room-common:2.5.0
|    |    +--- androidx.annotation:annotation:1.3.0
|    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
|    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
|    |         |    +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
|    |         |    \--- org.jetbrains:annotations:13.0
|    |         \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
|    |              \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    +--- androidx.room:room-compiler-processing:2.5.0
|    |    +--- com.google.auto:auto-common:0.11
|    |    |    \--- com.google.guava:guava:29.0-jre -> 31.1-jre
|    |    |         +--- com.google.guava:failureaccess:1.0.1
|    |    |         +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
|    |    |         +--- com.google.code.findbugs:jsr305:3.0.2
|    |    |         +--- org.checkerframework:checker-qual:3.12.0
|    |    |         +--- com.google.errorprone:error_prone_annotations:2.11.0
|    |    |         \--- com.google.j2objc:j2objc-annotations:1.3
|    |    +--- com.google.auto.value:auto-value-annotations:1.6.3
|    |    +--- com.google.devtools.ksp:symbol-processing-api:1.7.20-1.0.6
|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    |    +--- com.google.guava:guava:31.1-jre (*)
|    |    +--- com.intellij:annotations:12.0
|    |    +--- com.squareup:javapoet:1.13.0
|    |    +--- com.squareup:kotlinpoet:1.12.0
|    |    |    +--- org.jetbrains.kotlin:kotlin-reflect:1.7.0
|    |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.7.20 (*)
|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0 -> 1.7.20 (*)
|    |    +--- com.squareup:kotlinpoet-javapoet:1.12.0
|    |    |    +--- com.squareup:kotlinpoet:1.12.0 (*)
|    |    |    +--- com.squareup:javapoet:1.13.0
|    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0 -> 1.7.20 (*)
|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 (*)
|    |    \--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0
|    |         \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.0 -> 1.7.20 (*)
|    +--- androidx.room:room-migration:2.5.0
|    |    +--- androidx.room:room-common:2.5.0 (*)
|    |    +--- com.google.code.gson:gson:2.9.0
|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    +--- com.google.auto:auto-common:0.11 (*)
|    +--- com.google.auto.value:auto-value-annotations:1.6.3
|    +--- com.google.devtools.ksp:symbol-processing-api:1.7.20-1.0.6 (*)
|    +--- com.intellij:annotations:12.0
|    +--- com.squareup:javapoet:1.13.0
|    +--- com.squareup:kotlinpoet:1.12.0 (*)
|    +--- com.squareup:kotlinpoet-javapoet:1.12.0 (*)
|    +--- commons-codec:commons-codec:1.15
|    +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
|    +--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0 (*)
|    \--- org.xerial:sqlite-jdbc:3.36.0
+--- com.alibaba:arouter-compiler:1.5.1
|    +--- com.alibaba:arouter-annotation:1.0.6
|    +--- com.squareup:javapoet:1.8.0 -> 1.13.0
|    +--- org.apache.commons:commons-lang3:3.5
|    +--- org.apache.commons:commons-collections4:4.1
|    \--- com.alibaba:fastjson:1.2.48
\--- com.github.permissions-dispatcher:permissionsdispatcher-processor:4.9.2+--- androidx.annotation:annotation:1.0.0 -> 1.3.0+--- org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0 -> 0.5.0 (*)+--- com.squareup:javapoet:1.9.0 -> 1.13.0+--- com.squareup:kotlinpoet:1.3.0 -> 1.12.0 (*)+--- com.github.permissions-dispatcher:permissionsdispatcher-annotation:4.9.2\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.20 -> 1.7.20 (*)

这个不好搞,我把permissionsdispatcher升级到最新版本还是报这个错。我研究了一下com.squareup:kotlinpoet:1.12.0 是androidx.room:room-compiler:2.5.0引用的,这样会把permissionsdispatcher引用的kotlinpoet版本也会从1.3.0变成1.12.0

,然后就报上面的错了。即便,我强制让kotlinpoet是1.3.0版本,room2.5.0又报错了,它得用kotlinpoet1.12.0版本。这两个库使用kotlinpoet的版本有冲突

permissionsdispatcher升级折腾了几小时,包名进行了改变

妈蛋,解决不了了

可能是room版本太新,降低到2.4.3

把room版本降低到2.4.3,library aar包的问题和permissionsdispatcher的问题都没有了。

最终的配置是:
gradle是6.3,gradle插件是4.0.1,kotlin 1.6.10,room 2.4.3

太难了,折腾了我三四天

相关文章:

升级Room引发的惨案!!

kotlin升级 在升级kotlin的时候&#xff0c;直接升级到大版本的kotlin&#xff08;比如1.7以上&#xff09;&#xff0c;直接报错&#xff0c;只是报错不知道原因。 koltin Release details 后来把koltin版本改成1.6.0&#xff0c;报如下的错&#xff0c;我们才知道gradle是需…...

RPC框架:一文带你搞懂RPC

RPC是什么&#xff08;GPT答&#xff09; ChatGPT回答&#xff1a; RPC(Remote Procedure Call)是一种分布式应用程序的编程模型&#xff0c;允许程序在不同的计算机上运行。它以一种透明的方式&#xff0c;将一个程序的函数调用定向到远程系统上的另一个程序&#xff0c;而使…...

电子招标采购系统源码—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0…...

P16 激活函数与Loss 的梯度

参考&#xff1a;https://www.ngui.cc/el/507608.html?actiononClick这里面简单回顾一下PyTorch 里面的两个常用的梯度自动计算的APIautoGrad 和 Backward, 最后结合 softmax 简单介绍一下一下应用场景。目录&#xff1a;1 autoGrad2 Backward3 softmax一 autoGrad输入 x输出损…...

ThinkPHP5美食商城系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP5美食商城系统一 介绍 此美食商城系统基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。用户注册登录后可购买美食&#xff0c;个人中心&#xff0c;评论和反馈等&#xff…...

Vue3 - $refs 使用教程,父组件调用获取子组件数据和方法(setup() / <script setup>)

前言 在 Vue2 中父组件使用 $refs 调用子组件数据和方法非常简单,但在 Vue3 中这种方法行不通了。 本文实现了 Vue3 中父组件使用 $refs 获取调用子组件数据和方法教程, 并且提供了 setup() 与 <script setup> 两种 “开发模式” 的示例代码,请根据需要进行选择。 网…...

华为OD机试 - 众数和中位数(Python)| 真题+思路+考点+代码+岗位

众数和中位数 题目 众数是指一组数据中出现次数多的数 众数可以是多个中位数是指把一组数据从小到大排列,最中间的那个数, 如果这组数据的个数是奇数,那最中间那个就是中位数 如果这组数据的个数为偶数,那就把中间的两个数之和除以 2 就是中位数查找整型数组中元素的众数并…...

一眼万年的 Keychron 无线机械键盘

一眼万年的 Keychron 无线机械键盘 一款好的键盘对于程序员或者喜欢码字的人来说是非常重要的&#xff0c;而最近博主入手了自己的第一款机械键盘——Keychron 无线机械键盘。 机械键盘特点 有独立轴体&#xff0c;通过两个簧接触&#xff0c;来触发信号&#xff0c;价格相对贵…...

自动化测试高频面试题(含答案)

Hello&#xff0c;你们的好朋友来了&#xff01;今天猜猜我给大家带来点啥干货呢&#xff1f;最近很多小伙伴出去面试的时候经常会被问到跟自动化测试相关的面试题。所以&#xff0c;今天特意给大家整理了一些经常被公司问到的自动化测试相关的面试题。停&#xff0c;咱先收藏起…...

3、按键扫描检测处理

说明&#xff1a;本文处理按键的短按、长按检测执行&#xff0c;非矩阵按键 硬件可以类似如下连接即可&#xff0c;无需放置上下拉电阻&#xff1b; 按键动作分长按、短按(弹起时执行)两种 按下不放执行长按&#xff0c;但松开按键时不予执行短按函数 多个按键可以同时操作 按…...

集中式存储和分布式存储

分布式存储是相对于集中式存储来说的&#xff0c;在介绍分布式存储之前&#xff0c;我们先看看什么是集中式存储。不久之前&#xff0c;企业级的存储设备都是集中式存储。所谓集中式存储&#xff0c;从概念上可以看出来是具有集中性的&#xff0c;也就是整个存储是集中在一个系…...

【机器学习数据集】如何获得机器学习的练习数据?

一、scikit-learn自带数据集Scikit-learn内置了很多可以用于机器学习的数据&#xff0c;可以用两行代码就可以使用这些数据。自带的小的数据集为&#xff1a;sklearn.datasets.load_<name>load_bostonBoston房屋价格回归506*13fetch_california_housing加州住房回归20640…...

【编程实践】使用 Kotlin HTTP 框架 Fuel 实现 GET,POST 接口 kittinunf.fuel【极简教程】

目录 Fuel 简介 实现代码 GET网络请求用法(有三种写法࿰...

大数据DataX(一):DataX的框架设计和插件体系

文章目录 DataX的框架设计和插件体系 一、DataX是什么...

软考高级信息系统项目管理师系列之十一:项目进度管理

软考高级信息系统项目管理师系列之十一:项目进度管理 一、进度管理领域输入、输出、工具和技术表二、项目进度管理1.项目进度管理过程2.项目进度管理三、项目进度管理过程1.项目进度管理2.工作包和活动3.活动清单4.活动属性5.项目进度网络图6.资源日历7.活动资源需求8.资源分解…...

vue2版本《后台管理模式》(下)

文章目录前言一、home 页以下都属于home子组件二、header 头部 组件二、Menu 页面三、Bread 面包屑四、Footer五 、分页器&#xff1a; Pageing![在这里插入图片描述](https://img-blog.csdnimg.cn/fbe9bb7e84a04ccda4d3fc9f4ab9c36b.png#pic_center)六、权限管理总结前言 这章…...

软考中级-程序设计语言

&#xff08;1&#xff09;解释器解释源程序时不生成独立的目标代码&#xff0c;源程序和解释程序都参与到程序执行中。&#xff08;2&#xff09;编译器编译时生成独立的目标代码&#xff0c;运行时是运行与源程序等价的目标程序&#xff0c;源程序不参与执行。阶段补充&#…...

Sphinx : 高性能SQL全文检索引擎

Sphinx是一款基于SQL的高性能全文检索引擎&#xff0c;Sphinx的性能在众多全文检索引擎中也是数一数二的&#xff0c;利用Sphinx&#xff0c;我们可以完成比数据库本身更专业的搜索功能&#xff0c;而且可以有很多针对性的性能优化。 Sphinx的特点 快速创建索引&#xff1a;3分…...

ansible实战应用系列教程6:管理ansible变量

ansbile实战应用系列教程6:管理ansible变量 Ansible VariablesNaming VariablesDefining Variables在playbook中定义变量Defining Variables in Playbooks在playbooks中使用VariablesHost Variables and Group Variables使用group_vars和host_vars目录命令行定义全局变量Varia…...

java8新特性Stream流中anyMatch和allMatch和noneMatch的区别详解

1、anyMatch 判断数据列表中是否存在任意一个元素符合设置的predicate条件&#xff0c;如果是就返回true&#xff0c;否则返回false。 接口定义&#xff1a; boolean anyMatch(Predicate<? super T> predicate); 方法描述&#xff1a; 在anyMatch 接口定义中是接收 Pr…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...