Java代码质量检查工具及使用案例

2023-11-05

前言

在现在的软件开发中,由于软件的复杂度越来越高,业务也覆盖很广,各个业务模块业务错综复杂。这样就需要我们需要团队开发,在我们团队中开发人员的经验、代码风格样式都不一致,以及缺乏统一的标准,从而导致我们的整个项目的的代码难以阅读,不便于后期维护。这几天在研究代码质量管理,根据在网上搜集的资料及跟前辈学的一点经验整理一下,有需要的同学们可以查看,也便于以后自己回顾。

主要对下面的七块进行分析

编码格式规范

代码重复

代码覆盖率

依赖项分析

复杂度监控

Java模拟技术

代码评审和重构

接下来的使用Eclipse 插件来揭示这些分析领域:

编码格式规范:codeStyle和CheckStyle

代码重复:PMD 的 CPD

代码覆盖率:Coverlipse或者Emma

依赖项分析:JDepend

复杂度监控:Metrics

Java模拟技术:EasyMock、PowerMock

代码评审和重构:Jupiter

编码格式规范

codestyle介绍

统一的代码规范能提高代码的可读性、可维护性。

一般规则和格式规范:如代码缩进、程序块规范、每行最大代码长度;

命名规范:如包名、类名、接口名、枚举、属性名、方法名、参数名等命名规则;

文档规范:如类文件头注释、变量注释、方法注释等;

编程规范:如异常、并发、多线程等;

其它规范:如日志格式等。

图1

可以导入代码格式,实现统一。

checkstyle介绍

安装checkstyle 的Eclipse插件

1.下载地址:

http://pan.baidu.com/s/1o6LOSwM

2.解压
net.sf.eclipsecs-updatesite_5.6.1.201306282206-bin.zip文件,到系统路径下。如:D:\geyouchao\eclipse-plugins\cs(注:一定不用起名为checkstyle,不知道为什么此名就是安装不成功),此文件夹下有两个文件夹features、plugins。

3.我们使用link的方式安装。在Eclipse的dropins文件夹下新建checkstyle.link文件,内容为:

path=D:\\geyouchao\\eclipse-plugins\\cs

4.关闭Eclipse,重启。然后在Eclipse的window》Preferences下就可以看到checkstyle菜单,安装成功,如下图

图2

使用checkstyle

自定义CheckStyle规则,下面是我定义的CheckStyle模板,然后导入

图3

把新导入的,设置为默认

图4

可以修改其中的值,点击“Configure…”按钮。

图5

下面是我自定义的CheckStyle.xml文件,供参考。

