2017-09-09 3 views
0

私は、Javaのクラスローダの奇妙な行動が発生しました:クラスHiveServer2.ServerOptionsProcessorがすでにある他のjar(パッケージされていない)のpackage-privateクラスにアクセスできないのはなぜですか?

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

:私はHiveServer2の延長を含むクラスタにApacheのスパーク瓶を提出すると仮定すると

(Sparkの依存関係として)クラスタにあらかじめロードされていますが、package-privateとして宣言されています。

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

    static interface ServerOptionsExecutor { 
    ... 
    } 
} 

このクラスは、クラスタのセットアップ時に最初にロードされます。次に、アプリケーションがサブミットされるときに、同じJVMによってクラス(別のjarファイル)が読み込まれます。

この時点で、私は次のエラーました:私はパッケージプライベートクラスが同じパッケージに他のクラスによってアクセスすることができるという印象の下だ

Exception in thread "main" java.lang.IllegalAccessError: class org.apache.hive.service.server.DPServerOptionsProcessor cannot access its superclass 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) at 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$.main(DPHiveThriftServer2.scala:26) at 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) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

を。そして、私はSparkのjarファイルでマニフェストファイルをダブルチェックしました。誰もorg.apache.hive.service.serverを密封パッケージとして宣言しませんでした。なぜJVMクラスローダーが私にこのエラーを教えたのですか? JVMが例外をトリガするために使用した条件は何ですか? 2つのパッケージとして

+0

で、その結果、アクセスできないことを意味していますクラスローダーは2つのクラスをロードします – jrtapsell

+0

stacktraceから、普通の古いURLClassLoaderのようです。 – tribbloid

+0

それらは同じクラスローダーですか? – jrtapsell

答えて

1

は、彼らは2つの異なるパッケージとして扱われる異なるクラスローダによってロードされ、これはパッケージプライベートメソッドは、あなたがチェックできるエラーメッセージ

More Info

関連する問題