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

Reply via email to