<xml version="1.0"encoding="UTF-8">
<!DOCTYPE module PUBLIC "-//PuppyCrawl//DTD Check Configuration 1.2//EN""http://www.puppycrawl.com /dtds/configuration_1_2.dtd">
<module name="Checker">
<propertyname="severity" value="warning"/>
<property name="charset" value="UTF-8"/>
<!-- 长度方面的检查 -->
<!-- 文件长度不超过1500行 -->
<module name="FileLength">
<property name="max" value="1500" />
</module>
<module name="TreeWalker">
<!-- javadoc的检查 -->
<!-- 检查所有的interface和class -->
<module name="JavadocType" />
<!-- 命名方面的检查 -->
<!-- 局部的final变量,包括catch中的参数的检查 -->
<module name="LocalFinalVariableName" />
<!-- 局部的非final型的变量,包括catch中的参数的检查 -->
<module name="LocalVariableName" />
<!-- 包名的检查(只允许小写字母) -->
<module name="PackageName">
<property name="format"value="^[a-z]+ (\.[a-z][a-z0-9]*)*$" />
</module>
<!--仅仅是static型的变量(不包括static final型 )的检查 -->
<module name="StaticVariableName" />
<!-- 类型(Class或Interface)名的检查 -->
<module name="TypeName" />
<!-- 非static型变量的检查 -->
<module name="MemberName" />
<!-- 方法名的检查 -->
<module name="MethodName" />
<!-- 方法的参数名 -->
<modulename="ParameterName " />
<!-- 常量名的检查 -->
<module name="ConstantName" />
<!-- 没用的import检查,比如:1.没有被用到 2.重复的 3.import java.lang的 4.import 与该类在同一个package的 -->
<module name="UnusedImports" />
<!-- 每行不超过150个字-->
<module name="LineLength">
<property name="max" value="150" />
</module>
<!-- 方法不超过150行 -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF"/>
<property name="max"value="150" />
</module>
<!-- 方法的参数个数不超过5个。并且不对构造方法进行检查-->
<module name="ParameterNumber">
<property name="max" value="5" />
<property name="tokens" value="METHOD_DEF"/>
</module>
<!-- 空格检查 -->
<!-- 允许方法名后紧跟左边圆括号"(" -->
<module name="MethodParamPad" />
<!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
<module name="TypecastParenPad" />
<!-- 关键字 -->
<!--
每个关键字都有正确的出现顺序。比如 public static final XXX 是对一个常量的声明。如果使用 static
public final 就是错误的
-->
<module name="ModifierOrder" />
<!-- 多余的关键字 -->
<module name="RedundantModifier" />
<!-- 对区域的检查 -->
<!-- 不能出现空白区域 -->
<module name="EmptyBlock" />
<!-- 所有区域都要使用大括号 -->
<module name="NeedBraces" />
<!-- 多余的括号 -->
<module name="AvoidNestedBlocks">
<property name="allowInSwitchCase" value="true"/>
</module>
<!-- 编码方面的检查 -->
<!-- 不许出现空语句 -->
<module name="EmptyStatement" />
<!-- 不允许魔法数 -->
<module name="MagicNumber">
<property name="tokens"value="NUM_DOUBLE, NUM_INT" />
</module>
<!-- 多余的throw -->
<module name="RedundantThrows" />
<!-- String的比较不能用!= 和 == -->
<module name="StringLiteralEquality" />
<!-- if最多嵌套3层 -->
<module name="NestedIfDepth">
<property name="max" value="3" />
</module>
<!-- try最多被嵌套2层 -->
<module name="NestedTryDepth">
<property name="max" value="2" />
</module>
<!-- clone方法必须调用了super.clone() -->
<module name="SuperClone" />
<!-- finalize 必须调用了super.finalize() -->
<module name="SuperFinalize" />
<!-- 不能catch java.lang.Exception -->
<module name="IllegalCatch">
<property name="illegalClassNames"value="java.lang.Exception" />
</module>
<!-- 确保一个类有package声明 -->
<module name="PackageDeclaration" />
<!-- 一个方法中最多有3个return -->
<modulename="ReturnCount">
<property name="max" value="3" />
<property name="format" value="^$" />
</module>
<!--
根据 Sun 编码规范, class 或 interface 中的顺序如下: 1.class 声明。首先是 public,
然后是protected , 然后是 package level (不包括access modifier )最后是private .
(多个class放在一个java文件中的情况) 2.变量声明。首先是 public, 然后是protected然后是 package
level (不包括access modifier )最后是private . (多个class放在一个java文件中的情况)
3.构造函数 4.方法
-->
<module name="DeclarationOrder" />
<!-- 同一行不能有多个声明 -->
<module name="MultipleVariableDeclarations" />
<!-- 不必要的圆括号 -->
<module name="UnnecessaryParentheses" />
<!-- 检查并确保所有的常量中的L都是大写的。因为小写的字母l跟数字1太象了 -->
<module name="UpperEll" />
<!-- 检查数组类型的定义是String[] args,而不是String args[] -->
<module name="ArrayTypeStyle" />
<!-- 检查java代码的缩进默认配置:基本缩进4个空格,新行的大括号:0。新行的case 4个空格
<module name="Indentation" />
</module>
</module>

下面是使用CheckStyle检查过得代码

图6

常见错误分析

常见的CheckStyle错误有这些:

1.Type is missing a javadoc commentClass

缺少类型说明

2.“{” should be on the previous line

“{” 应该位于前一行

3.Methods is missing a javadoc comment

方法前面缺少javadoc注释

4.Expected@throwstag for “Exception”

在注释中希望有@throws的说明

5.“.” Is preceeded with whitespace “.”

前面不能有空格

6.“.” Is followed by whitespace“.”

后面不能有空格

7.“=” is not preceeded with whitespace

“=” 前面缺少空格

8.“=” is not followed with whitespace

“=” 后面缺少空格

9.“}” should be on the same line

“}” 应该与下条语句位于同一行

10.Unused@paramtag for “unused”

没有参数“unused”,不需注释

11.Variable “CA” missing javadoc

变量“CA”缺少javadoc注释

12.Line longer than 80characters

行长度超过80

13.Line contains a tab character

行含有”tab” 字符

14.Redundant “Public” modifier

冗余的“public”modifier

15.Final modifier out of order with the JSL

suggestionFinal modifier的顺序错误

16.Avoid using the “.*” form of import

