标准的Spring Boot应用程序有一些主方法类文件,比如SampleApplication.java
,看起来像这样:
@SpringBootApplication
@RestController
public class SampleApplication {
public static void main(final String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
但PMD静态分析将其标记为错误(HideUtilityClassConstructorCheck):
实用程序类不应具有公共或默认构造函数。
确保实用程序类(在API中仅包含静态方法或字段的类)没有公共构造函数。
理由:实例化实用程序类没有意义。因此,构造函数应该是私有的,或者(如果您希望允许子类化)受保护的。一个常见的错误是忘记隐藏默认构造函数。
如果使构造函数受到保护,您可能需要考虑以下构造函数实现技术来禁止实例化子类:
公共类StringUtils//不是最终允许子类{受保护的StringUtils() { // 防止从子类调用抛出新的Un支持的操作异常();}公共静态int计数(char c, String s){//...###
为什么会这样?我应该抑制此PMD错误吗?
现在您可以像这样忽略注释@SpringBootApplication
:
<rule ref="category/java/design.xml/UseUtilityClass">
<properties>
<property name="ignoredAnnotations" value="org.springframework.boot.autoconfigure.SpringBootApplication"/>
</properties>
</rule>
参见自PMD 6.16.0(2019年6月30日)起的UseUtilityClass
使用PMD规则集XML文件中的以下代码段,可以仅对带有@SpringBootApplication
注释的类抑制PMD UseUtilityClass规则:
<rule ref="category/java/design.xml/UseUtilityClass">
<properties>
<property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration/preceding-sibling::Annotation/MarkerAnnotation/Name[@Image='SpringBootApplication']" />
</properties>
</rule>
检查本身就说明了问题。
默认情况下,任何代码检查器(IntelliJ IDEA、FindBugs、PMD、Sonar)都假设如果类只有静态方法,那么它就是实用程序类。实用程序类的示例是java.lang.Math
,它看起来像这样:
public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
public static double exp(double a) {
...
}
// More helper methods
}
此类类被设计为将其作为一包静态函数使用:为其声明私有构造函数是一种很好的做法,因此没有人会错误地实例化它并声明classfinal
,因为扩展它毫无意义。
在您的情况下(以及Spring Boot应用程序的几乎每个入口点)SampleApplication
类有一个public static void main
方法,因此PMD决定其实用程序类,检查私有构造和最终修饰符,并标记错误。这不是问题所在,PMD只是不知道Spring Boot或任何其他框架及其入口点,所以最好不要显示此警告并将您的类从PMD中排除:对我来说,这比向应用程序入口点添加私有构造函数在语义上更正确。
这是我使用SpringBoot的第一天,我试图理解体系结构,因此我开始构建一个hello world应用程序: 在我的pom.xml中,在maven-shade-plugin下,我将mainClass声明如下: 文件目标是src/main/java/com/demo/helloworld.java,该文件中的代码是: 我错过了什么?
这并不困难,但它让我质疑spring auth服务器是最好的选择,还是我应该使用Keycloak?
我们正在运行java应用程序,该应用程序用作24/7运行的监控系统。我们有一些内存问题,所以我做了一个jmap转储,我可以分析它。在我使用live flag进行第二次转储之后,GC也在应用程序中运行,它的内存使用率再次降低(该进程现在运行了6个月)。所以我的问题是,如果在jmap转储之后,它可以执行GC,那么在此期间GC为什么不由进程本身运行,进程在此之后正常运行,并且它的内存使用情况正常? Op
本文向大家介绍什么是 Java 程序的主类 应用程序和小程序的主类有何不同?相关面试题,主要包含被问及什么是 Java 程序的主类 应用程序和小程序的主类有何不同?时的应答技巧和注意事项,需要的朋友参考一下 一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 App
我有一个小的scala代码snipet: 当我在windows或mac上运行它时,它会打印出一个巨大的异常信息: 这是什么错误?我该如何修复它?我不太明白。谢谢!
我正在处理Spring 4.2.0.BUILD-SNAPSHOT事件,由于一些我还没有弄清楚的原因,监听器在发布任何事件(无论是从ApplicationEvent扩展还是任何任意事件)后触发了两次,但是在运行测试用例时一切都按预期工作,现在想知道Spring MVC上下文中的注释驱动事件发生了什么 事件发布界面 事件监听器 终点/入口点 结果:事件触发…事件触发…以上事件。。 我确实怀疑Event