[ 
https://issues.apache.org/jira/browse/HADOOP-9424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13655973#comment-13655973
 ] 

Tom White commented on HADOOP-9424:
-----------------------------------

This change would basically load X.jar in the system classloader. RunJar also 
loads any classes and resources in a classes directory in X.jar, and any 
embedded JARs in a lib directory, but these would not be added to the system 
classpath with this fix. So the same scenario that you describe could occur for 
Bar in X.jar and Foo in an embedded JAR.

I'm also wary of making an environmental/classpath change like this without 
running tests with Hive, Pig etc. Perhaps Bigtop testing could help here.

What's the scenario that you are seeing this in? Is the workaround not 
sufficient?
                
> The "hadoop jar" invocation should include the passed jar on the classpath as 
> a whole
> -------------------------------------------------------------------------------------
>
>                 Key: HADOOP-9424
>                 URL: https://issues.apache.org/jira/browse/HADOOP-9424
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: util
>    Affects Versions: 2.0.3-alpha
>            Reporter: Harsh J
>            Assignee: Harsh J
>            Priority: Minor
>         Attachments: HADOOP-9424.patch
>
>
> When you have a case such as this:
> {{X.jar -> Classes = Main, Foo}}
> {{Y.jar -> Classes = Bar}}
> With implementation details such as:
> * Main references Bar and invokes a public, static method on it.
> * Bar does a class lookup to find Foo (Class.forName("Foo")).
> Then when you do a {{HADOOP_CLASSPATH=Y.jar hadoop jar X.jar Main}}, the 
> Bar's method fails with a ClassNotFound exception cause of the way RunJar 
> runs.
> RunJar extracts the passed jar and includes its contents on the ClassLoader 
> of its current thread but the {{Class.forName(…)}} call from another class 
> does not check that class loader and hence cannot find the class as its not 
> on any classpath it is aware of.
> The script of "hadoop jar" should ideally include the passed jar argument to 
> the CLASSPATH before RunJar is invoked, for this above case to pass.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to