Import格式避免使用“.*”

17.Redundant import from the same package

从同一个包中Import内容

18.Unused import-java.util.list

Import进来的java.util.list没有被使用

19.Duplicate import to line 13

重复Import同一个内容

20.Import from illegal package

从非法包中 Import内容

21.“while” construct must use “{}”

“while” 语句缺少“{}”

22.Variable “sTest1” must be private and haveaccessor method

变量“sTest1”应该是private的,并且有调用它的方法

23.Variable “ABC” must match pattern“^[a-z][a-zA-Z0-9]*$”

变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]*$”

24.“(” is followed by whitespace

“(” 后面不能有空格

25.“)” is proceeded by whitespace

“)” 前面不能有空格

代码重复

PMD介绍

安装PMD 的Eclipse插件

1.下载地址:

http://jingyan.baidu.com/article/1919 2ad835de6ee53e57073c.html

2.解压
net.sourceforge.pmd.eclipse-3.2.6.v200903300643.zip文件,到系统路径下。如:D:\geyouchao\eclipse-plugins\pmd,此文件夹下有两个文件夹features、plugins。

3.我们使用link的方式安装。在Eclipse的dropins文件夹下新建pmd.link文件,内容为:

path=D:\\geyouchao\\eclipse-plugins\\pmd

4.关闭Eclipse,重启。然后在Eclipse的window》Preferences下就可以看到PMD菜单,安装成功,如下图

图7

使用PMD

图8

下面是PCD生成的重复代码,可以对其中的代码进行分析,修改

图9

代码覆盖率

Coverlipse介绍

安装coverlipse 的Eclipse插件

1.下载地址:

https://sourceforge.net/projects/coverlipse /files/Coverlipse/

下载下图中5个文件

图10

1.解压coverlipse-0.9.6.zip文件,到系统路径下。如:D:\geyouchao\eclipse-plugins\ coverlipse-0.9.6,此文件夹下有两个文件夹features、plugins。

2.我们使用link的方式安装。在Eclipse的dropins文件夹下新建coverlipse.link文件,内容为:

path=D:\\geyouchao\\eclipse-plugins\\coverlipse

3.关闭Eclipse,重启。右键java代码,点击dubug,安装成功,如下图

图11

依赖项分析

jdepend介绍

安装jdepend 的Eclipse插件

1.下载地址:

http://andrei.gmxhome.de/ jdepend4eclipse/links.html

图12

2.拷贝
de.loskutov.eclipse.jdepend_1.2.4.201406241900.jar文件,到Eclipse的dropins目录下。如:D:\geyouchao\eclipse4.2-xu\dropins。

3.关闭Eclipse,重启。通过右键单击源文件夹并选择Run JDepend Analysis。一定要选择一个含源代码的源文件夹;否则看不到此菜单项。

图13

使用jdepend

图14

下面对jdepend的分析的结果简单介绍

图15

1.Selected objects():选择分析的包

2.Package:包全路径

3.CC(concr.cl.):当前行对应包的具体类的数量。

4.AC(abstr.cl.):当前行对应包的抽象类和接口的数量。

5.Ca(aff.):依赖于被分析package的其他package的数量,用于衡量pacakge的职责。即有多少包调用了它。(AfferentCouplings)

6.Ce(eff.):被分析package的类所依赖的其他package的数量,用于衡量package的独立性。即它调用了多少其他包。(EfferentCouplings)

7.A:被分析package中的抽象类和接口与所在package所有类数量的比例,取值范围为0-1。(Abstractness)

8.I:I=Ce/(Ce+Ca),用于衡量package的不稳定性,取值范围为0-1。I=0表示最稳定,I=1表示最不稳定。即如果这个类不调用任何其他包,则它是最稳定的。(Instability)

9.D:分析package和理想曲线A+I=1的垂直距离,用于衡量package在稳定性和抽象性之间的平衡。(Distance)

理想的package要么完全是抽象类和稳定(x=0,y=1),要么完全是具体类和不稳定(x=1,y=0)。取值范围为0-1,

D=0表示完全符合理想标准,

D=1表示package最大程度地偏离了理想标准。即你的包要么全是接口,不调用任何其他包(完全是抽象类和稳定),要么是具体类,不被任何其他包调用。

10.Cycle!:循环依赖

11. Package with cycle:包与包直接有循环调用

12. Depends
upon-efferentdependencies:依赖的包

13. Used by-afferentdependencies:被引用的包

图16

Instability:不稳定

Abstractness:抽象性

