日期: 2021 年 6 月 28 日

MyEclipse中JDK版本不匹配解决方法

一、问题表现形式

昨天刚搭好SpringMVC框架,今天早上试着去连接数据库,结果失败了,紧接着捣鼓了Maven,之后运行出现了一下问题,这是在网页中显示的。

%title插图%num

这是控制台的日志

严重: Context initialization failed
java.lang.IllegalArgumentException
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1230)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1174)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:847)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2555)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2544)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
四月 20, 2018 3:47:48 下午 org.apache.catalina.core.ApplicationContext log
严重: StandardWrapper.Throwable
java.lang.IllegalArgumentException
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1230)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1174)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:847)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2555)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2544)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
四月 20, 2018 3:47:48 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Allocate exception for servlet SpringMVC
java.lang.IllegalArgumentException
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1230)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1174)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:847)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2555)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2544)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:748)

二、解决方法

1.打开Window->Preferences->Java->Installed JREs

%title插图%num

2.把当前较高的JDK版本卸了(Remove)

%title插图%num

3.重启MyEclipse,开启服务器,发现没有错误了。

%title插图%num

三、总结

JDK的版本尽量选择*稳定的,不要选择太新的,因为你的其他的一些包可能更新的比较慢,他们只支持早期的JDK。但是,也不要太旧,因为有很多BUG。
————————————————

java版本不匹配解决办法

java版本不匹配解决办法

问题描述:eclipse加载新的项目后报一个错误,具体描述如下:

Description Resource PathLocation

Type Java compiler level does notmatch the version of the installed Java project facet.webattemp

Unknown FacetedProject Problem (Java Version Mismatch)

问题分析:       java版本不匹配:Facted Project 中的Java 版本设定与项目的Java 版本设定不一致。

问题解决:

在当前项目上点右键,属性–Project Facets中,配置编译版本与java compiler的版本一致。

1、选中项目后按下alt+enter组合键或者右键Project | Properties | Java Compiler(type filter text输入compiler可快速定位),如下图所示:

%title插图%num

2、修改Project Facets的Java值,使之和Compiler compliance level相同:打开方式参考1,如下图:

%title插图%num

总结:

刚开始用的是eclipse比较老的一个版本,常用的文件定位的插件装上就是识别不出来,换了一个高版本的eclipse加载项目后就报出上面的错误,因为是*次见到这个错误,以为是用的这个项目不支持高版本的eclipse呢,头说不行就用那个老版本得了,不要在这个上浪费时间,可是提高班培养出来的习惯,这样感觉就是不爽,还是想查一下再说,上网一查,这样的问题很多,当然很快就找到了解决的办法,工欲善其事,必先利其器,有了好的工具开发的时候心情好多了,自然效率也就提高了。

打开eclipse出现Incompatible JVM解决方法

安装了oracle10g的客户端后,eclipse打不开了。所以检查了一下,发现是以下原因。
运行eclipse出现以下错误:

Incompatible JVM

Version 1.3.1_01 of the JVM is not suitable for this product.Version:1.4.1 or greater is required.


Version 1.4.1_02 of the JVM is not suitable for this product.Version:1.5 or greater is required.

%title插图%num
一,系统上的JAVA JDK版本过低,去装高版本的JDK.

二,这个是*有可能是装了oracle了,因为oracle是使用1.3JVM的而eclipse是需要1.4或1.5以上JVM的。

解决方法:就是在环境变量中把JDK的的路径放到Oracle JDK的前面就可以解决

————————————————

Android:Duplicate class inxmlbeans-2.6.0.jar

Android Studio:3.4.1
还是在瞅easyExcel的时候,出现Duplicate class…found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)的问题。

问题

