人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

error: Unable to locate Java directoriesの対処法

こちらで詳しく質問させて頂いています。
http://ruzxa.hatenablog.com/entry/2014/11/21/140901

$ ./configure --enable-java --enable-dynamic --with-arith=gmp
?省略?
configure: error: Unable to locate Java directories
$ echo $PATH
省略:/usr/local/java/jdk1.8.0_40/bin


==エラーの箇所(configure)==
if ! ( test -n "${JAVA_INCLUDE_PATH}" -a -d "${JAVA_INCLUDE_PATH}" ) ; then
if test -d ${JAVA_HOME}/include ; then
JAVA_INCLUDE_PATH=${JAVA_HOME}/include
elif test -d ${JAVA_HOME}/Headers; then
JAVA_INCLUDE_PATH=-I${JAVA_HOME}/Headers
else
as_fn_error "Unable to locate Java directories" "$LINENO" 5
fi

"${JAVA_INCLUDE_PATH}が何を指しているのかわかれば問題がきちんとわかりそうなので追ってみました。

# Check whether --with-java-includes was given.
if test "${with_java_includes+set}" = set; then :
withval=$with_java_includes; JAVA_INCLUDE_PATH="${withval}"
fi

問題はここかなと思うのですが、shellに関して詳しくないためうまく構文が把握できません。


●質問者: ruzxa
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

configureファイルを添付させて頂きます。
Dropbox - configure
https://www.dropbox.com/s/uqve32vdzbgdu4k/configure?dl=0

質問?:
>if test "${with_java_includes+set}" = set; then :
これはtest構文かと思うのですが、 = は "eq"を意味し、"${with_java_includes+set}" と set が同値であるかの真偽判定をしているのでしょうか?

質問?:
setとは何を指すものなのでしょうか?
configure中にはsetは無数にあり、
shellではセットはオプションであり、今回のsetとは関係ないように感じ、どう解釈すべきか迷っています。

質問?:

このエラーの原因について
JAVA_HOMEが設定されているので、きちんとJDKが導入されていないという事になるのでしょうか?
普通はconfigureを追う事なく、JDKの確認を皆様ならされますか?



任意質問?:

># Check whether --with-java-includes was given.

は./configure 実行時にオプションとして--with-java-includesが存在するかどうかチェックしているといった解説なのでしょうか。


1 ● a-kuma3
ベストアンサー

質問?:
このエラーの原因について
JAVA_HOMEが設定されているので、きちんとJDKが導入されていないという事になるのでしょうか?

環境変数 JAVA_HOME は、きちんと設定されてますか?
/usr/local/java/jdk1.8.0_40 になってないと、駄目だと思います(PATH から判断して)。

質問の最後にある、echo $PATH じゃなくて、echo $JAVA_HOME を確認してみてください。
念には念を入れて、以下の二つが同じ出力になることも確認してみてください。

$ ls ${JAVA_HOME}
$ ls /usr/local/java/jdk1.8.0_40

どこかの回答に書きましたが、CVC3 は JNI という、java と C を橋渡しする仕組みを使っています。
これをコンパイルするには、JDK に含まれている jni.h という、C のヘッダファイルが必要です。
configure を引用してもらった範囲では、 jni.h があるはずの JAVA_HOME 配下の include もしくは、Headers というディレクトリがあるかどうかの確認をしています。

  # 「シェル変数 JAVA_INCLUDE_PATH に何か設定されてて、それがディレクトリだ」というとき以外
 if ! ( test -n "${JAVA_INCLUDE_PATH}" -a -d "${JAVA_INCLUDE_PATH}" ) ; then
  # つまり、ここには、シェル変数 JAVA_INCLUDE_PATH に設定されているものがディレクトリを指していないときに来ます

  # JAVA_HOME のディレクトリの下に、include というディレクトリがある場合
 if test -d ${JAVA_HOME}/include ; then
 JAVA_INCLUDE_PATH=${JAVA_HOME}/include

  # include はないけど、Headers というディレクトリがある場合
 elif test -d ${JAVA_HOME}/Headers; then
 JAVA_INCLUDE_PATH=-I${JAVA_HOME}/Headers

  # どちらもないときには、エラー
 else
 as_fn_error $? "Unable to locate Java directories" "$LINENO" 5
 fi
 fi


