From 067964eaad9ca0909440d4166ebfa75874394a30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2026 20:46:40 +0200 Subject: [PATCH 1/5] [ci skip] Update dependency com.puppycrawl.tools:checkstyle to v13.10.0 (#1044) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8c5fa29c9..39f2f049b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,7 +21,7 @@ brigadier = "com.velocitypowered:velocity-brigadier:1.0.0-SNAPSHOT" bstats = "org.bstats:bstats-base:3.2.1" caffeine = "com.github.ben-manes.caffeine:caffeine:3.2.4" checker-qual = "org.checkerframework:checker-qual:4.2.2" -checkstyle = "com.puppycrawl.tools:checkstyle:13.9.0" +checkstyle = "com.puppycrawl.tools:checkstyle:13.10.0" completablefutures = "com.spotify:completable-futures:0.3.6" component = "gg.gemstone:component:1.0.2" configurate3-hocon = { module = "org.spongepowered:configurate-hocon", version.ref = "configurate3" } From 71c50a75eb50a575466192a263b8fc054d58bed7 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:25:15 -0700 Subject: [PATCH 2/5] Export JSpecify annotations at runtime (#1861) JSpecify annotations have runtime retention, so expose them through the API variant as recommended by JSpecify. --- api/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index c8afb7169..65a03a049 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -18,7 +18,7 @@ java { } dependencies { - compileOnlyApi(libs.jspecify) + api(libs.jspecify) api(libs.gson) api(libs.guava) From 14a69904f9d3603af2cb90c2116df1b6966ee94c Mon Sep 17 00:00:00 2001 From: Radmir Noirusov <83647537+bejiihiu@users.noreply.github.com> Date: Wed, 12 Aug 2026 22:29:30 +0500 Subject: [PATCH 3/5] fix: retain reference-counted packets forwarded via handleGeneric (#1856) During configuration, a ServerboundCustomClickActionPacket arriving when connectionInFlight is null falls through to handleGeneric, which writes it to the connected backend without retaining. The encoder releases the packet, then MinecraftConnection.channelRead's finally block releases again - double-free. Two fixes: - handle() now uses getConnectionInFlightOrConnectedServer() so the packet is properly retained before being written - handleGeneric() retains any ByteBufHolder packet before write, not just PluginMessagePacket Closes #1841 --- .../client/ClientConfigSessionHandler.java | 10 +- .../ClientConfigSessionHandlerTest.java | 119 ++++++++++++++++++ 2 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 proxy/src/test/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandlerTest.java diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java index 5cb7188e1..b86041035 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java @@ -47,6 +47,7 @@ import com.velocitypowered.proxy.protocol.packet.config.KnownPacksPacket; import com.velocitypowered.proxy.protocol.util.PluginMessageUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufHolder; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import java.util.concurrent.CompletableFuture; @@ -212,8 +213,9 @@ public boolean handle(ServerboundCookieResponsePacket packet) { @Override public boolean handle(ServerboundCustomClickActionPacket packet) { - if (player.getConnectionInFlight() != null) { - player.getConnectionInFlight().ensureConnected().write(packet.retain()); + VelocityServerConnection serverConnection = player.getConnectionInFlightOrConnectedServer(); + if (serverConnection != null) { + serverConnection.ensureConnected().write(packet.retain()); return true; } @@ -240,8 +242,8 @@ public void handleGeneric(MinecraftPacket packet) { MinecraftConnection smc = serverConnection.getConnection(); if (smc != null && serverConnection.getPhase().consideredComplete()) { - if (packet instanceof PluginMessagePacket) { - ((PluginMessagePacket) packet).retain(); + if (packet instanceof ByteBufHolder bufHolder) { + bufHolder.retain(); } smc.write(packet); } diff --git a/proxy/src/test/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandlerTest.java b/proxy/src/test/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandlerTest.java new file mode 100644 index 000000000..96e27766e --- /dev/null +++ b/proxy/src/test/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandlerTest.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2018-2026 Velocity Contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.velocitypowered.proxy.connection.client; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.velocitypowered.proxy.VelocityServer; +import com.velocitypowered.proxy.connection.MinecraftConnection; +import com.velocitypowered.proxy.connection.backend.BackendConnectionPhase; +import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; +import com.velocitypowered.proxy.protocol.packet.ServerboundCustomClickActionPacket; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.util.ReferenceCountUtil; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class ClientConfigSessionHandlerTest { + + private VelocityServer server; + private ConnectedPlayer player; + private ClientConfigSessionHandler handler; + + @BeforeEach + void setUp() { + server = mock(VelocityServer.class); + player = mock(ConnectedPlayer.class); + handler = new ClientConfigSessionHandler(server, player); + } + + @AfterEach + void tearDown() { + // nothing to clean up; each test manages its own ByteBufs + } + + private ServerboundCustomClickActionPacket makePacket() { + ByteBuf frame = Unpooled.buffer().writeByte(0); + ServerboundCustomClickActionPacket pkt = new ServerboundCustomClickActionPacket(); + pkt.replace(frame.readRetainedSlice(frame.readableBytes())); + return pkt; + } + + @Test + void handleForwardsToInFlightServer() { + VelocityServerConnection inFlight = mock(VelocityServerConnection.class); + MinecraftConnection backend = mock(MinecraftConnection.class); + when(player.getConnectionInFlightOrConnectedServer()).thenReturn(inFlight); + when(inFlight.ensureConnected()).thenReturn(backend); + + ServerboundCustomClickActionPacket pkt = makePacket(); + assertTrue(handler.handle(pkt)); + verify(backend).write(pkt); + ReferenceCountUtil.release(pkt); + } + + @Test + void handleForwardsToConnectedServerWhenInFlightIsNull() { + VelocityServerConnection connected = mock(VelocityServerConnection.class); + MinecraftConnection backend = mock(MinecraftConnection.class); + when(player.getConnectionInFlightOrConnectedServer()).thenReturn(connected); + when(connected.ensureConnected()).thenReturn(backend); + + ServerboundCustomClickActionPacket pkt = makePacket(); + assertTrue(handler.handle(pkt)); + verify(backend).write(pkt); + ReferenceCountUtil.release(pkt); + } + + @Test + void handleReturnsFalseWhenNoServer() { + when(player.getConnectionInFlightOrConnectedServer()).thenReturn(null); + + ServerboundCustomClickActionPacket pkt = makePacket(); + assertFalse(handler.handle(pkt)); + ReferenceCountUtil.release(pkt); + } + + @Test + void handleGenericRetainsAndForwards() { + VelocityServerConnection connected = mock(VelocityServerConnection.class); + MinecraftConnection backend = mock(MinecraftConnection.class); + BackendConnectionPhase phase = mock(BackendConnectionPhase.class); + when(player.getConnectedServer()).thenReturn(connected); + when(connected.getConnection()).thenReturn(backend); + when(connected.getPhase()).thenReturn(phase); + when(phase.consideredComplete()).thenReturn(true); + + ServerboundCustomClickActionPacket pkt = makePacket(); + int refBefore = pkt.refCnt(); + + handler.handleGeneric(pkt); + + // retain() was called (+1) before write + assertEquals(refBefore + 1, pkt.refCnt()); + verify(backend).write(pkt); + ReferenceCountUtil.release(pkt); + } +} From e6fbcc9196c110b9fb458d8fc1ac9812e8f36f58 Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Wed, 12 Aug 2026 19:32:24 +0200 Subject: [PATCH 4/5] Various dependency bumps (#1860) * Bump fastutil to 8.5.19 and remove exclusions * Various dependency bumps --- gradle/libs.versions.toml | 32 ++++++++++----------- proxy/build.gradle.kts | 59 --------------------------------------- 2 files changed, 16 insertions(+), 75 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f3e5a9ad1..9c12ac2dd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,24 +2,24 @@ configurate3 = "3.7.3" configurate4 = "4.2.0" flare = "2.0.1" -log4j = "2.26.0" +log4j = "2.26.1" netty = "4.2.16.Final" [plugins] fill = "io.papermc.fill.gradle:1.0.12" -shadow = "com.gradleup.shadow:9.5.1" -spotless = "com.diffplug.spotless:8.2.0" +shadow = "com.gradleup.shadow:9.6.1" +spotless = "com.diffplug.spotless:8.9.0" [libraries] adventure-bom = "net.kyori:adventure-bom:5.2.0" adventure-text-serializer-json-legacy-impl = "net.kyori:adventure-text-serializer-json-legacy-impl:5.2.0" -asm = "org.ow2.asm:asm:9.9.1" +asm = "org.ow2.asm:asm:9.10.1" auto-service = "com.google.auto.service:auto-service:1.1.1" auto-service-annotations = "com.google.auto.service:auto-service-annotations:1.1.1" brigadier = "com.velocitypowered:velocity-brigadier:1.0.0-SNAPSHOT" -bstats = "org.bstats:bstats-base:3.1.0" -caffeine = "com.github.ben-manes.caffeine:caffeine:3.2.3" -checker-qual = "org.checkerframework:checker-qual:3.53.0" +bstats = "org.bstats:bstats-base:3.2.1" +caffeine = "com.github.ben-manes.caffeine:caffeine:3.2.4" +checker-qual = "org.checkerframework:checker-qual:4.2.1" checkstyle = "com.puppycrawl.tools:checkstyle:10.9.3" completablefutures = "com.spotify:completable-futures:0.3.6" configurate3-hocon = { module = "org.spongepowered:configurate-hocon", version.ref = "configurate3" } @@ -29,24 +29,24 @@ configurate4-hocon = { module = "org.spongepowered:configurate-hocon", version.r configurate4-yaml = { module = "org.spongepowered:configurate-yaml", version.ref = "configurate4" } configurate4-gson = { module = "org.spongepowered:configurate-gson", version.ref = "configurate4" } disruptor = "com.lmax:disruptor:4.0.0" -fastutil = "it.unimi.dsi:fastutil:8.5.18" +fastutil = "it.unimi.dsi:fastutil:8.5.19" flare-core = { module = "space.vectrix.flare:flare", version.ref = "flare" } flare-fastutil = { module = "space.vectrix.flare:flare-fastutil", version.ref = "flare" } jline = "org.jline:jline-terminal-ffm:4.3.1" jopt = "net.sf.jopt-simple:jopt-simple:5.0.4" -junit = "org.junit.jupiter:junit-jupiter:6.0.3" -jspecify = "org.jspecify:jspecify:1.0.0" +junit = "org.junit.jupiter:junit-jupiter:6.1.2" +jspecify = "org.jspecify:jspecify:1.0.1" kyori-ansi = "net.kyori:ansi:1.1.1" guava = "com.google.guava:guava:33.6.0-jre" gson = "com.google.code.gson:gson:2.14.0" guice = "com.google.inject:guice:7.0.0" -lmbda = "org.lanternpowered:lmbda:2.0.0" +lmbda = "org.lanternpowered:lmbda:3.0.0" log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } log4j-slf4j-impl = { module = "org.apache.logging.log4j:log4j-slf4j2-impl", version.ref = "log4j" } log4j-iostreams = { module = "org.apache.logging.log4j:log4j-iostreams", version.ref = "log4j" } log4j-jul = { module = "org.apache.logging.log4j:log4j-jul", version.ref = "log4j" } -mockito = "org.mockito:mockito-core:5.22.0" +mockito = "org.mockito:mockito-core:5.23.0" netty-codec = { module = "io.netty:netty-codec", version.ref = "netty" } netty-codec-haproxy = { module = "io.netty:netty-codec-haproxy", version.ref = "netty" } netty-codec-http = { module = "io.netty:netty-codec-http", version.ref = "netty" } @@ -54,10 +54,10 @@ netty-handler = { module = "io.netty:netty-handler", version.ref = "netty" } netty-transport-native-epoll = { module = "io.netty:netty-transport-native-epoll", version.ref = "netty" } netty-transport-native-kqueue = { module = "io.netty:netty-transport-native-kqueue", version.ref = "netty" } netty-transport-native-iouring = { module = "io.netty:netty-transport-native-io_uring", version.ref = "netty" } -nightconfig = "com.electronwill.night-config:toml:3.8.3" -slf4j = "org.slf4j:slf4j-api:2.0.17" -snakeyaml = "org.yaml:snakeyaml:2.5" -spotbugs-annotations = "com.github.spotbugs:spotbugs-annotations:4.9.8" +nightconfig = "com.electronwill.night-config:toml:3.9.0" +slf4j = "org.slf4j:slf4j-api:2.0.18" +snakeyaml = "org.yaml:snakeyaml:2.6" +spotbugs-annotations = "com.github.spotbugs:spotbugs-annotations:4.10.3" terminalconsoleappender = "net.minecrell:terminalconsoleappender:1.3.0" [bundles] diff --git a/proxy/build.gradle.kts b/proxy/build.gradle.kts index c026bda46..136f66a7c 100644 --- a/proxy/build.gradle.kts +++ b/proxy/build.gradle.kts @@ -33,65 +33,6 @@ tasks { transform(Log4j2PluginsCacheFileTransformer::class.java) - // Exclude all the collection types we don"t intend to use - exclude("it/unimi/dsi/fastutil/booleans/**") - exclude("it/unimi/dsi/fastutil/bytes/**") - exclude("it/unimi/dsi/fastutil/chars/**") - exclude("it/unimi/dsi/fastutil/doubles/**") - exclude("it/unimi/dsi/fastutil/floats/**") - exclude("it/unimi/dsi/fastutil/longs/**") - exclude("it/unimi/dsi/fastutil/shorts/**") - - // Exclude the fastutil IO utilities - we don"t use them. - exclude("it/unimi/dsi/fastutil/io/**") - - // Exclude most of the int types - Object2IntMap have a values() method that returns an - // IntCollection, and we need Int2ObjectMap - exclude("it/unimi/dsi/fastutil/ints/*Int2Boolean*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Byte*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Char*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Double*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Float*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Int*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Long*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Short*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Reference*") - exclude("it/unimi/dsi/fastutil/ints/IntAVL*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayF*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayI*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayL*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayP*") - exclude("it/unimi/dsi/fastutil/ints/IntArraySet*") - exclude("it/unimi/dsi/fastutil/ints/*IntBi*") - exclude("it/unimi/dsi/fastutil/ints/Int*Pair") - exclude("it/unimi/dsi/fastutil/ints/IntLinked*") - exclude("it/unimi/dsi/fastutil/ints/IntList*") - exclude("it/unimi/dsi/fastutil/ints/IntHeap*") - exclude("it/unimi/dsi/fastutil/ints/IntOpen*") - exclude("it/unimi/dsi/fastutil/ints/IntRB*") - exclude("it/unimi/dsi/fastutil/ints/IntSorted*") - exclude("it/unimi/dsi/fastutil/ints/*Priority*") - exclude("it/unimi/dsi/fastutil/ints/*BigList*") - - // Try to exclude everything BUT Object2Int{LinkedOpen,Open,CustomOpen}HashMap - exclude("it/unimi/dsi/fastutil/objects/*ObjectArray*") - exclude("it/unimi/dsi/fastutil/objects/*ObjectAVL*") - exclude("it/unimi/dsi/fastutil/objects/*Object*Big*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Boolean*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Byte*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Char*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Double*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Float*") - exclude("it/unimi/dsi/fastutil/objects/*Object2IntArray*") - exclude("it/unimi/dsi/fastutil/objects/*Object2IntAVL*") - exclude("it/unimi/dsi/fastutil/objects/*Object2IntRB*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Long*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Object*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Reference*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Short*") - exclude("it/unimi/dsi/fastutil/objects/*ObjectRB*") - exclude("it/unimi/dsi/fastutil/objects/*Reference*") - // Exclude Checker Framework annotations exclude("org/checkerframework/checker/**") From c20a83149cdbcae1efc9da2e18b05f340529d292 Mon Sep 17 00:00:00 2001 From: RootBeer Date: Wed, 12 Aug 2026 13:42:28 -0400 Subject: [PATCH 5/5] Rebase --- proxy/build.gradle.kts | 58 ------------------------------------------ 1 file changed, 58 deletions(-) diff --git a/proxy/build.gradle.kts b/proxy/build.gradle.kts index ad4dbc475..cdb9d2d9a 100644 --- a/proxy/build.gradle.kts +++ b/proxy/build.gradle.kts @@ -82,64 +82,6 @@ tasks { transform(Log4j2PluginsCacheFileTransformer::class.java) - // Exclude all the collection types we don't intend to use - exclude("it/unimi/dsi/fastutil/booleans/**") - exclude("it/unimi/dsi/fastutil/bytes/**") - exclude("it/unimi/dsi/fastutil/chars/**") - exclude("it/unimi/dsi/fastutil/doubles/**") - exclude("it/unimi/dsi/fastutil/floats/**") - exclude("it/unimi/dsi/fastutil/longs/**") - exclude("it/unimi/dsi/fastutil/shorts/**") - - // Exclude the fastutil IO utilities - we don't use them. - exclude("it/unimi/dsi/fastutil/io/**") - - // Exclude most of the int types - Object2IntMap have a values() method that returns an - // IntCollection, and we need Int2ObjectMap - exclude("it/unimi/dsi/fastutil/ints/*Int2Boolean*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Byte*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Char*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Double*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Float*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Int*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Long*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Short*") - exclude("it/unimi/dsi/fastutil/ints/*Int2Reference*") - exclude("it/unimi/dsi/fastutil/ints/IntAVL*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayF*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayI*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayL*") - exclude("it/unimi/dsi/fastutil/ints/IntArrayP*") - exclude("it/unimi/dsi/fastutil/ints/IntArraySet*") - exclude("it/unimi/dsi/fastutil/ints/*IntBi*") - exclude("it/unimi/dsi/fastutil/ints/Int*Pair") - exclude("it/unimi/dsi/fastutil/ints/IntLinked*") - exclude("it/unimi/dsi/fastutil/ints/IntList*") - exclude("it/unimi/dsi/fastutil/ints/IntHeap*") - exclude("it/unimi/dsi/fastutil/ints/IntOpen*") - exclude("it/unimi/dsi/fastutil/ints/IntRB*") - exclude("it/unimi/dsi/fastutil/ints/IntSorted*") - exclude("it/unimi/dsi/fastutil/ints/*Priority*") - exclude("it/unimi/dsi/fastutil/ints/*BigList*") - - // Try to exclude everything BUT Object2Int{LinkedOpen,Open,CustomOpen}HashMap - exclude("it/unimi/dsi/fastutil/objects/*ObjectAVL*") - exclude("it/unimi/dsi/fastutil/objects/*Object*Big*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Boolean*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Byte*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Char*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Double*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Float*") - exclude("it/unimi/dsi/fastutil/objects/*Object2IntArray*") - exclude("it/unimi/dsi/fastutil/objects/*Object2IntAVL*") - exclude("it/unimi/dsi/fastutil/objects/*Object2IntRB*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Long*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Object*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Reference*") - exclude("it/unimi/dsi/fastutil/objects/*Object2Short*") - exclude("it/unimi/dsi/fastutil/objects/*ObjectRB*") - exclude("it/unimi/dsi/fastutil/objects/*Reference*") - // Exclude Checker Framework annotations exclude("org/checkerframework/checker/**")