Skip to main content

8.60.0 release (2025-08-13)

Total recipe count: 4631

info

This changelog only shows what recipes have been added, removed, or changed. OpenRewrite may do releases that do not include these types of changes. To see these changes, please go to the releases page.

Corresponding CLI version

  • Stable CLI version v3.43.6
  • Staging CLI version: v3.44.4

New Artifacts

  • rewrite-program-analysis

New Recipes

public static class DebugToVDebug {

@BeforeTemplate
void before(Logger logger, String message, Object[] args) {
logger.debug(message, args);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args) {
logger.debugv(message, args);
}
}

.

public static class DebugToVDebugWithThrowable {

@BeforeTemplate
void before(Logger logger, String message, Object[] args, Throwable t) {
logger.debug((Object)message, args, t);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args, Throwable t) {
logger.debugv(message, args, t);
}
}

.

public static class ErrorToVError {

@BeforeTemplate
void before(Logger logger, String message, Object[] args) {
logger.error(message, args);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args) {
logger.errorv(message, args);
}
}

.

public static class ErrorToVErrorWithThrowable {

@BeforeTemplate
void before(Logger logger, String message, Object[] args, Throwable t) {
logger.error((Object)message, args, t);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args, Throwable t) {
logger.errorv(message, args, t);
}
}

.

public static class FatalToVFatal {

@BeforeTemplate
void before(Logger logger, String message, Object[] args) {
logger.fatal(message, args);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args) {
logger.fatalv(message, args);
}
}

.

public static class FatalToVFatalWithThrowable {

@BeforeTemplate
void before(Logger logger, String message, Object[] args, Throwable t) {
logger.fatal((Object)message, args, t);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args, Throwable t) {
logger.fatalv(message, args, t);
}
}

.

public static class InfoToVInfo {

@BeforeTemplate
void before(Logger logger, String message, Object[] args) {
logger.info(message, args);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args) {
logger.infov(message, args);
}
}

.

public static class InfoToVInfoWithThrowable {

@BeforeTemplate
void before(Logger logger, String message, Object[] args, Throwable t) {
logger.info((Object)message, args, t);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args, Throwable t) {
logger.infov(message, args, t);
}
}

.

public static class TraceToVTrace {

@BeforeTemplate
void before(Logger logger, String message, Object[] args) {
logger.trace(message, args);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args) {
logger.tracev(message, args);
}
}

.

public static class TraceToVTraceWithThrowable {

@BeforeTemplate
void before(Logger logger, String message, Object[] args, Throwable t) {
logger.trace((Object)message, args, t);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args, Throwable t) {
logger.tracev(message, args, t);
}
}

.

public static class WarnToVWarn {

@BeforeTemplate
void before(Logger logger, String message, Object[] args) {
logger.warn(message, args);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args) {
logger.warnv(message, args);
}
}

.

public static class WarnToVWarnWithThrowable {

@BeforeTemplate
void before(Logger logger, String message, Object[] args, Throwable t) {
logger.warn((Object)message, args, t);
}

@AfterTemplate
void after(Logger logger, String message, Object[] args, Throwable t) {
logger.warnv(message, args, t);
}
}

.

  • If two methods in a class are effectively the same setter then one's name will be corrected and the others name will be left as it is.
  • If the correct name for a method is already taken by another method then the name will not be corrected.
  • Method name swaps or circular renaming within a class cannot be performed because the names block each other. E.g. int getFoo() { return ba; } int getBa() { return foo; } stays as it is.