%title插图%num
Duplicate class org.apache.xmlbeans.xml.stream.Location found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)
Duplicate class org.apache.xmlbeans.xml.stream.ReferenceResolver found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)
Duplicate class org.apache.xmlbeans.xml.stream.XMLEvent found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)
Duplicate class org.apache.xmlbeans.xml.stream.XMLInputStream found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)
Duplicate class org.apache.xmlbeans.xml.stream.XMLName found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)
Duplicate class org.apache.xmlbeans.xml.stream.XMLStreamException found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)
Duplicate class org.apache.xmlbeans.xml.stream.utils.NestedThrowable found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)
Duplicate class org.apache.xmlbeans.xml.stream.utils.NestedThrowable$Util found in modules xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0) and xmlbeans-2.6.0.jar (org.apache.xmlbeans:xmlbeans:2.6.0)

Go to the documentation to learn how to Fix dependency resolution errors.

解决
疑似2.6.0的bug,在module级build.gradle文件的dependencies中增加xmlbeans3.1.0的依赖即可解决

compile group: ‘org.apache.xmlbeans’, name: ‘xmlbeans’, version: ‘2.6.0’

建议在android中增加multiDexEnable设置

multiDexEnable true

如下图:

%title插图%num

————————————————

Android support和Androidx库不能共存问题

一、问题描述
今天升级了android studio3.4.1,导入以前的一个旧项目,并且升级了lottie-android动画库到*新版本3.0.3,编译发现出现如下报错:

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add ‘tools:replace=”android:appComponentFactory”‘ to <application> element at AndroidManifest.xml:5:5-20:19 to override.

于是按照报错日志提示,在AndroidManifest.xml的application中添加tools:replace=”android:appComponentFactory”,如下所示:

<application
android:allowBackup=”true”
android:icon=”@mipmap/ic_launcher”
android:label=”@string/app_name”
android:roundIcon=”@mipmap/ic_launcher_round”
android:supportsRtl=”true”
android:theme=”@style/AppTheme”
tools:ignore=”AllowBackup,GoogleAppIndexingWarning”
tools:replace=”android:appComponentFactory”>

然后编译继续报错如下:

Caused by: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ‘:app:processDebugManifest’.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:119)
at org.gradle.api.internal.tasks.execution.ResolvePreviousStateExecuter.execute(ResolvePreviousStateExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:94)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:56)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
… 6 more
Caused by: java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs
at com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:558)
at com.android.build.gradle.tasks.ProcessApplicationManifest.doFullTaskAction(ProcessApplicationManifest.java:208)
at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
at sun.reflect.GeneratedMethodAccessor849.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:284)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:273)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:258)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:145)
at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:49)
at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:33)
at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:43)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:29)
at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:134)
at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$3(CacheStep.java:83)

通过查看日志知道这是AndroidManifest中的报错,然后到AndroidManifest.xml的Merged Manifest中查看报错信息为:

Merging Errors:
Error: tools:replace specified at line:5 for attribute android:appComponentFactory, but no new value specified app main manifest (this file), line 4
Error: Validation failed, exiting app main manifest (this file)

 

上面所说的意思就是,我们没有给android:appComponentFactory指定新的值,所以在application中继续添加android:appComponentFactory=”android.support.v4.app.CoreComponentFactory”,如下:

<application
android:allowBackup=”true”
android:icon=”@mipmap/ic_launcher”
android:label=”@string/app_name”
android:roundIcon=”@mipmap/ic_launcher_round”
android:supportsRtl=”true”
android:theme=”@style/AppTheme”
tools:ignore=”AllowBackup,GoogleAppIndexingWarning”
tools:replace=”android:appComponentFactory”
android:appComponentFactory=”android.support.v4.app.CoreComponentFactory”>

结果编译又出现报错,如下:

Caused by: com.android.ide.common.workers.WorkerExecutorException: 1 exception was raised by workers:
java.lang.RuntimeException: Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub$Proxy found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.graphics.drawable.IconCompatParcelizer found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub$Proxy found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$1 found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$MyResultReceiver found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$MyRunnable found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.core.graphics.drawable.IconCompatParcelizer found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.core.internal.package-info found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.versionedparcelable.CustomVersionedParcelable found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.NonParcelField found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelField found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelImpl found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelImpl$1 found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelUtils found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel$1 found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel$ParcelException found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelParcel found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream$FieldBuffer found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream$InputBuffer found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelable found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelize found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)

 

