我遇到了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用于触发异常的条件是什么?