问题分析

图17

针对上图中Cycle!列中有感叹号图标问题,是因为以上三个包中的类有传递依赖,故出现此警告。

解决办法:

把其中的某个或者某些类再单独抽出新包,解决此问题。

复杂度监控

metrics(量度)介绍

安装metrics 的Eclipse插件

1.下载地址:

https://sourceforge.net/projects/metrics/

图18

图19

图20

图21

2.解压updatesite_1.3.6.zip文件,
net.sourceforge.metrics.updatesite文件夹下有features和plugins分别拷贝到Eclipse的对应目录下。如:D:\geyouchao\eclipse4.2-xu\plugins等。

3.关闭Eclipse,重启。然后在Eclipse的window》Preferences下就可以看到Metrics Preferences菜单,安装成功,如下图

图22

设置metrics参数

下图是metrics提供的配置项,下面对各个配置项进行解释

图23

lack of cohesion of methods:

介于0-1之间,0表示最有凝聚力,1表示完全没有凝聚力。

1)如果所有方法都使用所有的实例字段,一个类是完全有凝聚力的

2)静态方法和实例方法计数,它还包括构造函数、属性的getter和setter,所有方法。

在Since Sonar 4.1中此量度已经被删除。

3) 子的数量NOC(Number ofchildren)子类在类的层次内,子类可以最直接地从属于一类。随着子类数量的增大,重用也增加了。但父类抽象的表示可能减少,即一些子类可能不是父类真正的成员,同时,测试数量(用来检查每个子类在操作前后的要求)也将增加。

4) 方法中聚合的不足LCOM(Lack ofcohesion in Methods)

一个类内的每种方法访问一个或多个属性(也称实例变量)。LCOM是访问一个或多个相同属性方法的数量

如果LCOM很大,则说明方法可以通过属性与其他方法耦合,这就增加了类设计的复杂性。通常,对LCOM值很大的类,可以把它分为两个或多个单独的类,这样每个类能的设计更方便。

这里讲的耦合和聚合与传统软件中讲的是一样的。我们希望高聚合和低耦合,即保持低的LCOM.但在某些时候,LCOM很大也是合理的。

5)每个类的加权方法WMC(Weighted Methodsper Class)

6)Out-of-range:超出范围,溢出

下面是metric的安全范围设置,在此页面中可以设置每项指标的安全范围。若警告启用,指标值超出我们设置的安全范围就好发出警告。

图24

使用metrics

1.右键单击您的项目并选择 Properties 菜单。在结果窗口中,选择 EnableMetrics plugin 复选框并单击 OK:

图25

2.从 Eclipse 中选择 Window 菜单打开 Metrics 视图,然后选择 Show View | Other...。

3.选择 Metrics | Metrics View 打开如图 13 中显示的窗口。您需要使用Java 透视图并重新构建项目,从而显示这些度量值。

图26

注:一定要重新构建项目

图27

Java 模拟技术(mock)

Mock是什么

Mock通常是指,在测试一个对象A时,我们构造一些假的对象来模拟与A之间的交互,而这些Mock对象的行为是我们事先设定且符合预期。通过这些Mock对象来测试A在正常逻辑,异常逻辑或压力情况下工作是否正常。

引入Mock最大的优势在于:Mock的行为固定,它确保当你访问该Mock的某个方法时总是能够获得一个没有任何逻辑的直接就返回的预期结果。

Mock Object的使用通常会带来以下一些好处:

隔绝其他模块出错引起本模块的测试错误。

隔绝其他模块的开发状态,只要定义好接口,不用管他们开发有没有完成。

一些速度较慢的操作,可以用MockObject代替,快速返回。

对于分布式系统的测试,使用Mock Object会有另外两项很重要的收益:

通过Mock Object可以将一些分布式测试转化为本地的测试

将Mock用于压力测试,可以解决测试集群无法模拟线上集群大规模下的压力

mock技术的目的和作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。

Mock应用场景

在使用Mock的过程中,发现Mock是有一些通用性的,对于一些应用场景,是非常适合使用Mock的:

真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)

真实对象很难被创建(比如具体的web容器)

真实对象的某些行为很难触发(比如网络错误)

真实情况令程序的运行速度很慢

真实对象有用户界面

测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)

真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)

当然,也有一些不得不Mock的场景:

一些比较难构造的Object:这类Object通常有很多依赖,在单元测试中构造出这样类通常花费的成本太大。

