我如何为Java代码强制使用标准样式?[已关闭]

mbjcgjjk  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(314)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

我们不允许问题寻求有关书籍、工具、软件库等的推荐。你可以编辑问题,以便可以使用事实和引用来回答问题。
昨天关门了。
Improve this question
我尝试引入一个工具来标准化我们的java代码格式。要求是:

  • 所需格式应为Oracle标准(或非常相似的格式)
  • 应遵守多行语句,即如果用户为了可读性而添加换行符以将语句拆分为多行,则不应删除这些换行符(见上文)
  • Gradle集成。如果提交的代码不符合规则,构建应该失败。
  • 自动修复-通过(Gradle)命令重新格式化代码以符合规则
  • IDE集成-重新格式化代码以符合IntelliJ、VSCode等中的规则。EditorConfig可能对此很有用。

我试过使用Spotless,但是它格式化多行语句的方式很不令人满意。

var token = Jwts.builder()
        .signWith(Keys.hmacShaKeyFor(signingKey), SignatureAlgorithm.HS512)
        .setHeaderParam("typ", SecurityConstants.TOKEN_TYPE)
        .setIssuer(SecurityConstants.TOKEN_ISSUER)
        .claim("rol", roles)
        .setAudience(SecurityConstants.TOKEN_AUDIENCE)
        .setSubject(user.getUsername())
        .setExpiration(Timestamp.valueOf(tomorrow))
        .addClaims(user.getClaims())
        .compact();

将无法通过Spotless检查,并且如果运行./gradlew spotlessApply,它将被重新格式化为这种可怕的混乱状态

var token = Jwts.builder().signWith(Keys.hmacShaKeyFor(signingKey), SignatureAlgorithm.HS512)
        .setHeaderParam("typ", SecurityConstants.TOKEN_TYPE).setIssuer(SecurityConstants.TOKEN_ISSUER)
        .claim("rol", roles).setAudience(SecurityConstants.TOKEN_AUDIENCE).setSubject(user.getUsername())
        .setExpiration(Timestamp.valueOf(tomorrow)).addClaims(user.getClaims()).compact();

因此,Spotless的行为就像一个模糊器。有没有一个工具可以满足以上的大部分/所有要求?

aiazj4mn

aiazj4mn1#

我试过使用Spotless,但是它格式化多行语句的方式非常不令人满意。
Spotless允许您指定自定义规则以满足您的要求:https://github.com/diffplug/spotless/tree/main/plugin-gradle#custom
Checkstyle是另一个很好的强制格式化工具,它被Spring Framework团队使用,它也有一个excellent plugin for IntelliJ
所以建议是:
1.尝试为Spotless编写自定义规则以满足您的需要。
1.如果(1)不令人满意,请研究如何将Checkstyle与自定义检查一起使用。
如果提交的代码不符合规则,则生成应该失败。
有几种方法可以处理这个问题:
无论你使用哪种格式的插件,都有一个相关的check任务,所以对于Spotless来说就是spotlessCheck,Checkstyle就是check
您可以将build任务配置为对这些任务具有任务依赖性。
另一种方法是在您的管道中有一个调用您配置的检查任务的检查。

相关问题