- PR -

jarファイル実行時に、java.lang.NoClassDefFoundError: org/apache/log4j/Loggerと出る

投稿者投稿内容
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-01-25 23:40
# java -cp agent.jar:log4j-1.2.12.jar socket/agent/Agent

あー、やっぱり"-cp"で、そうなりましたか。初心者にありがちです。
簡単に言って、こうしてください、、と言おうとしたのですが、

、、残念ながら、その"Agent.jar"とやらは、いわゆる「代理エージェント」
と言われる、ネットワーク通信しながら何かの処理を代理して行うタイプの
プログラムそももののようです。

今のあなたの知識では起動どころか、テストが無理なので(苦笑)問題を分けましょう。
小さい問題にすれば、順々に解きほぐしていって、テストまでなら可能です。

とりあえず
socket/agent/Agent.classをmini-agent.jarというパッケージ化したとしましょう。

---以下の感じのAgent.javaをつくる(つもり)
package socket.agent;

public class Agent {
static void Main(String argv[]){}
   //getLogging()なんとか。てきとー。
//要するにlog4jクラスライブラリを使ったプログラム。
}
---ここまで。

というクラスが(仮想的に)存在するとして、Agent.javaをコンパイルして
jar cf mini-agent.jar ./socket/agent/
をしてmini-agent.jarを作った(つもり)になってください。そうすると
以下のように起動できます。

# java -cp ".:./mini-agent.jar:./log4j-1.2.12.jar" socket/agent/Agent

javaの起動方法がイメージつきましたか。"-cp"とは、javaでコンパイルした後の
.classだけが集まったjarファイル、あるいは.classそのもののあつまりを示します。

いうことであなたの持っている"Agent.jar"は、そもそも完全なクラス(.class)の集まり
ではなく、ソースコードも何もかもをてきとーに集めたカタマリなのです。そのままでは
「起動」は出来ません。テストには十分なのでしょうけど。

で、"agent.jar"を真っ当に上記の考え方で生成した後で、再び"agent.jar"を
起動してください。

# java -cp ".:./agent.jar:./log4j-1.2.12.jar" socket/agent/Agent

で、起動できるかどうかを確認してください。

最後にjarそのものを起動する方法があります。

# java -jar ./agent.jar socket/agent/Agent

とかにします。ただし注意。この場合のjarにはjarは入りませんし、外部のjarは
使用できません。つまり.classだけのファイルにして、ぜーんぶagent.jarに
入れる必要があります。log4j.jarも一回ばらして(jar xvf log4j.jarして)
agent.jarに入れなおす必要があります。

で、とりあえず起動終わり。次テスト。

、、、だれかこんぐらい周りのやつが説明してやれよ。。。
ペットボトル一個ぐらいで教えてやるのに。。
権兵衛
ベテラン
会議室デビュー日: 2002/09/24
投稿数: 50
投稿日時: 2006-01-26 00:07
jarファイルはeclipseでまきさんが作成してるんですよね?
jarファイルにしないといけない理由はなんでしょう?
jarで1ファイルにまとめる必要があるのであれば
manifestについて調べる必要があります。

#説明しようにもmanifestはあんまり詳しくないので
#説明できませんが
まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-01-26 10:25
加納さ、権兵衛さん、ありがとうございます。

jarファイルにしているのは、ソケットのクラス以外にもログやエクセプション、MD5を作るためのクラスなどたくさんあるので1つにまとめました。また、jarファイルを作成せずにコンパイルして実行しようとしてもできませんでした、、、これがまず?だったのですが。

さて、今やっていたこととしては、

@エクリプス上でjarファイルを作成(このときlog4j-1.2.12.jarが入っているlibフォルダは対象外としました)
ALinuxに入れる前に、コマンドプロンプトでできるかを確認しました。Cドライブ直下にこれをおき、同じ階層にlog4j-1.2.12.jarをおいて実行
java-cp agent.jar;log4j-1.2.12.jar socket.agent.Agent

Bログ出力成功

となりました。

そして、これをlinuxに移して実行します。
@/usr/local/agentを作成し、jarファイルを移動します。
A実行します。コマンドは
/usr/〜(略:sdkが入っている場所)/java -cp agent.jar;log4j-1.2.12.jar socket/agent/Agent
とするとエラーが出ます。エラーは後述します。

ローカルのコマンドプロンプトでできるのに、Linuxでできないのは何か違いがあるからなのでしょうか?
今まで教えていただいたり、調べたりしたやり方だと思ったのですが、、、エラーを見るとコマンドの指定が悪いと思うのですが、コマンドプロンプトでできたのに、、、

私自身、もっと調べてみますが、分かる方がいらっしゃったらご教授下さい。よろしくお願いします。

エラー:
Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfile [args...]
(to execute a jar file)

where options include:
-client to select the "client" VM
-server to select the "server" VM
-hotspot is a synonym for the "client" VM [deprecated]
The default VM is client.

-cp <class search path of directories and zip/jar files>
-classpath <class search path of directories and zip/jar files>
A : separated list of directories, JAR archives,
and ZIP archives to search for class files.
-D<name>=<value>
set a system property
-verbose[:class|gc|jni]
enable verbose output
-version print product version and exit
-version:<value>
require the specified version to run
-showversion print product version and continue
-jre-restrict-search | -jre-no-restrict-search
include/exclude user private JREs in the version search
-? -help print this help message
-X print help on non-standard options
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
enable assertions
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
disable assertions
-esa | -enablesystemassertions
enable system assertions
-dsa | -disablesystemassertions
disable system assertions
-bash: log4j-1.2.12.jar: command not found

まき
常連さん
会議室デビュー日: 2006/01/24
投稿数: 23
投稿日時: 2006-01-26 10:38
Linuxでもできるようになりました。

先ほどできなかったのはjarを分けるところを;にしてたからで、:にすればよかったです。

加納さん、インギさん、ukさん、権兵衛さん、さいくろうさん、Edossonさん、ほんとにありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)