java - Java:导入时无法访问类中的接口(interface)-LMLPHP

我在程序中使用了Maven依赖项hive-hcatalog-core

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

接口ICacheableMetaStoreClient尽管提供了该类,但无法从导入org.apache.hive.hcatalog.common解析。 (图片-底部)

因此,在执行火花提交时,我遇到了异常:


  com.google.common.util.concurrent.UncheckedExecutionException:
  java.lang.IllegalArgumentException:接口
  org.apache.hive.hcatalog.common.HiveClientCache $ ICacheableMetaStoreClient
  在类加载器中不可见


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

最佳答案

让我们看一下代码:

class HiveClientCache {..}


HiveClientCache仅具有程序包级别的可见性,它与ICacheableMetaStoreClientwont一起将无法在该程序包外部导入(这包括在您的代码中)。

现在让我们看一下ICacheableMetaStoreClient

@InterfaceAudience.Private
public interface ICacheableMetaStoreClient extends IMetaStoreClient {....}


该接口是公共的,但是具有注释,这使Hive / Hadoop进行了额外的预处理以检查对象类型并引发IllegalArgumentException。

这是InterfaceAudience的JavaDoc:


  通知用户有关包,类或方法的预期用途的注释
  听众。目前,目标对象可以是InterfaceAudience.Public,
  InterfaceAudience.LimitedPrivate或InterfaceAudience.Private。所有
  公共类必须具有InterfaceAudience批注。
  
  
  默认情况下,未使用此批注标记的公共类必须视为InterfaceAudience.Private。
  外部应用程序只能使用标记为InterfaceAudience.Public的类。避免使用非公共类,因为这些
  可以以不兼容的方式删除或更改类。
  Hadoop项目只能使用标记为InterfaceAudience.LimitedPrivate或InterfaceAudience.Public的类
  方法可能具有不同的注释,与类的受众分类相比,注释的限制性更强。示例:一个类
  可能是InterfaceAudience.Public,但是方法可能是
  InterfaceAudience.LimitedPrivate

10-06 00:10