この部分よりも、ちょっと前のところに、こんなコードが書いてあるので、環境変数 JAVA_HOME を指定してから、configure を起動するか、configure のパラメータで JAVA_HOME を指定すれば、良さそうです。

# Check whether --with-java-home was given.
if test "${with_java_home+set}" = set; then :
 withval=$with_java_home; JAVA_HOME=${withval}
fi

java をインストールした先が /usr/local/java/jdk1.8.0_40 だとして、

$ JAVA_HOME=/usr/local/java/jdk1.8.0_40
$ export JAVA_HOME
$ ./configure --enable-java --enable-dynamic --with-arith=gmp

と、するか、

$ ./configure --enable-java --enable-dynamic --with-arith=gmp
 --with-java-home=/usr/local/java/jdk1.8.0_40

と、すれば良いと思います(見切れちゃうので、折り返しましたが、一行で入力です)。


もし、JAVA_HOME が正しく設定されているのであれば、configure のエラーは /usr/local/java/jdk1.8.0_40/include というディレクトリが存在していないということです。権限が無くても test -d は 真 を返したはずですので。
# ちょっと信じられないけど


普通はconfigureを追う事なく、JDKの確認を皆様ならされますか?

まず、簡単なプログラムを javac でコンパイルして、動かしてみます。
もし、動かなければ JDK は、正しくインストールできていないのでしょう。

もし、動くのなら、configure を読んでいると思います。
せっかく、中身を読めるものがそこにあるのだから、やみくもに色々なことを試すよりは、近道です。

それが、「普通」なのかどうかは知りません。