执行操作的时间较长Object:有一些Object的操作费时,而被测对象依赖于这一个操作的执行结果,例如大文件写操作,数据的更新等等,出于测试的需求,通常将这类操作进行Mock。

异常逻辑:一些异常的逻辑往往在正常测试中是很难触发的,通过Mock可以人为的控制触发异常逻辑。

在一些压力测试的场景下,也不得不使用Mock,例如在分布式系统测试中,通常需要测试一些单点(如namenode,jobtracker)在压力场景下的工作是否正常。而通常测试集群在正常逻辑下无法提供足够的压力(主要原因是受限于机器数量),这时候就需要应用Mock去满足。

在这些场景下,我们应该如何去做Mock的工作了,一些现有的Mock工具可以帮助我们进行Mock工作。

EasyMock应用

Easymock官网:

http://easymock.org/

EasyMock 是早期比较流行的MocK测试框架。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。

EasyMock 是采用 MIT license 的一个开源项目

使用EasyMock大致可以划分为以下几个步骤:

① 使用 EasyMock 生成 Mock 对象;

② 录制 Mock 对象的预期行为和输出;

③ 将 Mock 对象切换到 播放 状态;

④ 调用 Mock 对象方法进行单元测试;

⑤ 对 Mock 对象的行为进行验证。

mockito应用

mockito官网

https://code.google.com/p/mockito/

由于官网上不了,可以到csdn上下载

http://download.csdn.net/download /wjjiang917/5519381

是EasyMock之后流行的mock工具。相对EasyMock学习成本低,而且具有非常简洁的API,测试代码的可读性很高。

使用mockito大致可以划分为以下几个步骤:

① 使用 mockito 生成 Mock 对象;

② 定义(并非录制) Mock 对象的行为和输出(expectations部分);

③ 调用 Mock 对象方法进行单元测试;

④ 对 Mock 对象的行为进行验证。

PowerMock应用

PowerMock官网

https://code.google.com/p/powermock/

这个工具是在EasyMock和Mockito上扩展出来的,目的是为了解决EasyMock和Mockito不能解决的问题,比如对static, final, private方法均不能mock。其实测试架构设计良好的代码,一般并不需要这些功能,但如果是在已有项目上增加单元测试,老代码有问题且不能改时,就不得不使用这些功能了。

PowerMock 在扩展功能时完全采用和被扩展的框架相同的API, 熟悉 PowerMock 所支持的模拟框架的开发者会发现 PowerMock 非常容易上手。PowerMock 的目的就是在当前已经被大家所熟悉的接口上通过添加极少的方法和注释来实现额外的功能。目前PowerMock 仅扩展了 EasyMock 和 mockito,需要和EasyMock或Mockito配合一起使用。

