diff --git a/AGENTS.md b/AGENTS.md index 8d6a4ebd2de..d195f5441a1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -52,13 +52,13 @@ docs/ Developer documentation (see below) ./gradlew :dd-java-agent:shadowJar # Build agent jar only (dd-java-agent/build/libs/) ./gradlew :path:to:module:test # Run tests for a specific module ./gradlew :path:to:module:test -PtestJvm=11 # Test on a specific JVM version -./gradlew spotlessApply # Auto-format code (google-java-format) +./gradlew spotlessApply # Auto-format code (Prince of Space) ./gradlew spotlessCheck # Verify formatting ``` ## Code conventions -- **Formatting**: google-java-format enforced via Spotless. Run `./gradlew spotlessApply` before committing. +- **Formatting**: Prince of Space enforced via Spotless. Run `./gradlew spotlessApply` before committing. - **Static imports**: Prefer static imports over class-qualified calls for call-style helpers, in both test (Assertions.assertEquals, Mockito.mock) and production code (Collections.emptyList). Wildcard imports disallowed — see CONTRIBUTING.md. - **Documentation**: Use concise Javadoc comments (`/** ... */`) for class, method, and field documentation. - **Instrumentation layout**: `dd-java-agent/instrumentation/{framework}/{framework}-{minVersion}/` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e3a08c8b718..de15b70bde5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,6 +34,9 @@ We have automatic code formatting enabled in Gradle configuration using [Spotles Our main goal is to avoid extensive reformatting caused by different IDEs with different opinions about how things should be formatted by establishing a single _point of truth_. +Java sources use [Prince of Space](https://github.com/agustafson/prince-of-space) with two-space indentation and a +100-character line width. + To reformat all the files that need reformatting: ```bash @@ -55,13 +58,15 @@ For IntelliJ IDEA, we suggest the following settings and plugin. * `Use single class import`: checked * `Class count to use import with '*'`: `9999` (some number sufficiently large that is unlikely to matter) * `Names count to use static import with '*'`: `9999` - * Use the following import layout to ensure consistency with google-java-format: + * Use the following import layout: ![import layout](https://user-images.githubusercontent.com/734411/43430811-28442636-94ae-11e8-86f1-f270ddcba023.png) * top right Settings icon -> `Settings...` ->`Editor` > `Code Style` > `Groovy` > `Imports` * `Class count to use import with '*'`: `9999` (some number sufficiently large that is unlikely to matter) * `Names count to use static import with '*'`: `9999` * To run test in a specific JDK use the `testJvm` property, e.g. `-PtestJvm=11` -* Install the [Google Java Format](https://plugins.jetbrains.com/plugin/8527-google-java-format) plugin +* Install the [Prince of Space](https://github.com/agustafson/prince-of-space/releases) IntelliJ plugin from its release ZIP + * Under `Settings` > `Tools` > `Prince of Space`, use a two-space indent, a 100-character line length, balanced wrapping, + no trailing commas, a closing parenthesis on a new line, and Java language level 25 ### Static imports diff --git a/build.gradle.kts b/build.gradle.kts index 974acc35d2e..842af7d1928 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,11 @@ spotlessPredeclare { removeUnusedImports() forbidWildcardImports() - googleJavaFormat(libs.versions.google.java.format.get()) + princeOfSpace(libs.versions.prince.of.space.get()) + .indentSize(2) + .lineLength(100) + .javaLanguageLevel(25) + trimTrailingWhitespace() tableTestFormatter(libs.versions.tabletest.formatter.get()) } groovyGradle { diff --git a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts index 88fd511e275..8bda17798e4 100644 --- a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts +++ b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts @@ -22,7 +22,11 @@ spotless { targetExclude("src/test/resources/**") removeUnusedImports() forbidWildcardImports() - googleJavaFormat(libs.versions.google.java.format.get()) + princeOfSpace(libs.versions.prince.of.space.get()) + .indentSize(2) + .lineLength(100) + .javaLanguageLevel(25) + trimTrailingWhitespace() } } diff --git a/buildSrc/modifiable-config-agent/build.gradle.kts b/buildSrc/modifiable-config-agent/build.gradle.kts index 838800eff6b..b634979cb19 100644 --- a/buildSrc/modifiable-config-agent/build.gradle.kts +++ b/buildSrc/modifiable-config-agent/build.gradle.kts @@ -18,7 +18,11 @@ spotless { targetExclude("src/test/resources/**") removeUnusedImports() forbidWildcardImports() - googleJavaFormat(libs.versions.google.java.format.get()) + princeOfSpace(libs.versions.prince.of.space.get()) + .indentSize(2) + .lineLength(100) + .javaLanguageLevel(25) + trimTrailingWhitespace() } } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java index 6cb01e76f08..271f75f9dbd 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java @@ -132,6 +132,7 @@ static Stream defaultOrConfiguredServiceNameCanBeRemappedWithoutSetti } @TableTest({ + // spotless:off - TableTest formatter 1.1.2 splits concatenated row strings. "scenario | context | serviceName | expected ", "root context with default service | '/' | 'DEFAULT_SERVLET_ROOT_CONTEXT_SERVICE_NAME' | 'DEFAULT_SERVLET_ROOT_CONTEXT_SERVICE_NAME'", "empty context with default service | '' | 'DEFAULT_SERVICE_NAME' | 'DEFAULT_SERVICE_NAME' ", @@ -141,6 +142,7 @@ static Stream defaultOrConfiguredServiceNameCanBeRemappedWithoutSetti "empty context with my-service | '' | 'my-service' | 'my-service' ", "/some-context with my-service | '/some-context' | 'my-service' | 'my-service' ", "other-context with my-service | 'other-context' | 'my-service' | 'my-service' " + // spotless:on }) void setServiceNameFromServletContext( String context, @@ -202,6 +204,7 @@ void mappingCausesServletContextToNotChangeServiceName(String serviceName) { } @TableTest({ + // spotless:off - TableTest formatter 1.1.2 splits concatenated row strings. "scenario | configured | tag | expectedBuilder | expectedSetter", "configured by OTel name | db.system | db.system | split | split ", "configured by Datadog name | db.type | db.type | split | split ", @@ -215,6 +218,7 @@ void mappingCausesServletContextToNotChangeServiceName(String serviceName) { "custom tag survives expansion | db.system,custom.tag | custom.tag | split | split ", "first of two renamed tags | db.system,db.operation.name | db.type | split | split ", "second of two renamed tags | db.system,db.operation.name | db.operation | split | split " + // spotless:on }) void splitByTagsMatchesCanonicalAndOriginalNames( String configured, String tag, String expectedBuilder, String expectedSetter) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e2c49359aa8..3c3f619be18 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ spotbugs-gradle-plugin = "6.5.11" spotbugs_annotations = "4.10.4" # Source code formatters -google-java-format = "1.36.1" +prince-of-space = "2.3.1" greclipse = "4.27" # Pinned to preserve Spock table alignment and compact closure formatting. ktlint = "1.8.0" scalafmt = "3.11.5" diff --git a/gradle/spotless.gradle b/gradle/spotless.gradle index cb7aaa4d3f8..fa70d33fbc5 100644 --- a/gradle/spotless.gradle +++ b/gradle/spotless.gradle @@ -46,10 +46,148 @@ spotless { // set explicit target to workaround https://github.com/diffplug/spotless/issues/1163 target 'src/**/*.java' // ignore embedded test projects and everything in build dir, e.g. generated sources - targetExclude('src/test/resources/**', buildDirectory) + // The formatter pipeline changes annotation data or comments in these files. + // Exact files avoid a directory scan for each exclusion pattern. + targetExclude( + 'src/test/resources/**', + buildDirectory, + rootProject.files( + 'components/json/src/test/java/datadog/json/JsonMapperTest.java', + 'dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientQueryRedactionForkedTest.java', + 'dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/decorator/HttpDecoratorsOtelSemanticsForkedTest.java', + 'dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParserDB2Test.java', + 'dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParserJtdsTest.java', + 'dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParserOracleTest.java', + 'dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParserPasswordLeakTest.java', + 'dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/messaging/DatadogAttributeParserTest.java', + 'dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java', + 'dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdExtractorIntegrationTest.java', + 'dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java', + 'dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/J9JavacoreParserTest.java', + 'dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RuntimeArgsTest.java', + 'dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/el/ELIntegrationSanityTest.java', + 'dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java', + 'dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java', + 'dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/SmapEntryCacheTest.java', + 'dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/JdkTypeIDs_Old.java', + 'dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/JfrMBeanHelper.java', + 'dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/test/java/datadog/trace/instrumentation/aws/v0/LambdaFunctionNameTest.java', + 'dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/test/java/datadog/trace/instrumentation/aws/v2/LambdaFunctionNameTest.java', + 'dd-java-agent/instrumentation/azure-functions-1.2.2/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsInstrumentation.java', + 'dd-java-agent/instrumentation/azure-functions-worker-2.7/src/test/java/AzureFunctionsWorkerTest.java', + 'dd-java-agent/instrumentation/grizzly/grizzly-2.0/src/main/java/datadog/trace/instrumentation/grizzly/GrizzlyHttpHandlerInstrumentation.java', + 'dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientInvocationInstrumentation.java', + 'dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientListenerInstrumentation.java', + 'dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/InvocationAdvice.java', + 'dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/NonStandardExecutorInstrumentation.java', + 'dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java', + 'dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/java/datadog/trace/instrumentation/kotlin/coroutines/AbstractDatadogThreadContextElementTest.java', + 'dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/client/NettyHttpClientDecoratorTest.java', + 'dd-java-agent/instrumentation/rediscala-1.8/src/main/java/datadog/trace/instrumentation/rediscala/RediscalaInstrumentation.java', + 'dd-java-agent/instrumentation/rs/jakarta-rs-annotations-3.0/src/test/java/JakartaRsRoutePropagationTest.java', + 'dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.13/src/scala21317Test/java/datadog/trace/instrumentation/scala213/concurrent/DefaultPromiseCallbackInstrumentationTest.java', + 'dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java', + 'dd-openfeature/src/main/java/com/datadog/openfeature/internal/flagevaluation/FlagEvaluationAggregator.java', + 'dd-openfeature/src/test/java/com/datadog/openfeature/ExperimentationOptOutProviderTest.java', + 'dd-openfeature/src/test/java/com/datadog/openfeature/internal/config/SettingsTest.java', + 'dd-openfeature/src/test/java/com/datadog/openfeature/internal/delivery/CdnConfigurationSourceTest.java', + 'dd-openfeature/src/test/java/com/datadog/openfeature/internal/ufc/UniversalFlagConfigParserTest.java', + 'dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java', + 'dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java', + 'dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/CodeHotspotsTest.java', + 'dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/controller/WebController.java', + 'dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java', + 'dd-trace-api/src/main/java/datadog/trace/api/DD64bTraceId.java', + 'dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java', + 'dd-trace-api/src/main/java/datadog/trace/api/config/RemoteConfigConfig.java', + 'dd-trace-api/src/test/java/datadog/trace/api/DDSpanIdTest.java', + 'dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/metrics/FootprintForkedTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/sampling/ForcePrioritySamplerTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/sampling/RuleBasedSamplingTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/sampling/SingleSpanSamplerTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentApiTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/writer/PrioritizationTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/writer/TraceProcessingWorkerTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java', + 'dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDIntakeTrackTypeResolverTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextPropagationTagsTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/KnuthSamplingRateTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogPropagationTagsTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpInjectorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CPropagationTagsTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/propagation/ptags/TagKeyTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PeerServiceCalculatorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/QueryObfuscatorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/traceinterceptor/LatencyTraceInterceptorTest.java', + 'dd-trace-core/src/test/java/datadog/trace/core/util/SystemAccessTest.java', + 'dd-trace-core/src/test/java/datadog/trace/lambda/LambdaAppSecHandlerTest.java', + 'dd-trace-core/src/test/java/datadog/trace/lambda/LambdaEventParserTest.java', + 'dd-trace-core/src/test/java/datadog/trace/lambda/LambdaHandlerTest.java', + 'dd-trace-ot/src/ot31CompatibilityTest/java/datadog/opentracing/OT31ApiTest.java', + 'dd-trace-ot/src/ot33CompatibilityTest/java/datadog/opentracing/OT33ApiTest.java', + 'internal-api/src/main/java/datadog/trace/api/telemetry/WafMetricCollector.java', + 'internal-api/src/test/java/datadog/trace/api/ClassloaderConfigurationOverridesTest.java', + 'internal-api/src/test/java/datadog/trace/api/ConfigCollectorTest.java', + 'internal-api/src/test/java/datadog/trace/api/ConfigTest.java', + 'internal-api/src/test/java/datadog/trace/api/InstrumenterConfigFeatureFlaggingTest.java', + 'internal-api/src/test/java/datadog/trace/api/InstrumenterConfigTest.java', + 'internal-api/src/test/java/datadog/trace/api/MethodFilterConfigParserTest.java', + 'internal-api/src/test/java/datadog/trace/api/ProcessTagsForkedTest.java', + 'internal-api/src/test/java/datadog/trace/api/cache/FixedSizeCacheTest.java', + 'internal-api/src/test/java/datadog/trace/api/civisibility/git/CommitInfoTest.java', + 'internal-api/src/test/java/datadog/trace/api/civisibility/git/PersonInfoTest.java', + 'internal-api/src/test/java/datadog/trace/api/endpoint/EndpointSimplifierTest.java', + 'internal-api/src/test/java/datadog/trace/api/git/GitUtilsTest.java', + 'internal-api/src/test/java/datadog/trace/api/git/UserSuppliedGitInfoBuilderTest.java', + 'internal-api/src/test/java/datadog/trace/api/http/MediaTypeTest.java', + 'internal-api/src/test/java/datadog/trace/api/iast/secrets/HardcodedSecretMatcherTest.java', + 'internal-api/src/test/java/datadog/trace/api/iast/securitycontrol/SecurityControlFormatterTest.java', + 'internal-api/src/test/java/datadog/trace/api/iast/telemetry/IastMetricTest.java', + 'internal-api/src/test/java/datadog/trace/api/llmobs/LLMObsTraceIdTest.java', + 'internal-api/src/test/java/datadog/trace/api/normalize/AntPatternHttpPathNormalizerTest.java', + 'internal-api/src/test/java/datadog/trace/api/telemetry/MetricCollectorTest.java', + 'internal-api/src/test/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImplTest.java', + 'internal-api/src/test/java/datadog/trace/bootstrap/config/provider/ConfigProviderTest.java', + 'internal-api/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigParserTest.java', + 'internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/HttpUrlExtractorsTest.java', + 'internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/OtelHttpSemanticsTest.java', + 'internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/URIDataAdapterTest.java', + 'internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/URIUtilsTest.java', + 'internal-api/src/test/java/datadog/trace/util/FNV64HashTest.java', + 'internal-api/src/test/java/datadog/trace/util/StringsTest.java', + 'internal-api/src/test/java/datadog/trace/util/TraceUtilsTest.java', + 'internal-api/src/test/java/datadog/trace/util/json/JsonPathParserTest.java', + 'products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ULeb128Encoder.java', + 'remote-config/remote-config-core/src/test/java/datadog/remoteconfig/Rcte1TestVectorsSpecification.java', + 'remote-config/remote-config-core/src/test/java/datadog/remoteconfig/state/ParsedConfigKeyTests.java', + 'telemetry/src/main/java/datadog/telemetry/TelemetryService.java', + 'telemetry/src/test/java/datadog/telemetry/TelemetryClientTest.java', + 'telemetry/src/test/java/datadog/telemetry/TelemetryRequestBodyTest.java', + 'telemetry/src/test/java/datadog/telemetry/TelemetryRunnableTest.java', + 'telemetry/src/test/java/datadog/telemetry/TelemetryServiceTest.java', + 'telemetry/src/test/java/datadog/telemetry/dependency/DependencyResolverTest.java', + 'telemetry/src/test/java/datadog/telemetry/metric/MetricPeriodicActionTest.java', + 'utils/config-utils/src/test/java/datadog/trace/api/env/CapturedEnvironmentTest.java', + 'utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/ConfigConverterTest.java')) removeUnusedImports() forbidWildcardImports() - googleJavaFormat(libs.versions.google.java.format.get()) + princeOfSpace(libs.versions.prince.of.space.get()) + .indentSize(2) + .lineLength(100) + .javaLanguageLevel(25) + trimTrailingWhitespace() tableTestFormatter(libs.versions.tabletest.formatter.get()) } } diff --git a/test-published-dependencies/build.gradle.kts b/test-published-dependencies/build.gradle.kts index 20b93d82241..c72dbaaa13a 100644 --- a/test-published-dependencies/build.gradle.kts +++ b/test-published-dependencies/build.gradle.kts @@ -37,7 +37,11 @@ allprojects { target("src/**/*.java") removeUnusedImports() forbidWildcardImports() - googleJavaFormat(libs.versions.google.java.format.get()) + princeOfSpace(libs.versions.prince.of.space.get()) + .indentSize(2) + .lineLength(100) + .javaLanguageLevel(25) + trimTrailingWhitespace() } } }