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

Cheolsoo Park commented on SQOOP-480:
-------------------------------------

After having a discussion with Bilung, I wrote a simpler test case that 
reproduces the issue of this jira. I'd like to see if anyone has better 
suggestions on this problem:

1. I define class Foo and Bar in package Name1 and Name2 and export them as 
_Jar1.jar_:

{code:title=Name1.Foo}
package Name1;

public class Foo {
  protected Bar b;

  public Name1.Bar getBar() {
    return b;
  }

  public void setBar(Name1.Bar b) {
    this.b = b;
  }
}
{code}

{code:title=Name1.Bar}
package Name1;

public class Bar {

}
{code}

{code:title=Name2.Foo}
package Name2;

public class Foo extends Name1.Foo {

  public Name2.Bar getBar() {
    return (Name2.Bar)b;
  }
}
{code}

{code:title=Name2.Bar}
package Name2;

public class Bar extends Name1.Bar {

}
{code}

2. I also define Foo and Bar in package Name2 and export them as _Jar2.jar_:

{code:title=Name2.Foo}
package Name2;

public class Foo {
  protected Name2.Bar b;

  public Name2.Bar getBar() {
    return b;
  }

  public void setBar(Name2.Bar b) {
    this.b = b;
  }
}
{code}

{code:title=Name2.Bar}
package Name2;

public class Bar {

}
{code}

3. I compile the following Main class against _Jar2.jar_ and export it as 
_Test.jar_.

{code}
public class Main {

  public static void main(String[] args) {

    Name2.Foo name2Foo = new Name2.Foo();
    Name2.Bar name2Bar = new Name2.Bar();

    name2Foo.setBar(name2Bar);
    Name2.Bar b = name2Foo.getBar();

    System.out.println(b.toString());
  }

}
{code}

4. Now I run Main with the following command:

{code}
java -jar Test.jar
{code}

This works if _Jar2.jar_ is in classpath (not surprising since it is compiled 
against _Jar2.jar_), but it doesn't work if _Jar1.jar_ is in classpath. 
Specifically, it fails with the following error:

{code}
Exception in thread "main" java.lang.NoSuchMethodError: 
Name2.Foo.setBar(LName2/Bar;)V
        at Main.main(Main.java:9)
{code}

What's interesting is that Name2.Foo inherits _setBar(LName2/Bar;)V_ from 
Name1.Foo, so _setBar(LName2/Bar;)V_ should be visible in Name2.Foo. However, 
this doesn't seem to happen if Test.java is compiled against _Jar2.jar_ and run 
with _Jar1.jar_.

Obviously, the easiest and safest way to fix is to re-compile Test.java against 
_Jar1.jar_. But it may be not always feasible if Test.java is 3rd-party 
software (In this jira, Test.java is Microsoft Sqoop connector).

Another workaround that I implemented in my patch is to explicitly define 
_Name2.Foo.setBar(Name2.Bar b)_ in _Jar1.jar_ as follows:

{code}
public void setBar(Name2.Bar b) {
  super.setBar((Name1.Bar)b);
}
{code}

Note that _Name2.Foo.getBar()_ in _Jar1.jar_ must be defined regardless because 
the return type of _Name1.Foo.getBar()_ is Name1.Bar while that of 
_Name2.Foo.getBar()_ is Name2.Bar, and Name1.Bar cannot be auto-cast to 
Name2.Bar. But _Name2.Foo.setBar(Name2.Bar b)_ is somewhat redundant because 
Name2.Bar can be auto-cast to Name1.Bar.

Thoughts?
                
> MS SQL server connector is incompatible with Sqoop-1.4
> ------------------------------------------------------
>
>                 Key: SQOOP-480
>                 URL: https://issues.apache.org/jira/browse/SQOOP-480
>             Project: Sqoop
>          Issue Type: Bug
>            Reporter: Cheolsoo Park
>            Assignee: Cheolsoo Park
>         Attachments: SQOOP-480.patch
>
>
> Sqoop import fails with the following error message:
> 12/04/27 09:29:16 INFO orm.CompilationManager: Writing jar file: 
> /tmp/sqoop-hadoop/compile/
> 45d0bca50cb78c50c20acf18fcd64f90/QualityMeasure.jar
> Exception in thread "main" java.lang.NoSuchMethodError: 
> com.cloudera.sqoop.manager.ImportJobContext.setConnManager(Lcom/cloudera/sqoop/manager/ConnManager;)V
>     at 
> com.microsoft.sqoop.SqlServer.MSSQLServerManager.importTable(MSSQLServerManager.java:142)
>     at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:380)
>     at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:453)
>     at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
>     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
>     at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
>     at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
>     at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
>     at org.apache.sqoop.Sqoop.main(Sqoop.java:238)
>     at com.cloudera.sqoop.Sqoop.main(Sqoop.java:57)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to