今天从经理那里下载了一个工程后,将里面的jre换成了自己本地的jre(jdk1.6.0_26)。然后问题就来了,工程里有一个类提示有错误,我顺着红叉叉找到错误原因:“The method getTextContent() is undefined for the type Node".
  我看了看Node这个类,是org.w3c.dom.Node,然后我去查了下jdk1.6的API,发现Node这个类有getTextContent()这个方法,然后我想到可能是引用的jar包不同所导致的。
  我用的时Myeclipse8.6,我按住Ctrl键点了一下工程中的Node类,进去后发现引用的是“hibernate3.1的xml-apis.jar包”。我顿时懵了,好端端的jdk1.6的jar包你不用,用啥hibernate的。我请教了经理,经理在帮我看了一会后,找到了.classpath文件,将里面“ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.6.0_26"/>”放在了<classpath>节点的第一个子节点上。然后问题就解决了。
   虽然问题解决了,但是我还是有一个疑问。假如说,还存在另外一个类“org.w3c.dom.test”,同时存在于jdk和hibernate的jar包中,我想要org.w3c.dom.Node这个类使用jdk的,org.w3c.dom.test这个类使用hibernate的。那又该怎么解决?

解决方案 »

  1.   

    如果存在重名的类解决起来很简单啊
    第一,需要哪个类import进来哪个类,不需要的就不import进来
    第二,如果一个两个类名相同而且在一个Java文件使用,那么操作的时候用类的完整限定名,比如说java.util.Date d1=new java.util.Date()
    java.sql.Date d2=new java.sql.Date()
    其实你那个问题根本上还是代码写的问题,同时如果有Node同时都import进来而没有完整限定名,那么就看环境里面哪个靠前了,这个方案不靠谱
      

  2.   

    根本没看明白楼主再说啥。楼主的情况是:classpath里有同一个类的不同版本.
      

  3.   

    java引入package这个概念很大程度上就是为了避免类重名带来的困扰。
      

  4.   

    1楼说的是对的。是你经理用的时候用了hibernate的包罢了。
      

  5.   

    楼主我觉得你们的工程管理上存在问题,竟然存在同名类而且同路径,同时存在2个不同的jar文件的情况。这是要坚决杜绝的;如果这样以后查个bug都不好查,而且会觉得莫名其妙。
      

  6.   

    是我没解释清楚吗?
     我的意思是说两个类的包名和类名是相同的,但是jar包不同。
     不是import的问题,因为引用的都是org.w3c.dom.Node。
     但是jdk的rt.jar和hibernate3.1的xml-apis.jar中都有org.w3c.dom.Node这个类。而且hibernate3.1中的Node类没有getTextContent()这个方法。
      我想到的是:可能hibernate3.1中的jar包是jdk1.4以下版本编译的。