Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.io.IOExceptionのエラー #523

Closed
SugusakaTech opened this issue Nov 29, 2016 · 14 comments
Closed

java.io.IOExceptionのエラー #523

SugusakaTech opened this issue Nov 29, 2016 · 14 comments

Comments

@SugusakaTech
Copy link

knowledge v1.6.0をJREは8.65、Tomcatは8.033環境下へインストールし
見た目上は問題無く動いているようにみえるのですが、ログに
java.io.IOException: Cannot run program "java" (in directory "<knowledgeのログディレクトリ名>"): error=2, No such file or directory
というエラーが大量に出ます。
JAVAのPATHも通っていて、どこからも実行可能ですし、knowledge関連ディレクトリの
パーミッションも問題無いように思います(あくまでも”思います”ですが・・・)
エラーの”in directory ”が、knowledgeのログディレクトリ名を差しているのが
気になります。
当方、JAVAの知識は乏しいため、想定される原因等ご教示頂ければ助かります。

@koda-masaru
Copy link
Contributor

パーミッションの問題のような気がするのですが、そうでは無いとのことなので、
何が問題なのかスグに回答を出せません。
OSは何でしょうか?

@SugusakaTech
Copy link
Author

早速の回答ありがとうございます。
OSはLinuxです。
knowledgeを動かす為に必要な、環境変数が正しく設定されていない
可能性も考えられるので、動作に必要な環境変数を教えて頂けますでしょうか?
(JAVA_HOMEは設定済みです。初期設定で運用しているのでKNOWLEDGE_HOMは設定してません)
もし、パーミッションだとすれば、どのディレクトリのパーミッションがおかしいと
考えられますでしょうか?

@koda-masaru
Copy link
Contributor

Linuxですと、やはりパーミッションの関係でエラーになっていることが予想されます。
上記の <knowledgeのログディレクトリ名> に、実行ユーザでの 書き込み権限はついていますでしょうか?

@SugusakaTech
Copy link
Author

knowledgeのログディレクトリにログファイルは出力されているので
書込み権限が無いということはありません。
(ログファイルの生成、更新は出来ている)

試にknowledgeのデータディレクトリのパーミッションを777に変更
してみましたが変化はありませんでした。

ログファイルを見ていくと・・・
[CronListener(176)] Failed to MailHook
[CronListener(122)] Failed send mail.
[CronListener(95)] Faild parse.
[CronListener(149)] Failed send webhooks.
[CronListener(68)] Faild clear files.
[CronListener(203)] Failed to Notify

のプロセスに対してava.io.IOExceptionのエラーが発生しているようです。

@koda-masaru
Copy link
Contributor

環境変数の KNOWLEDGE_HOME を設定してみてください。
Knowledgeでは、定期的にメール送信などのバッチをコールしています。そのバッチ処理のなかでパーミッションエラーになっていそうです。
バッチ処理がknowledgeのデータディレクトリを見つけられないように感じるので、環境変数で明示することで解決するのではと思っています。

@SugusakaTech
Copy link
Author

ご指示通り、KNOWLEDGE_HOMEを明示的に設定して
KnowledgeやTomcatを再起動してみましたがダメでした・・・

ログ見る限り、Knowledgeを再起動した際に表示される
 [InitializationListener(51)] knowledge home path:
のパスは、KNOWLEDGE_HOME明示的に設定しなくても
デフォルトでKnowledgeデータが保存されるディレクトリを
きちんと指しています。

エラーメッセージ内の in directory が
java.io.IOException: Cannot run program "java" (in directory "<knowledgeのログディレクトリ名>"): error=2, No such file or directory

とデータディレクトリでは無く、その中のログディレクトリ名を刺すのは
何故でしょうか・・・ログファイルを操作しようとしてエラーに
なっているということでしょうか?

@koda-masaru
Copy link
Contributor

java コマンドにパスが通っていないことが原因かもです。
コマンドラインで、 java -version と入力するとうごくでしょうか?
JAVA_HOMEが指定されているとのことですので、 path に JAVA_HOME/bin を設定するなどして java コマンドが実行できるか確認願います。

@SugusakaTech
Copy link
Author

毎回ご回答ありがとうございます。
残念ながら、JAVAへのパスは通っていて、どこからでもJAVAの実行が可能な状態です。
あまり関係ないと思いますが、knowledgeのログディレクトリのパーミッションに実行権限をつけたり
JAVAへのシンボリックリンクを張ったりしてみましたが、改善されませんでした。