ruzxaさんのコメント
ご回答ありがとうございます。 >|| java をインストールした先が /usr/local/java/jdk1.8.0_40 だとして、 $ JAVA_HOME=/usr/local/java/jdk1.8.0_40 $ export JAVA_HOME $ ./configure --enable-java --enable-dynamic --with-arith=gmp と、するか、 $ ./configure --enable-java --enable-dynamic --with-arith=gmp --with-java-home=/usr/local/java/jdk1.8.0_40 ||< よりどちらも用いても解決しました! また、問題の原因はexport JAVA_HOMEをbashrc上で実行していなかった点でした。 魔法使いの方より解答頂いている気分で、 内心「凄い!凄い!凄いっ!!」と連呼する熱狂ぶりで(笑 綺麗にコマンドが通ってくれました。 >|?| maru@marU:/mnt/sharefolder/js-symbolic-executor/cvc3$ ./configure --enable-java --enable-dynamic --with-arith=gmp --with-java-home=/usr/local/java/jdk1.8.0_40 checking for g++... g++ checking whether the C++ compiler works... yes checking for C++ compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C++ compiler... yes checking whether g++ accepts -g... yes checking how to run the C++ preprocessor... g++ -E checking for ar... ar checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for install... /usr/bin/install checking for ldconfig... /sbin/ldconfig checking for time... /usr/bin/time checking for perl... /usr/bin/perl checking for bison... bison -y checking for flex... flex checking lex output file root... lex.yy checking lex library... none needed checking whether yytext is a pointer... no checking for compiler version (g++ --version)... 4.8.2 checking for gmp... yes checking for javac... /usr/local/java/jdk1.8.0_40/bin/javac checking for javah... /usr/local/java/jdk1.8.0_40/bin/javah checking for jar... /usr/local/java/jdk1.8.0_40/bin/jar checking for java... /usr/local/java/jdk1.8.0_40/bin/java checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking jni.h usability... yes checking jni.h presence... yes checking for jni.h... yes checking jni_md.h usability... yes checking jni_md.h presence... yes checking for jni_md.h... yes checking for python... /usr/bin/python checking vector usability... yes checking vector presence... yes checking for vector... yes checking list usability... yes checking list presence... yes checking for list... yes checking deque usability... yes checking deque presence... yes checking for deque... yes checking set usability... yes checking set presence... yes checking for set... yes checking string usability... yes checking string presence... yes checking for string... yes checking cstdlib usability... yes checking cstdlib presence... yes checking for cstdlib... yes checking cstdio usability... yes checking cstdio presence... yes checking for cstdio... yes checking functional usability... yes checking functional presence... yes checking for functional... yes checking algorithm usability... yes checking algorithm presence... yes checking for algorithm... yes checking for doxygen... no checking for doxytag... no checking for fig2dev... no checking for dot... NO checking for etags... no checking for ebrowse... no configure: creating ./config.status config.status: creating Makefile.local config.status: creating LICENSE config.status: creating src/cvc3.pc config.status: creating bin/unpack config.status: creating bin/run_tests config.status: creating bin/cvc2smt config.status: creating doc/Doxyfile config.status: creating doc/Makefile CVC3 is configured successfully. Platform: x86_64-linux-gnu Version: 2010-09-02 Computer arithmetic: GMP Run ./configure --help for additional configuration options. Type 'make' to compile CVC3. *** CVC3 is configured to compile using shared libraries. *** Type "make ld_sh" for bash shells or "make ld_csh" for csh shells *** to see how to set LD_LIBRARY_PATH appropriately. To use static *** libraries and executables instead, run: *** ./configure --enable-static ||< >もし、JAVA_HOME が正しく設定されているのであれば、configure のエラーは /usr/local/java/jdk1.8.0_40/include というディレクトリが存在>していないということです。権限が無くても test -d は 真 を返したはずですので。 ># ちょっと信じられないけど >|?| $ ls $JAVA_HOME COPYRIGHT README.html THIRDPARTYLICENSEREADME.txt db javafx-src.zip lib release LICENSE THIRDPARTYLICENSEREADME-JAVAFX.txt bin include jre man src.zip maru@marU:/usr/local/java/jdk1.8.0_40/include$ ls /usr/local/java/jdk1.8.0_40/include/ classfile_constants.h jawt.h jdwpTransport.h jni.h jvmti.h jvmticmlr.h linux ||< 色々と調べてみたら、.bashrcにexport JAVA_HOMEがありませんでした。。。 以前bashrcを汚してしまったときに何度も入れなおした際に消えてしまっていたようです。 >|| 122 JAVA_HOME=/usr/local/java/jdk1.8.0_40 123 export PATH=$PATH:$JAVA_HOME/bin 124 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar::$JAVA_HOME/lib/dt.jar <|| ちなみに、includeファイルはありましたし、jni.hファイルもその中にありました!(HEADERFILEはないのですが) >どこかの回答に書きましたが、CVC3 は JNI という、java と C を橋渡しする仕組みを使っています。 申し訳ありません。見逃しておりました。 せっかくご回答いただいた内容。わからない点がわかるように書いてあり、 次のワンステップへの不足する知識や、水平化されより広く見える知識が詰まっておりましたので これを機にきちんと押さえて行きます。 とても見やすくわかりやすく書いて頂き、とてもお手間を取らせていると申し訳なく感じているのですが、 次の実用性のある知識の宝物の様な気持ちで拝読させて頂いてます(笑 この度もご回答いただき本当にありがとうございました。 普段以上に粘り強く問題特定に取り組めているのも、頂いた解答によるところはかなり大きく感謝しています。

ruzxaさんのコメント
>|?| 122 JAVA_HOME=/usr/local/java/jdk1.8.0_40 123 export PATH=$PATH:$JAVA_HOME/bin 124 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar::$JAVA_HOME/lib/dt.jar ||< ちなみに、includeファイルはありましたし、jni.hファイルもその中にありました!(HEADERFILEはないのですが) >どこかの回答に書きましたが、CVC3 は JNI という、java と C を橋渡しする仕組みを使っています。 申し訳ありません。見逃しておりました。 せっかくご回答いただいた内容。わからない点がわかるように書いてあり、 次のワンステップへの不足する知識や、水平化されより広く見える知識が詰まっておりましたので これを機にきちんと押さえて行きます。 とても見やすくわかりやすく書いて頂き、とてもお手間を取らせていると申し訳なく感じているのですが、 次の実用性のある知識の宝物の様な気持ちで拝読させて頂いてます(笑 この度もご回答いただき本当にありがとうございました。 普段以上に粘り強く問題特定に取り組めているのも、頂いた解答によるところはかなり大きく感謝しています。

ruzxaさんのコメント
testコマンドと シェルの読み方に広がりを感じました。 >1385 --with-java-home=PATH Java installation path

a-kuma3さんのコメント
>> 色々と調べてみたら、.bashrcにexport JAVA_HOMEがありませんでした。。。 << おっと。 環境変数とシェル変数の違いで、はまってたわけですね。 bash (sh) の世界だと、見た目には export するかどうかの差しかないのですが、以下の挙動が違います。 -シェル変数<br>そのシェル (コマンドプロンプトを exit で抜けるまで、もしくは、与えられたシェルスクリプトが終わるまで) の中だけで有効です -環境変数<br>そのシェルから起動された子プロセスでも参照できます 褒められたことに気をよくして、残りの質問にも、答えておきます。 >> 質問?: &gt;if test "${with_java_includes+set}" = set; then : これはtest構文かと思うのですが、 = は "eq"を意味し、"${with_java_includes+set}" と set が同値であるかの真偽判定をしているのでしょうか? << ${with_java_includes+set} は、シェル変数 with_java_includes に何か設定されていると "set" に置き換えられ、何も設定されてないと with_java_include の中身(つまり、空文字)に展開されます。 configure って、ああいう風に書きます。同じことをやるなら、ぼくはこう書きますが。 >|| if test "${with_java_includes:+set}" = set; then : ||< コロンが付いてない書き方は、man sh に載ってないので、気持ちが悪いです。 尻のコロンも、気持ち悪いなあ。 ちなみに、test コマンドは = で文字列を、-eq で数値を比較します。 >> 質問?: setとは何を指すものなのでしょうか? configure中にはsetは無数にあり、 shellではセットはオプションであり、今回のsetとは関係ないように感じ、どう解釈すべきか迷っています。 << 質問?の +set の set のことを言っているのであれば、どんな文字でも構わないんです。 >|| if test "${with_java_includes+HOGE}" = HOGE; then : ||< 「セットされてるかどうか」というコードなので、その意味を持つ単語を書いているだけです。 シェルの内部コマンドである set とは、何の関係もありません。 >> 任意質問?: &gt;# Check whether --with-java-includes was given. は./configure 実行時にオプションとして--with-java-includesが存在するかどうかチェックしているといった解説なのでしょうか。 << そうです。英語の意味そのまんま。 >|| # --with-java-includes が与えられてるかどうかをチェック ||< マニュアル英語だと、given じゃなくて specified の方が良く使われるような気はする。

ruzxaさんのコメント
ご回答頂きありがとうございます! 本当にunixの世界は広いですね。海を想像してしまいました。 気づいてしまえば当然ですが、一つ一つのコマンドについてもきちんと意味や違いがあって、常にアンテナを張るなり注意を払わなければ気づけない事も沢山あって、でも見過ごしてしまっている事も沢山あるんだろうなあと。 もっと言えば、付け焼刃ではどうにもならず実際に開発していなければ気づけない事もある。 などと、ご回答より、まざまざと感じた次第です。 毎回a-kuma3様よりご回答頂いているので、できる限り負担を減らさせて頂こうと 色々と突っ込んで調べてなんとかしようといったプレッシャー(笑)を感じるという よい経験を積んでいるなあと感じます。 手元に見えるものは極力自分で解決をするスキルも大事です。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