从日志中可以看出,这是因为Android support和Androidx库不能共存引起的编译报错。因为*新的lottie-android动画库已经使用了Androidx库,而我的项目使用的还是Android support库,从而引起的冲突。因此解决办法有两种。

二、解决办法
方法一:将Android support库转换为Androidx库
(1)将build tools更新到3.4.1,如下:

dependencies {
classpath ‘com.android.tools.build:gradle:3.4.1’
}

gradle更新到5.1.1,如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

依赖库统一更新到28.0.0,如下:

dependencies {
implementation fileTree(dir: ‘libs’, include: [‘*.jar’])
implementation”org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version”
implementation ‘com.android.support:appcompat-v7:28.0.0’
implementation ‘com.airbnb.android:lottie:3.0.3’
}

这一步非常重要,不然会导致第二步转换不成功。

(2)完成(1)之后,右键工程→Refactor→Migrate to AndroidX…,如下图所示:

%title插图%num

(3)选中所有需要重命名的目录,点击Do Refactor,如下图所示:

%title插图%num

(4)执行上面的步骤之后,发现Android support库已经被全部替换成了Androidx库了,至此项目已经可以成功的运行了。

方法二:将Androidx库转换为Android support库
前面已经说过了,这个问题是由于升级了lottie-android动画库到*新版本引起的,所以我们只需要将lottie-android动画库的版本降低到它使用Android support库的版本就可以了,其他的第三方库也是同样的解决方法,但是由于后续会更新升级第三方库,所以不推荐使用此方案解决这个问题,推荐使用方法一解决这样的报错问题。
————————————————

教程:mysql数据库规范详解

