HADOOP-12406. Fixed AbstractMapWritable.readFields to use the thread's ClassLoader to load class instead of System ClassLoader. Contributed by Nadeem Douba.
(cherry picked from commit 069c6c62def4a0f94382e9f149581d8e22f6d31c) (cherry picked from commit 4041d2b49e32c7bcf4ec29428b8a85b07b9f74e0)
This commit is contained in:
parent
689d19575f
commit
9721735ce9
@ -181,20 +181,22 @@ public void write(DataOutput out) throws IOException {
|
||||
public void readFields(DataInput in) throws IOException {
|
||||
|
||||
// Get the number of "unknown" classes
|
||||
|
||||
newClasses = in.readByte();
|
||||
|
||||
|
||||
// Use the classloader of the current thread to load classes instead of the
|
||||
// system-classloader so as to support both client-only and inside-a-MR-job
|
||||
// use-cases. The context-loader by default eventually falls back to the
|
||||
// system one, so there should be no cases where changing this is an issue.
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
|
||||
// Then read in the class names and add them to our tables
|
||||
|
||||
for (int i = 0; i < newClasses; i++) {
|
||||
byte id = in.readByte();
|
||||
String className = in.readUTF();
|
||||
try {
|
||||
addToMap(Class.forName(className), id);
|
||||
|
||||
addToMap(classLoader.loadClass(className), id);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException("can't find class: " + className + " because "+
|
||||
e.getMessage());
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user