I think it would be a great idea for Avro if we took our more critical core dependencies and included their classes, obfuscated, in our jar file so that we don't have to worry about others conflicting with our versions.
I'm currently working on a Maven build for Avro Java, and one thing that we can easily leverage there is the 'shade' plugin. This basically just migrates the package of a dependency into your namespace at build-time. For example, see the "Using Paranamer in your application without depending on Paranamer's jar" portion of http://paranamer.codehaus.org/ A simple example where this would help: Avro is currently 'incompatible' with Hadoop 0.20+ because Hadoop includes Jackson 1.0.1 and has a very unsophisticated dependency management system. If we packaged our version of Jackson into Avro, or provided a variation that did, then this would not be an issue for users. For avro-core, the libraries of interest are Paranamer and Jackson. Paranamer only adds up to 35K; Jackson is a bit larger at 500K but is absolutely critical for Avro. Jackson-core is only 150K however -- it might be possible to drop jackson-mapper. Paranamer is BSD, and Jackson is Apache. I'm not sure of the implications of repackaging these into Avro. I'd assume that BSD as usual doesn't care as long as the use is documented and attributed. Since we're apache I'm guessing it won't be too hard to deal with Jackson either. But I'm not sure if there is anything extra we have to declare. Thoughts? -Scott