教程:mysql数据库规范详解
基础规范
【建议】使用InnoDB存储引擎
【强制】无特殊要求必须使用UTF8字符集
【强制】数据表、数据字段必须加入中文注释
【强制】禁止使用存储过程、视图、触发器、Event。特殊情况申请评审
【强制】不在数据库做运算,cpu计算务必移至业务层
命名规范
【建议】 命名使用具有实际意义的英文词汇、词汇缩写,词汇之间使用下划线分隔;
【强制】 命名只能使用小写英文字母、数字、下划线,且必须英文字母开头,下划线为分割符,不能超过32个字符,数据库对象名尽可能简短。避免使用MySQL的保留字
【强制】普通表名命名规则为功能模块前缀_+tablename(login_users); 临时表:tmp前缀+tablename+8位时间后缀(tmp_users_20170501); 备份表:bak前缀+tablename+8位时间后缀(bak_users_20170501); 归档表命名规则:arch前缀+tablename+归档规则 (arch _users_2013)【强制】各表之间相同意义的字段必须同名,数据类型、长度、单位必须相同。
【强制】索引以idx_开头唯一索引以uq_idx开头,后面跟索引所在字段名,多单词组成的列名,取尽可能代表意义的缩写,如t_user_contacts表member_id和friend_id上的组合索引:idx _mid_fid,,组合索引命名应注意字段顺序。如在字段member_id和字段user_id上创建组合索引,则可以命名为idx _uid_mid(userid, member_id)
常用约定:
【建议】序号列字段:以id为后缀,如:user_id表示用户编号
【建议】编码字段:以code为后缀,如:cust_code表示客户编码
【建议】布尔值字段:以“is_”前缀+字段描述+形容词。如member表上表示为enabled的会员的列命名为is_member_enabled。0:否;1:是
【强制】状态字段:以“_status”为后缀,前面加业务逻辑名。如:用户状态可命名为user_status,订单状态为order_status 以此类推
表设计规范(***)
【强制】表设计必须有表主键,并且主键不能提供给外部系统,给外部系统的必须使用业务主键,如user表的业务主键设计,如下id 表主键,自增,表主键不能像外部系统提供 xxx_id 为业务主键,使用IdGenerater(id生成工具类生成,见附件),可以提供给外部系统,使用bigint存储
【强制】表必须有主键,如果使用auto_increment作为自增主键,注意导出初始化脚本时不要设置起始值。
【强制】枚举类型使用tinyint类型
【强制】单表字段数不要太多,*多不要大于50个,且尽可能的少用字符型数据类型
【强制】日期的数据(不包含时分秒的),使用int(11)存储(如,yyyy、yyyyMM、yyyyMMdd),时间的数据((包含时分秒的)),使用datetime存储。
【强制】每个表都必须包含两个保留字段:create_time(创建时间),update_time(*后修改时间)creater varchar(50)(创建人),updater varchar(50)(修改人),设置为非空字段属性。这两个字段不包含额外的业务逻辑。
【强制】每个表设置is_del(0为未删除,1为删除)标记位字段,设置为非空,默认为0的字段属性,生产环境不允许物理删除。特殊表再议
【强制】表和列定义的时候必须加上comment,并能精确描述表和列的含义。类型、状态等字段必须明确给出各个值代表的含义;金钱等计量字段必须给出精确的计量单位;外键字段必须明确给出关联的表和字段
【强制】若需要JOIN的字段(连接键),字段名称、数据类型、长度和单位必须保持*对一致,避免隐式转换
【强制】禁止使用TEXT、BLOB类型(大文本、大文件、大照片存放在文件系统),可以把文件放到文件服务器中,数据库只存url
【强制】不推荐使用enum,set。因为它们浪费空间,且枚举值写死了,变更不方便。推荐使用tinyint或smallint
【强制】如果有业务流转的加字段:业务流水号
【强制】如果一次操作多张表需要查看修改或者回退操作的,加操作流水号
【强制】禁止创建外键约束,外键约束由应用程序控制。外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,影响sql 的性能,甚至会造成死锁。
【强制】排序字段都不允许为空,并设置默认值。
字段设计规范
【强制】字符串类型一律使用VARCHAR类型,对于明确长度的建议使用char,如身份证号等
【强制】禁止使用TEXT、BLOB类型。会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能
【建议】字段定义为NOT NULL并且提供默认值。null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化;需要更多的存储空;只能采用is null或is not null,而不能采用=、in、=’2017-02-15′– 正确的写法是: SELECT uid FROM t_user WHERE day>= xxxfunc (‘2017-02-15 00:00:00’)
【强制】禁止使用OR条件。使用IN或者UINON代替
【强制】禁止大表使用JOIN查询,禁止大表使用子查询。*大影响数据库性能
【强制】禁止负向查询,以及%开头的模糊查询。a)负向查询条件:NOT、!=、、!、NOT IN、NOT LIKE等,会导致全表扫描 b)%开头的模糊查询,会导致全表扫描
【强制】使用IN不能超过200
【建议】UNION ALL 代替 UNION操作。
【建议】order by的顺序尽量与索引保持一致
【强制】大批量更新凌晨操作,避开高峰

mysql数据库规范详解