@koda-masaru
Copy link
Contributor

確認ありがとうございます。
パスも通っていて問題ないとすると、Tomcatから別のjavaを実行することが出来ないのかもしれません。
#412 のissueでも、そのような状況になったことがあり、その際には、Cronで定期処理を呼び出すように設定することにしました。

私もLinuxで動作させていますが、Ubuntu -> DockerでUbuntu を起動という構成です。
この構成だと、普通に動いてしまうのですが、 @SugusakaTech さんのLinuxの構成を
教えていただけないでしょうか?

@SugusakaTech
Copy link
Author

そもそも論なのですが、インストール要件に

・Java version 8 以降をインストール

とありますが、これってJREでOKなのでしょうか?
それともJDKが必要なのでしょうか?

現状はJREのみ入れてる状況なのですが、
色々試しながら、各種エラーメッセージやログを見てる内に、
参照されているJAVAライブラリが足りないような気がしてきて・・・

@koda-masaru
Copy link
Contributor

それともJDKが必要なのでしょうか?

デモ環境はJREだけで動いているため、JDKが無いと動かないということは無いと思います。

ちなみに以下のDockerfileです。
https://github.com/support-project/docker-knowledge/blob/master/Dockerfile

FROM tomcat:jre8 となっているので、jreの8を使っています。

@SugusakaTech
Copy link
Author

SugusakaTech commented Dec 7, 2016

都度素人にお付き合い頂きありがとうございます(^_^;)
JRE環境でOKということですね。

現状、Docker環境が無いので確認することは出来ないのですが
#412 のissueバッチファイルを参考に環境変数を設定し
各バッチファイルを実行できるところまでは行きついたのですが・・・

$Java org.support.project.knowledge.bat.FileParseBat
 Exception in thread "main" java.lang.NoClassDefFoundError: org/support/project/common/log/LogFactory

$java org.support.project.knowledge.bat.MailSendBat
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException

$java org.support.project.knowledge.bat.WebhookBat
Exception in thread "main" java.lang.NoClassDefFoundError: org/support/project/common/log/LogFactory

$java org.support.project.knowledge.bat.NotifyMailBat
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/support/project/web/entity/UsersEntity

といったエラーが出ます。バッチより参照している外部ファイルが無いというエラーだと思いますが
org/support/project/の配下には/knowledgeは存在していますが、他の/commonや/webは
ありません。
V1.6.0のソースを拝見すると、他にもorg/support/project/に存在する/knowledge以外の
ディレクトリにあるファイルを参照している物もあるようですが、それらのディレクトリやファイルは
どの時点で生成されるのでしょうか?ソースの方にもorg/support/project/配下には
/knowledgeしか存在していないようですが・・・

ちなみに、試しにWindowsサーバーのTomcat環境へもwarファイルを
デプロイしましたがディレクトリ構成は今苦戦しているLinux環境と同じ構成でした。

なんとかオリジナルの環境でKnowledgeを構築したかったのですが
最悪Docker環境で動かすことを視野に入れた方が良いかもしれないですね・・・

@koda-masaru
Copy link
Contributor

V1.6.0のソースを拝見すると、他にもorg/support/project/に存在する/knowledge以外の
ディレクトリにあるファイルを参照している物もあるようですが、それらのディレクトリやファイルはどの時点で生成されるのでしょうか?

common や web というのは、ライブラリになります。
ライブラリは、 tomcat の webapps の下の knowledge ディレクトリの中にある
WEB-INF/lib ディレクトリに ***.jar という形で入っています。

また、Knowledge のプログラムの実体は、WEB-INF/classes ディレクトリの下に入っています。

そこで、javaのバッチを起動する際には、以下のように実行すれば起動できると思います。

BASEPATH=/Tomcat/webapps/knowledge/WEB-INF
CLASSPATH=$BASEPATH/classes:$BASEPATH/lib/*
cd $BASEPATH
java -classpath $CLASSPATH org.support.project.knowledge.bat.FileParseBat

※classpathの指定の区切り文字は、Windows系は「;」になり、Linux系は「:」になるので注意が必要です。

@koda-masaru
Copy link
Contributor

Since there is no reply, I think that it is solved and I will close it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants