为什么我无法访问另一个jar中的包私有类(未密封)?

时间:2017-09-09 17:39:41

标签: java classloader package-private

我遇到了Java classloader的奇怪行为:

假设我向集群提交了一个Apache Spark jar,其中包含HiveServer2的扩展:

package org.apache.hive.service.server;
public class MyOP2 extends HiveServer2.ServerOptionsProcessor(
  String var) {
...

HiveServer2.ServerOptionsProcessor类已经预先加载到集群上(作为Spark依赖项),但是被声明为package-private。

package org.apache.hive.service.server;
public class HiveServer2 extends CompositeService {
...

  static interface ServerOptionsExecutor {
  ...
  }
}

在设置群集时,首先加载此类。然后,当我的应用程序提交时,我的类(在另一个jar中)由同一个JVM加载。

此时我收到以下错误:

  

线程“main”java.lang.IllegalAccessError:class中的异常   org.apache.hive.service.server.DPServerOptionsProcessor无法访问   它的超类   org.apache.hive.service.server.HiveServer2 $ ServerOptionsProcessor at   java.lang.ClassLoader.defineClass1(Native Method)at   java.lang.ClassLoader.defineClass(ClassLoader.java:763)at   java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     在java.net.URLClassLoader.defineClass(URLClassLoader.java:467)at   java.net.URLClassLoader.access $ 100(URLClassLoader.java:73)at   java.net.URLClassLoader $ 1.run(URLClassLoader.java:368)at   java.net.URLClassLoader $ 1.run(URLClassLoader.java:362)at   java.security.AccessController.doPrivileged(Native Method)at   java.net.URLClassLoader.findClass(URLClassLoader.java:361)at   java.lang.ClassLoader.loadClass(ClassLoader.java:424)at   java.lang.ClassLoader.loadClass(ClassLoader.java:357)at   org.apache.spark.sql.hive.thriftserver.DPHiveThriftServer2 $。主要(DPHiveThriftServer2.scala:26)     在   org.apache.spark.sql.hive.thriftserver.DPHiveThriftServer2.main(DPHiveThriftServer2.scala)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)at   org.apache.spark.deploy.SparkSubmit $ .ORG $阿帕奇$火花$部署$ SparkSubmit $$ runMain(SparkSubmit.scala:731)     在   org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:181)     在org.apache.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:206)     在org.apache.spark.deploy.SparkSubmit $ .main(SparkSubmit.scala:121)     在org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我的印象是,package-private类可以被同一个包中的任何其他类访问。我已经仔细检查了Spark罐子里的清单文件,没有人将org.apache.hive.service.server声明为密封包。那么为什么JVM类加载器给了我这个错误呢? JVM用于触发异常的条件是什么?

1 个答案:

答案 0 :(得分:1)

由于2个包由不同的ClassLoader加载,因此它们被视为2个不同的包,因此这意味着无法访问包私有方法,从而导致出现错误消息

More Info