mysql数据库规范详解
基础规范
【建议】使用InnoDB存储引擎
【强制】无特殊要求必须使用UTF8字符集
【强制】数据表、数据字段必须加入中文注释
【强制】禁止使用存储过程、视图、触发器、Event。特殊情况申请评审
【强制】不在数据库做运算,cpu计算务必移至业务层
命名规范
【建议】 命名使用具有实际意义的英文词汇、词汇缩写,词汇之间使用下划线分隔;
【强制】 命名只能使用小写英文字母、数字、下划线,且必须英文字母开头,下划线为分割符,不能超过32个字符,数据库对象名尽可能简短。避免使用MySQL的保留字
【强制】普通表名命名规则为功能模块前缀_+tablename(login_users); 临时表:tmp前缀+tablename+8位时间后缀(tmp_users_20170501); 备份表:bak前缀+tablename+8位时间后缀(bak_users_20170501); 归档表命名规则:arch前缀+tablename+归档规则 (arch _users_2013)【强制】各表之间相同意义的字段必须同名,数据类型、长度、单位必须相同。
【强制】索引以idx_开头唯一索引以uq_idx开头,后面跟索引所在字段名,多单词组成的列名,取尽可能代表意义的缩写,如t_user_contacts表member_id和friend_id上的组合索引:idx _mid_fid,,组合索引命名应注意字段顺序。如在字段member_id和字段user_id上创建组合索引,则可以命名为idx _uid_mid(userid, member_id)
常用约定:
【建议】序号列字段:以id为后缀,如:user_id表示用户编号
【建议】编码字段:以code为后缀,如:cust_code表示客户编码
【建议】布尔值字段:以“is_”前缀+字段描述+形容词。如member表上表示为enabled的会员的列命名为is_member_enabled。0:否;1:是
【强制】状态字段:以“_status”为后缀,前面加业务逻辑名。如:用户状态可命名为user_status,订单状态为order_status 以此类推
表设计规范(***)
【强制】表设计必须有表主键,并且主键不能提供给外部系统,给外部系统的必须使用业务主键,如user表的业务主键设计,如下id 表主键,自增,表主键不能像外部系统提供 xxx_id 为业务主键,使用IdGenerater(id生成工具类生成,见附件),可以提供给外部系统,使用bigint存储
【强制】表必须有主键,如果使用auto_increment作为自增主键,注意导出初始化脚本时不要设置起始值。
【强制】枚举类型使用tinyint类型
【强制】单表字段数不要太多,*多不要大于50个,且尽可能的少用字符型数据类型
【强制】日期的数据(不包含时分秒的),使用int(11)存储(如,yyyy、yyyyMM、yyyyMMdd),时间的数据((包含时分秒的)),使用datetime存储。
【强制】每个表都必须包含两个保留字段:create_time(创建时间),update_time(*后修改时间)creater varchar(50)(创建人),updater varchar(50)(修改人),设置为非空字段属性。这两个字段不包含额外的业务逻辑。
【强制】每个表设置is_del(0为未删除,1为删除)标记位字段,设置为非空,默认为0的字段属性,生产环境不允许物理删除。特殊表再议
【强制】表和列定义的时候必须加上comment,并能精确描述表和列的含义。类型、状态等字段必须明确给出各个值代表的含义;金钱等计量字段必须给出精确的计量单位;外键字段必须明确给出关联的表和字段
【强制】若需要JOIN的字段(连接键),字段名称、数据类型、长度和单位必须保持*对一致,避免隐式转换
【强制】禁止使用TEXT、BLOB类型(大文本、大文件、大照片存放在文件系统),可以把文件放到文件服务器中,数据库只存url
【强制】不推荐使用enum,set。因为它们浪费空间,且枚举值写死了,变更不方便。推荐使用tinyint或smallint
【强制】如果有业务流转的加字段:业务流水号
【强制】如果一次操作多张表需要查看修改或者回退操作的,加操作流水号
【强制】禁止创建外键约束,外键约束由应用程序控制。外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,影响sql 的性能,甚至会造成死锁。
【强制】排序字段都不允许为空,并设置默认值。
字段设计规范
【强制】字符串类型一律使用VARCHAR类型,对于明确长度的建议使用char,如身份证号等
【强制】禁止使用TEXT、BLOB类型。会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能
【建议】字段定义为NOT NULL并且提供默认值。null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化;需要更多的存储空;只能采用is null或is not null,而不能采用=、in、=’2017-02-15′– 正确的写法是: SELECT uid FROM t_user WHERE day>= xxxfunc (‘2017-02-15 00:00:00’)
【强制】禁止使用OR条件。使用IN或者UINON代替
【强制】禁止大表使用JOIN查询,禁止大表使用子查询。*大影响数据库性能
【强制】禁止负向查询,以及%开头的模糊查询。a)负向查询条件:NOT、!=、、!、NOT IN、NOT LIKE等,会导致全表扫描 b)%开头的模糊查询,会导致全表扫描
【强制】使用IN不能超过200
【建议】UNION ALL 代替 UNION操作。
【建议】order by的顺序尽量与索引保持一致
【强制】大批量更新凌晨操作,避开高峰

