java:导入时类中的接口不可访问

dgjrabp2  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(399)


我在我的程序中使用maven依赖hivehcatalog核心
这个jar存在于项目maven依赖项中,带有接口(如上图所示)。

接口icacheablemetastoreclient虽然存在该类,但无法从import org.apache.hive.hcatalog.common解析(图片-底部)

因此,在执行spark提交时,我遇到了一个例外:
com.google.common.util.concurrent.uncheckedexecutionexception:java.lang.illegalargumentexception:interface org.apache.hive.hcatalog.common.hiveclientcache$icacheablemetastoreclient在类加载器中不可见
我需要做些什么才能从程序类路径看到它。

7d7tgy0s

7d7tgy0s1#

让我们看看代码:

class HiveClientCache {..}

这个 HiveClientCache 只有包级别的可见性,并且它与 ICacheableMetaStoreClientwont 将不可用于在该包之外导入(这包括在您的代码中)。
现在让我们看看 ICacheableMetaStoreClient :

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

接口是公共的,但是它上面有注解,使得hive/hadoop需要额外的预处理来检查对象类型并抛出illegalargumentexception。
这是javadoc InterfaceAudience :
通知用户包、类或方法的预期读者的注解。当前受众可以是interfaceaudience.public、interfaceaudience.limitedprivate或interfaceaudience.private。所有公共类都必须具有interfaceaudience注解。
默认情况下,未标记此注解的公共类必须视为interfaceaudience.private。
外部应用程序只能使用标记为interfaceaudience.public的类。避免使用非公共类,因为这些类可能以不兼容的方式被删除或更改。
hadoop项目只能使用标记为interfaceaudience.limitedprivate或interfaceaudience.public的类
方法可能有不同的注解,与类的受众分类相比,它更具限制性。示例:类可以是interfaceaudience.public,但方法可以是interfaceaudience.limitedprivate

相关问题