The following changes were performed on the original source code: - removed slf4j, log4j, log4j2 logging - removed internal classes for GraalVM (SCM) - removed internal classes for Blockhound - removed jetbrains annotations - private copy of jctools in io.netty.jctools - removed SecurityManager code - add module info - removed lzma dependency (too old for module) - use JdkZLibDecoder/JdkZlibEncoder in websocketx - removed JettyAlpnSslEngine - removed JettyNpnSslEngine - removed NPN - use of javax.security.cert.X509Certificate replaced by java.security.cert.Certificate (where possible) - unmaintained(?) com.jcraft.zlib copied to io.netty.zlib - precompiled io.netty.util.collection classes added after maven compile to this project - refactored SSL handler to a separate subproject netty-handler-ssl - refactored compression codecs to separate subproject netty-handler-codec-compression - moved netty-tcnative/openssl-classes to netty-internal-tcnative - removed logging handler test - removed all native image stuff and native image handler test (therefore, no graalvm support) - removed all windows related code - removed all macos related code (including kqueue) - removed all aarch64 related code - removed the direct brotli4j dependency by rewriting Brotli4jOptions to not use Encoder.Parameters - removed deprecated channel-udt (transport-udt) Challenges for Netty build on JDK 21 - unmaintained com.jcraft.jzlib, subproject netty-zlib maintains a copy of com.jcraft.zlib - JCTools uses sun.misc.Unsafe, not VarHandles, subproject netty-jctools maintains a copy of jctools - PlatformDependent uses sun.misc.Unsafe. Tests run successful by -add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED and --add-opens=jdk.unsupported/sun.misc=ALL-UNNAMED - finalize() calls in PoolThreadCache, PoolArena are deprecated - when using boringssl static, setting of SSLContent.useTasks to false makes tests hang. Tests using false setting were removed. - native code jars with module info Subproject organization Original netty subproject names are not related to package names. I reorganized the names to allow better assignment between subproject name, package name, artifact names, and java module. The following reorgnizations were performed: netty/all -> netty/bom -> netty/buffer -> netty-buffer netty/codec -> netty-handler-codec, netty-handler-codec-compression, netty-handler-codec-protobuf netty/codec-dns -> netty-handler-codec-dns netty/codec-haproxy -> netty/codec-http -> netty-handler-codec-http, netty-handler-codec-rtsp, netty-handler-codec-spdy netty/codec-http2 -> netty/codec-memcache -> netty/codec-mqtt -> netty/codec-redis -> netty/codec-smtp -> netty/codec-socks -> netty/codec->stomp -> netty/codec-xml -> netty/common -> netty-util netty/handler -> netty-handler netty/handler-proxy netty/handler-ssl-ocsp netty/resolver -> netty-resolver netty/resolver-dns -> netty-resolver-dns netty/resolver-dns-classes-macos -> [dropped] netty/resolver-dns-native-macos -> [dropped] netty/transport -> netty-channel netty/transport-classes-epoll -> netty-channel-epoll netty/transport-native-kqueue -> [dropped] netty/transport-native-unix-common -> netty-channel-unix netty/transport-native-unix-common-tests -> netty-channel-unix