测试的价值和目的

测试的价值和目的
这个角色类似于软件开发-测试工程师(SDET),但是有更大的责任来分享他们所引入的学科的知识和热情。
虽然SDET往往一次驻留在一个团队中,但是测试教练的角色可以跨多个团队。
测试教练在原则上类似于Scrum大师或敏捷教练,但不一定是专家。他们只是拥护这一事业的人,如果需要,在底层工作以帮助在开发人员之间灌输文化变化,与产品所有者、领域专家和管理人员一起工作,以帮助将故事扩展到“轻度结构化”的场景中,并在开发工作和测试编写方面进行协作。
测试教练还会听取每个团队的意见,并在测试无效时调整测试过程。
因此,作为一个带着“山”隐喻的测试教练,你的日常生活可以包括以下任何一种活动:
遵循BDD,或至少类似于BDD的流程,并编写自动化验收测试—Cucumber、Fitnesse、Gauge等。
编写和重构代码,以及单元测试和组件测试
鼓励三个amigos风格的会议,其中BA、开发人员和测试人员将用户故事扩展到它的细节—场景/示例,等等;每个涉众都提供了他们对问题的独特观点
倾听和学习——项目中的其他人也有技能和经验;利用这一点来提高自己,同时也使过程适应于人和项目本身。
例如,我在11:FS中发现了这一点,他们已经接受了一个反应性的、基于cqrs的微服务体系结构。我*初的目标是为所有业务场景(包括不愉快的路径)引入e2e测试,但这会使验收测试过于笨拙、运行缓慢,甚至很脆弱,因为单个微服务部署可能会破坏一些不相关的测试。相反,我们保留了满意的路径场景,并将大多数不满意的路径作为组件级测试编写在每个微服务中。结果是良好的全面的需求覆盖,以及仍然快速完成的测试套件。
换句话说,我们避免了臭名昭著的“反向测试金字塔”反模式……实际上,我们*终得到了更多的测试钻石,大多数测试在服务级别进行。这可能不是每个项目的理想,但在这个特殊的情况下,它是理想的。
促使开发人员以面向领域的方式编写测试:即测试业务行为,而不是测试代码的内部结构
这方面有一个很好的例子:*近我一直在与Parallel Agile (PA)密切合作,这是一家与南加州大学(University of South California, USC)关系密切的公司。PA的主要产品是CodeBot,一款基于云的企业代码生成器。实际上,CodeBot更像是一个可执行的架构生成器,因为它从UML域模型创建并部署了一个完整的服务器平台。这样一个“规则密集”的项目需要一套全面的测试,尤其是在产品继续使用新功能进行扩展的情况下。
这些测试包括比我通常编写的更多的低级单元测试,因为底层生成器“引擎”非常复杂。但是,我们通过从许多业务和技术领域提供it示例类模型,使单元测试集中于业务领域。当然,这种方法也可以扩展到更高级别的服务测试。
促使BAs和产品所有者规划业务领域,并确保每个故事都已扩展到足够详细的内容,以便开发人员进行分析,并编写验收测试场景。要做好这一点,需要探索不快乐的路径,而不是快乐的路径。人们喜欢关注目标(有趣的东西,真的),需要经常提醒他们也要考虑边缘情况,以及当事情出错时他们想要发生什么——或者只是发生了不同的事情。
在其他好处中,这确实有助于改进sprint评估。几年前,在一个组织中,我们注意到一个趋势:sprint燃尽图——显示当前两周sprint剩余的估计工作量——会在*周很好地“燃尽”,然后在第二周转向并再次燃尽。剩余的工作量常常比开始的时候还要多!
只有当我们开始将每个故事扩展到测试场景并详细分析这些场景时,问题才变得明显起来。团队是基于不完整的知识来评估每个故事的……我们一直在做“愉快的路径评估”,这意味着每个故事中可能有90%的功能——错误处理、以业务为中心的替代课程等等——都缺失了。这个问题非常普遍,经常导致对任务的低估和成本超支;但这很容易解决。
这表明,面向领域的测试方法可以对项目的整体健康状况产生积*的影响,而不仅仅是对代码和测试的状态。
将测试人员(或测试中的开发人员)推向一个特定的方向,这样他们的验收测试就可以直接从故事场景中驱动,并且同样地探索不愉快的路径,而不是愉快的路径。
当然,这是一个很大的推动。这甚至看起来像是强迫,但实际情况远非如此。就像一寸一寸地移动一面巨大的镜子,你在慢慢地引导团队的参照系,直到你的信息突然到位。这也有助于涉众自己得出正确的结论,从而进一步加强结果。
当然,你不能自己移动镜子;这就是为什么人们的支持是如此重要。利益相关者将会认同过程的原则和目标,如果他们能看到这将使他们的生活更容易,并产生更高质量的产品。
总的来说,测试教练是一个要求高、技能高的角色。您必须很好地掌握您正在“推动”涉众的所有规程。你必须有很好的人际交往技巧,或者至少有一种展示事物的技巧,这样人们就会意识到你是站在他们一边的,和他们一起工作。
例如,在一家公司,我正在展示我们合作的新的自动化测试策略,并且有传言(特别是来自高层管理人员的传言)说这听起来“太像QA了”。公司想要代码质量和测试,但是他们坚决不希望有一个“QA部门”。挖了很久才找到原因;结果证明,解决方案更多的是战略命名,而不是做任何巨大的改变。
“我们需要测试人员,但不要叫他们QA”
在这种敏捷的环境下,对于许多组织来说,QA已经变成了一个肮脏的词汇。然而,对许多人来说,QA现在已经成为瀑布式、大爆炸式集成、流程超负荷、需要填写很长的表单、以及与开发人员分离的部门的同义词,这是不公平的,它提倡软件交付采用“将QA抛给测试人员”的方法。
但是让我们诚实地说,测试教练的目的与QA的目的非常相似:引入并维护一个使团队关注软件质量的过程。
但他们的做法是不同的。像SDET一样,测试教练在每个开发团队中工作,参与他们的日常活动。职责之间仍然存在明显的分离,但是对于任何潜在的问题、业务领域和实际交付的内容,仍然有一个共同的理解。
测试指导鼓励高度集成的设置,产品所有者、测试人员和开发人员一起工作。
因此,即使测试教练完成了与QA相同的一组目标,他们也提供了一种方法,将面向质量的文化变更引入“受敏捷影响”的组织,同时在实践和原则的范围内操作,正是这些实践和原则使得敏捷如此流行。也许这是后敏捷主义?

