Java:导入时无法访问类中的接口

时间:2017-06-07 15:25:30

标签: java apache-spark import hive classloader

enter image description here

我在程序中使用maven依赖 hive-hcatalog-core

并且这个jar存在于项目maven依赖项中,带有接口(如图像顶部)。

接口ICacheableMetaStoreClient虽然是类,但不能从import org.apache.hive.hcatalog.common解析。 (image -bottom)

因此,在做一个spark-submit时,我得到了例外:

  

com.google.common.util.concurrent.UncheckedExecutionException:   java.lang.IllegalArgumentException:interface   org.apache.hive.hcatalog.common.HiveClientCache $ ICacheableMetaStoreClient   从类加载器

中看不到

我需要做些什么才能从程序类路径中看到它。

1 个答案:

答案 0 :(得分:1)

让我们看一下代码:

huge_t

class HiveClientCache {..} 仅具有包级别可见性,并且它与HiveClientCache一起无法在该包之外导入(这包括在您的代码中)。

现在让我们看一下ICacheableMetaStoreClientwont

ICacheableMetaStoreClient

接口是公共的,但在其上有注释,使得Hive / Hadoop进行额外的预处理以检查对象类型并抛出IllegalArgumentException。

以下是@InterfaceAudience.Private public interface ICacheableMetaStoreClient extends IMetaStoreClient {....} 的JavaDoc:

  

注释,以告知用户包,类或方法的用途   听众。目前观众可以是InterfaceAudience.Public,   InterfaceAudience.LimitedPrivate或InterfaceAudience.Private。所有   公共类必须具有InterfaceAudience注释。

     
      
  • 默认情况下,未标记此注释的公共类必须视为InterfaceAudience.Private。
  •   
  • 外部应用程序只能使用标记为InterfaceAudience.Public的类。避免使用非公共类   可以删除或以不兼容的方式更改类。
  •   
  • Hadoop项目必须只使用标记为InterfaceAudience.LimitedPrivate或InterfaceAudience.Public的类
  •   
  • 方法可能有不同的注释,与类的受众分类相比,它更具限制性。示例:一个类   可能是InterfaceAudience.Public,但方法可能是   InterfaceAudience.LimitedPrivate
  •