Removed Recipes

  • io.moderne.cryptography.FindHardcodedAlgorithmChoice: Locate hardcoded algorithm choices in cryptographic code.
  • io.moderne.cryptography.FindHardcodedAlgorithmSpecificParameters: Locate hardcoded algorithm specific parameters in cryptographic code.
  • io.moderne.cryptography.FindHardcodedCertificate: Detects hardcoded PEM certificates passed into CertificateFactory.generateCertificate().
  • io.moderne.cryptography.FindHardcodedCipherSuitesOnSslSocket: Detects hardcoded cipher suites in SSL socket configurations, which can lead to security vulnerabilities.
  • io.moderne.cryptography.FindHardcodedCiphersuiteChoice: Locate hardcoded ciphersuite choices in cryptographic code.
  • io.moderne.cryptography.FindHardcodedKeyPairGenerator: Detects hardcoded cryptographic algorithms.
  • io.moderne.cryptography.FindHardcodedPrivateKey: Detects hardcoded PEM private keys passed into KeyFactory.generatePrivate().
  • io.moderne.cryptography.FindHardcodedProtocolChoice: Locate hardcoded protocol choices in cryptographic code.
  • io.moderne.cryptography.FindHardcodedProtocolsOnSSLSocketCreation: Finds hardcoded protocols in SSL socket creation methods, such as SSLContext.getInstance(String).
  • io.moderne.cryptography.FindHardcodedProtocolsOnSSLSocketSetProtocols: Detects hardcoded protocol versions in SSL socket configurations, which can hinder adaptability and security.
  • io.moderne.cryptography.FindHardcodedRSAKeyGenParameterSpec: It is usually insecure to pass hardcoded numbers passed into RSAKeyGenParameterSpec.
  • io.moderne.cryptography.FindHardcodedSecretKeySpec: Detects hardcoded cryptographic algorithms.
  • io.moderne.cryptography.FindInsecureSecuritySetProperties: Locate calls to Security.setProperty that set insecure properties.
  • io.moderne.cryptography.FindSecurityProviderEditing: Locate programmatic edits of the Security provider list.
  • io.moderne.cryptography.FindSslConfiguration: The configuration of Secure Socket Layer (SSL) and Transport Layer Security (TLS) is a key aspect of making a secure application. This recipe detects and enumerates these configurations.
  • io.moderne.cryptography.FindSslContextDefault: This includes anywhere where SSLContext.setDefault is called.
  • org.openrewrite.config.CompositeRecipe: A recipe that consists of a list of other recipes.
  • org.openrewrite.gitlab.AddStages: Add or Update the set of stages defined in .gitlab-ci.yml.
  • org.openrewrite.java.migrate.jakarta.RemoveJakartaAnnotationDependency: Counteract the jakarta.annotation-api added by org.openrewrite.java.migrate.javax.AddCommonAnnotationsDependencies for Spring Boot applications.
  • org.openrewrite.staticanalysis.ReplaceStreamToListWithCollect: Replace Java 16 Stream.toList() with Java 11 Stream.collect(Collectors.toList()).
  • software.amazon.awssdk.v2migration.ConstructorToFluent: A recipe that takes constructor arguments and moves them to the specified fluent setters on the object.

Changed Recipes

  • org.openrewrite.gradle.ChangeDependency was changed:
    • Old Options:
      • newArtifactId: { type: String, required: false }
      • newGroupId: { type: String, required: false }
      • newVersion: { type: String, required: false }
      • oldArtifactId: { type: String, required: true }
      • oldGroupId: { type: String, required: true }
      • overrideManagedVersion: { type: Boolean, required: false }
      • versionPattern: { type: String, required: false }
    • New Options:
      • changeManagedDependency: { type: Boolean, required: false }
      • newArtifactId: { type: String, required: false }
      • newGroupId: { type: String, required: false }
      • newVersion: { type: String, required: false }
      • oldArtifactId: { type: String, required: true }
      • oldGroupId: { type: String, required: true }
      • overrideManagedVersion: { type: Boolean, required: false }
      • versionPattern: { type: String, required: false }
  • org.openrewrite.java.AddCommentToMethodInvocations was changed:
    • Old Options:
      • comment: { type: String, required: true }
      • isMultiline: { type: Boolean, required: false }
      • methodPattern: { type: String, required: true }
    • New Options:
      • comment: { type: String, required: true }
      • methodPattern: { type: String, required: true }
  • org.openrewrite.java.dependencies.search.ModuleHasDependency was changed:
    • Old Options:
      • artifactIdPattern: { type: String, required: true }
      • groupIdPattern: { type: String, required: true }
      • scope: { type: String, required: false }
      • version: { type: String, required: false }
    • New Options:
      • artifactIdPattern: { type: String, required: true }
      • groupIdPattern: { type: String, required: true }
      • invertMarking: { type: Boolean, required: false }
      • scope: { type: String, required: false }
      • version: { type: String, required: false }
  • org.openrewrite.java.dependencies.DependencyVulnerabilityCheck was changed:
    • Old Options:
      • maximumUpgradeDelta: { type: UpgradeDelta, required: false }
      • overrideTransitive: { type: Boolean, required: false }
      • preferDirectUpgrade: { type: Boolean, required: false }
      • scope: { type: String, required: false }
    • New Options:
      • maximumUpgradeDelta: { type: UpgradeDelta, required: false }
      • overrideTransitive: { type: Boolean, required: false }
      • scope: { type: String, required: false }
  • org.openrewrite.maven.UpdateScmFromGitOrigin was changed:
    • Old Options:
      • None
    • New Options:
      • addIfMissing: { type: Boolean, required: false }
  • org.openrewrite.yaml.CoalesceProperties was changed:
    • Old Options:
      • None
    • New Options:
      • applyTo: { type: List, required: true }
      • exclusions: { type: List, required: true }