Nginx 的请求处理流程你了解多少

Nginx 的请求处理流程你了解多少
之前我们已经讲解了 Nginx 的基础内容,接下来我们开始介绍 Nginx 的架构基础。
为什么我们要讨论 Nginx 的架构基础?
因为 Nginx 运行在企业内网的*外层也就是边缘节点,那么他处理的的流量是其他应用服务器处理流量的数倍,甚至几个数量级,我们知道任何一种问题在不同的数量级下,他的解决方案是完全不同的,所以在 Nginx 它所处理的应用场景中,所有的问题都会被放大,所以我们必须要去理解,为什么 Nginx 采用 master-worker 这样的一种架构模型,为什么 worker 进程的数量要和 CPU 的核数相匹配?当我们需要在多个 worker 进程之间共享数据的时候,为什么在 TLS 或者说限流、限速这样的场景,他们的共享方式是有所不同的,那么这些都需要我们对 Nginx 的架构有一个清晰的了解。
下面我们先来看一下 Nginx 的请求处理流程。
为什么要去看 Nginx 中的请求处理流程呢?因为其实在之前中我们了解到 Nginx 会记录 access 日志和 error 日志,也可以处理静态的资源,那么也可以做反向代理,那么这些东西我们从 Nginx 内部去看他究竟是怎样处理这些请求,它包含一些什么样的组成部分呢?
Nginx 的请求处理流程
我们从这张图的*左边来看,*左边在 WEB、EMAIL 和 TCP,也就是说大致有三种流量从这里进入 Nginx 以后,我们 Nginx 中有三个大的状态机,一个是处理 TCP/UDP 的 4 层的传输层状态机和处理应用层的 HTTP 状态以及处理邮件的 MAIL 状态机。
那么为什么我们叫它状态机呢?是因为 Nginx 核心的这个大绿色的框他是用非阻塞的事件驱动处理引擎就是用我们所熟知的 epoll,那么一旦我们使用这种异步处理引擎以后,通常都是需要用状态机来把这个请求正确的识别和处理。
基于这样的一种事件状态处理机,我们在解析出请求需要访问静态资源的时候,我们看到走左下方的这个箭头,那么它就找到了静态资源,如果我们去做反向代理的时候呢,那么对反向代理的内容,我可以做磁盘缓存,缓存到磁盘上,也在下面左下方这条线,但是我们在处理静态资源的时候,会有一个问题就是当整个内存已经不足以完全的缓存所有的文件和信息的时候,那么像 send File 这样的调用或者 AIO 会退化成阻塞的磁盘调用,所以在这里我们需要有一个线程池来处理,对于每一个处理完成的请求呢,我们会进入 access 日志或 error 日志。
那么这里也是进入了磁盘中的,当然我们可以通过 syslog 协议把它进入到远程的机器上,那么更多的时候我们的 Nginx 是作为负载均衡或者反向代理来使用的,就是我们可以把请求通过协议级(HTTP,Mail 及 stream(TCP))传输到后面的服务器,也可以通过例如应用层的一些协议(FastCGI、uWSGI、SCGI、memcached)代理到相应的应用服务器。以上就是 Nginx 的请求处理流程。

