2017-12-04 4 views
1

javaではコマンドラインの環境を独自のものではなく使用できますか?NoSuchFieldError Javaから実行されたがコマンドラインから実行されなかった場合

私は私が期待どおりに動作しますコマンドライン上でスクリプトを実行すると

final ProcessBuilder pb = new ProcessBuilder("bash", "-x", exportScriptLoc, platformId, oldWorkFlowId, 
      newWorkFlowId).inheritIO(); 
    pb.directory(new File("/opt/nis/ddziak-dev/nis-hadoop")); 
    final Process p = pb.start(); 
    p.waitFor(); 
    final int exitValue = p.exitValue(); 
    p.destroy(); 
    if (exitValue == 0) { 

でbashスクリプトを呼び出すJavaプログラムを持っています。私のJavaプログラムは、スクリプトを実行すると、それは次の例外を生成します。

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient 
    at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:347) 
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681) 
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:625) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212) 
Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient 
    at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1422) 
    at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:62) 
    at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:72) 
    at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:2457) 
    at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:2469) 
    at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:341) 
    ... 7 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1420) 
    ... 12 more 
Caused by: java.lang.NoSuchFieldError: SASL_PROPS 
    at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S.getHadoopSaslProperties(HadoopThriftAuthBridge20S.java:127) 
    at org.apache.hadoop.hive.metastore.MetaStoreUtils.getMetaStoreSaslProperties(MetaStoreUtils.java:1485) 
    at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(HiveMetaStoreClient.java:322) 
    at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:214) 
    ... 17 more 

#!/bin/bash 

. ~/.bash_profile 
export HIVE_HOME=/usr/lib/hive 
#export PATH=$PATH:$HIVE_HOME/bin 

env 
echo "hive -S -e \"show partitions nis.subscribers 
partition(destinationPlatformId='$1', build='$2');\"|awk '{if(NR>1)print}'" >> subscribers.out 
PARTITIONS=`/usr/bin/hive -S -e "show partitions nis.subscribers 
partition(destinationPlatformId='$1', build='$2');"|awk '{if(NR>1)print}'` 
echo "${PARTITIONS}" 
if [ -z "$PARTITIONS" ] 
then 
    exit 2 
fi 


echo "${PARTITIONS}" 

hqlOut=`/usr/bin/hive -S -hiveconf destPlatId=$1 -hiveconf newWorkFlowId=$3 -hiveconf oldWorkFlowId=$2 -f /opt/nis/ddziak-dev/nis- 
hadoop/dapLib/updateSubscriberHiveTable.hql` 

newPARTITIONS=`/usr/bin/hive -S -e "show partitions nis.subscribers partition(destinationPlatformId='$1');"|awk '{if(NR>1)print}'` 
if [ -z "$newPARTITIONS" ] 
then 
    exit 3 
fi 
+0

何らかの理由で参照されているさまざまなバージョンのクラスを使用しています。 – chrylis

答えて

1

を次のようにスクリプトがあるこれは、Javaではなく、独自のコマンドラインの環境を使うことは可能ですか?

「コマンドラインの環境」の意味によって異なります。あなたが意味する場合ということは、値に変数名からのマッピングの狭い意味では、

  • あなたのVMを起動させるjavaコマンドがそれを起動するコマンドからその環境を取得します。それは "コマンドラインの環境"にうまくいかない可能性があります。

  • ProcessBuilderの助けを借りて起動するプロセスは、異なる環境を作成するアクションを取らない限り、VMの環境のコピーを継承しません。

しかし、あなたは間違った木を吠えていると思います。それは、環境問題がjava.lang.NoSuchFieldErrorに間接的に貢献するかもしれないと考えられるが、そのようErrorは、アプリケーションがオブジェクトの指定したフィールド にアクセスまたは変更しようとしない、そのオブジェクトは、もはやそのフィールドを持っている場合にスローされ

です。

通常、このエラーはコンパイラによって検出されます。クラスの定義に互換性がない場合、このエラーは実行時に にしか発生しません が変更されました。

API docs

これは、エラーの近因は、あなたの実行時クラスパスにクラスを不整合していることであることを示唆しています。 フィールドは、クラスのメンバ変数を意味するので、JavaがSASL_PROPSを探しているのです(どのクラスがそのフィールドを持つと予想されているのかは不明ですが)。

関連する問題