因为内容实在是太多了,小编在此就不做过多的介绍了,想了解更多的Java知识可以关注小编!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java代码质量检查工具及使用案例 的相关文章

  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • C/C++ 杨辉三角形

    题目描述 还记得中学时候学过的杨辉三角形吗 具体的定义这里不再描述 你可以参考以下的图形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输入 输入数据包含多个测试实例 每个测试实例的输入只包含一个正整数n 1 lt n lt
  • AJAX学习笔记8 跨域问题及解决方案

    AJAX学习笔记7 AJAX实现省市联动 biubiubiu0706的博客 CSDN博客 跨域 指一个域名的网页去请求另外一个域名资源 比如百度页面去请求京东页面资源 同源与不同源三要素 协议 域名 端口 协议一致 域名一致 端口一致 才算
  • JAVA中的内存分配

    JAVA中的内存分配 栈 方法运行时使用的内存 比如main方法的运行 进入方法栈中执行 堆 存储对象或数组 new来创建的 都存储在堆内存中 方法区 存储可以运行的class文件 本地方法栈 JVM在使用操作系统功能的时候使用 和我们开发
  • 查询、关闭正在运行的Tomcat端口

    查询正在使用的端口 快捷键win R 输入cmd 回车 打开cmd窗口 查看所有的端口进程 请输入netstat ano 查看某个特定端口 输入netstat ano findstr 8089 关闭某个端口进程 输入taskkill f p
  • Javaweb

    一 创建包和类来编译servlet程序 二 编译和运行
  • 如何在老版本浏览器中丝滑地使用JS新特性(ES6)

    如何在老版本浏览器中丝滑地使用JS新特性呢 如何在老版本浏览器中丝滑地使用JS新特性呢 有两种方法可以帮助我们实现 第一种方法就是我们用JS原有的方法 自己去实现JS的新特性 不是说好的丝滑使用新特性吗 就这 哈哈哈 别急 客官留步 我还有
  • spring boot 数据库层

    项目开启 首先设计数据库以及存储表 表的联系 需要存贮的信息 基本表的性质 基本表与中间表 临时表不同 因为它具有如下四个特性 1 原子性 基本表中的字段是不可再分解的 2 原始性 基本表中的记录是原始数据 基础数据 的记录 3 演绎性 由
  • openid和unionid的区别

    openid和unionid的区别 1 微信openid和unionid长度是不一样的 openid 28 unionid 29 2 openid同一用户同一应用唯一 unionid同一用户不同应用唯一 这里的不同应用是指在同一微信开发平台
  • C++学习6

    堆 是存在于某个作用域的一个内存空间 例如 当你调用函数 函数本身会形成一个栈用来放置它所接收的参数 以及返回地址 栈 由操作系统提供的一个全局的内存空间 程序可动态分配 内存管理 生命周期 栈对象 离开堆的作用域 会调用对象的析构函数 内
  • rabbitmq分布式事务解决方案

    发送消息到mq 流程 用户下订单创建订单信息 且创建一条订单冗余信息 status 为 0 发送订单信息到mq 使用ack 消息确认机制 确认消息发送成功修改订单状态为 1 表示消息已发送 启动一个定时任务 排查 订单状态为 0 的订单 发
  • Win2003搭建网站教程

    1 搭建Win2003虚拟机 此过程略 2 开始 管理您的服务器 添加或删除角色 3 下一步 配置您的服务器向导 选择应用程序服务器 IIS asp NET 下一步 完成安装 4 打开 开始 管理工具 Internet信息服务器 IIS 管
  • 使用certbot 生成 Let‘s Encrypt 泛域名ssl证书

    文章目录 一 更新证书报错 二 Let s Encrypt 泛域名ssl证书申请 一 更新证书报错 问题描述 更新SSL证书时报 too many failed authorizations 错误 原因分析 当前要更新的域名一个小时触发失败
  • 扫码支付终结刷脸支付强势掘起

    手机支付将会終结 新的支付方式掘起 新的支付方式对很多人还是很陌生的 这就要很好的推广和布置 现在推出了二代的蜻蜓刷脸设备 向商户销售出了舒缓的二代蜻蜓刷脸支付设备 超市 快餐厅 自动贩卖机都已经实现商业直播 相信很快在每个城市 都会发现这
  • 快速排序详解

    近些天来 由于需要找工作 特将数据机构与算法中的快速排序温习总结了一下 希望对于大家学习有所帮助 首先 快速排序的基本思想是基于分治的思想 是冒泡排序的改进型 首先在数组中选择一个基准点 该基准点的选取可能影响快速排序的效率 后面讲解选取的
  • Git提交代码的两种方式

    一 Git Bash提交方式 在电脑桌面鼠标右键点击一下 然后点击Git Bash Here 开始输入命令 1 首次提交 先输入github gitlab等的用户名和邮箱 git命令 git config global user name
  • 【Altium Designer21】使用小技巧

    1 如何取消原理图的网格以及表头如下图 在Properties Visible Grid可以显示 隐藏网格 Title Block勾选上即显示表头 取消勾选即隐藏表头 图1 图2 图3 2 翻转的快捷键 空格 为90翻转 X 为水平翻转 Y
  • Eclipse 启动异常 找不到Java环境(A Java Runtime Environment....)

    点击启动Eclipse弹出异常消息 解决步骤 1 打开eclipse所在文件夹 2 用记事本打开配置文件 即下图的文件 3 找到java所在文件夹 4 复制路径并粘贴到记事本文件中 5 保存并重启Eclipse 大功告成
  • [算法]力扣刷题-动态规划 - 不同路径

    目录 题目 思路 编码 分析 修改 优化 题目 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同
  • Junit的基本使用(详解)

    什么是Junit Junit是xUnit的一个子集 在c paython java语言中测试框架的名字都不相同 xUnit是一套基于测试驱动开发的测试框架 其中的断言机制 将程序预期的结果与程序运行的最终结果进行比对 确保对结果的可预知性
  • Java代码质量检查工具及使用案例

    前言 在现在的软件开发中 由于软件的复杂度越来越高 业务也覆盖很广 各个业务模块业务错综复杂 这样就需要我们需要团队开发 在我们团队中开发人员的经验 代码风格样式都不一致 以及缺乏统一的标准 从而导致我们的整个项目的的代码难以阅读 不便于后