Python教程:Numpy的安装

Python教程:Numpy的安装
一、numpy简介
NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词– Numerical和Python。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:
机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。
图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下*自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。
二、numpy安装
numpy要求python版本在3.5以上
1.windows下的安装
pip安装
python -m pip install  numpy scipy matplotlib ipython jupyter pandas sympy nose -i https://pypi.douban.com/simple/
#建议使用用户安装,将–user标志发送给pip。 pip为本地用户安装软件包,并且不写入系统目录。
手动安装
到https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy下载和系统python版本匹配的whl包,注意区分32位和64位。
#numpy‑1.18.4 + mkl‑cp37‑cp37m‑win_amd64.whl
pip install numpy‑1.18.4 + mkl‑cp37‑cp37m‑win_amd64.whl
2.ubuntu下安装
sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
3.centos下安装
sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel
手动安装
# 安装依赖
[root@localhostmyhaspl]#yum install gcc
[root@localhostmyhaspl]#yum install python-devel
[root@localhostmyhaspl]# wget http://jaist.dl.sourceforge.net/project/numpy/NumPy/1.11.2/numpy-1.11.2.tar.gz
[root@localhost myhaspl]# tar -xzvf numpy-1.11.2.tar.gz
[root@localhost myhaspl]# cd numpy-1.11.2
[root@localhost numpy-1.11.2]# python setup.py install
4.mac下安装
python -m pip install numpy scipy matplotlib
手动安装
首先到https://sourceforge.net/projects/numpy/files/下载安装包;然后解压。到安装目录下执行:
sudo python setup.py install
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速