[
https://issues.apache.org/jira/browse/CASSANDRA-10984?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15228978#comment-15228978
]
Alex Petrov commented on CASSANDRA-10984:
-----------------------------------------
I mostly meant that if there's a class name collision, using {{netty-all}}
would quoting OP "put you at grace of classloader", since {{netty-all}} shades
all deps, and using individual deps allows user overriding (assuming APIs are
kept intact within C* / dependant version).
But I agree about the effort...
> Cassandra should not depend on netty-all
> ----------------------------------------
>
> Key: CASSANDRA-10984
> URL: https://issues.apache.org/jira/browse/CASSANDRA-10984
> Project: Cassandra
> Issue Type: Improvement
> Reporter: James Roper
> Assignee: Alex Petrov
> Priority: Minor
> Attachments:
> 0001-Use-separate-netty-depencencies-instead-of-netty-all.patch,
> 0001-with-binaries.patch
>
>
> netty-all is a jar that bundles all the individual netty dependencies for
> convenience together for people trying out netty to get started quickly.
> Serious projects like Cassandra should never ever ever use it, since it's a
> recipe for classpath disasters.
> To illustrate, I'm running Cassandra embedded in an app, and I get this error:
> {noformat}
> [JVM-1] java.lang.NoSuchMethodError:
> io.netty.util.internal.PlatformDependent.newLongCounter()Lio/netty/util/internal/LongCounter;
> [JVM-1] at io.netty.buffer.PoolArena.<init>(PoolArena.java:64)
> ~[netty-buffer-4.0.33.Final.jar:4.0.33.Final]
> [JVM-1] at
> io.netty.buffer.PoolArena$HeapArena.<init>(PoolArena.java:593)
> ~[netty-buffer-4.0.33.Final.jar:4.0.33.Final]
> [JVM-1] at
> io.netty.buffer.PooledByteBufAllocator.<init>(PooledByteBufAllocator.java:179)
> ~[netty-buffer-4.0.33.Final.jar:4.0.33.Final]
> [JVM-1] at
> io.netty.buffer.PooledByteBufAllocator.<init>(PooledByteBufAllocator.java:153)
> ~[netty-buffer-4.0.33.Final.jar:4.0.33.Final]
> [JVM-1] at
> io.netty.buffer.PooledByteBufAllocator.<init>(PooledByteBufAllocator.java:145)
> ~[netty-buffer-4.0.33.Final.jar:4.0.33.Final]
> [JVM-1] at
> io.netty.buffer.PooledByteBufAllocator.<clinit>(PooledByteBufAllocator.java:128)
> ~[netty-buffer-4.0.33.Final.jar:4.0.33.Final]
> [JVM-1] at
> org.apache.cassandra.transport.CBUtil.<clinit>(CBUtil.java:56)
> ~[cassandra-all-3.0.0.jar:3.0.0]
> [JVM-1] at org.apache.cassandra.transport.Server.start(Server.java:134)
> ~[cassandra-all-3.0.0.jar:3.0.0]
> {noformat}
> {{PlatformDependent}} comes from netty-common, of which version 4.0.33 is on
> the classpath, but it's also provided by netty-all, which has version 4.0.23
> brought in by cassandra. By a fluke of classpath ordering, the classloader
> has loaded the netty buffer classes from netty-buffer 4.0.33, but the
> PlatformDependent class from netty-all 4.0.23, and these two versions are not
> binary compatible, hence the linkage error.
> Essentially to avoid these problems in serious projects, anyone that ever
> brings in cassandra is going to have to exclude the netty dependency from it,
> which is error prone, and when you get it wrong, due to the nature of
> classpath ordering bugs, it might not be till you deploy to production that
> you actually find out there's a problem.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)