スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

安易にアップデートすると・・・

今までWindowsアップデートみたいに、CentOSのソフトウェアをアップデートしてました。

今のところ、Linuxマシンには大した仕事をさせてませんので、
アップデートの1つや2つくらい・・・と、
安易に考えていたら、Javaアプリが動かなくなりました。
Exception in thread "main" java.lang.ClassFormatError: apl.Saori (unrecognized class file version)
at java.lang.VMClassLoader.defineClass(libgcj.so.7rh)
at java.lang.ClassLoader.defineClass(libgcj.so.7rh)
at java.security.SecureClassLoader.defineClass(libgcj.so.7rh)
at java.net.URLClassLoader.findClass(libgcj.so.7rh)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at gnu.java.lang.MainThread.run(libgcj.so.7rh)


どうやら、勝手にgnuのJREが起動していたようです・・・。

パッケージマネージャ


上図のチェックをはずしてやれば元のSunのJREへ戻ってくれました・・。
アップデートには注意しましょう。

スポンサーサイト

「.jar: 許可がありません」というエラー

前回の記事、

Linux OSをクライアントマシンとして使ってみる CentOS5.xにJRE1.6をインストールしてみる

これでようやく、Hello Worldという簡単な処理を実行できるようになったのですが、
jarファイルに対して、クラスパスを設定して実行すると、以下のようなエラーが発生しました。

-bash: ../lib/commons-httpclient-3.1.jar: 許可がありません
-bash: ../lib/commons-logging-1.1.1.jar: 許可がありません
-bash: ../lib/jakarta-oro-2.0.8.jar: 許可がありません
-bash: ../lib/mysql-connector-java-3.1.14-bin.jar: 許可がありません
-bash: ../lib/xmlrpc-2.0.jar: 許可がありません


これには次のような原因がありました。

下記コマンドが実際のコマンドですが、Windowsなら上記のようなエラーは出ません。というのも、Windowsのコマンドプロンプトにおけるクラスパスの区切り文字はセミコロン「;」ですが、CentOSというかLinuxにおけるクラスパスの区切り文字はコロン「:」のようです。
java -cp ../lib/commons-codec-1.3.jar;../lib/commons-httpclient-3.1.jar;../lib/commons-logging-1.1.1.jar;../lib/jakarta-oro-2.0.8.jar;../lib/mysql-connector-java-3.1.14-bin.jar;../lib/xmlrpc-2.0.jar practice.HelloWorld

-コマンド1.エラーを出力するコマンド-

では、コマンド1の区切り文字をコロンに直せば解決か?というとそうではありませんでした。このクラスパスの設定方法には、もう一つ誤りがあり、カレントディレクトリすなわちHelloWorldクラスのクラスパスが抜けています。これは単に、「.」というパスを追加するだけなのですが、1文字の為、見落としやすいです。

ということで、正しくは下記コマンドのようになります。
java -cp .:../lib/commons-codec-1.3.jar:../lib/commons-httpclient-3.1.jar:../lib/commons-logging-1.1.1.jar:../lib/jakarta-oro-2.0.8.jar:../lib/mysql-connector-java-3.1.14-bin.jar:../lib/xmlrpc-2.0.jar practice.HelloWorld
-コマンド2.正しいコマンド-

※記載のコマンドは見やすくする為に、テキストエディタ等にコピーすると良いかもしれません。

CentOS5.xにJRE1.6をインストールしてみる

前回の記事を大まかに説明すると、
発生した問題は、以下の手順で起こりました。
1。WindowsマシンにインストールされているEclipseでJavaファイルをコンパイル。
2。FTPでWindows→CentOSに転送
3。転送先でクラスファイルを実行。
4。エラー発生!(JREのバージョンの違いの問題??)

Linux OSをクライアントマシンとして使ってみる Windowsで開発、コンパイルしたJavaプログラムがCentOS上で動かない。JREバージョンの違い?

というワケだったのですが、調べてみると、
JREの配布元が違ったようです。Windowsに入っているJREは一般的なSunが提供するJREで、CentOSにデフォルトで入っているJREはGNU製らしいです。
そして、GNU製は本家SunのJREよりパワー不足なようなので、GNU製をアンインストールして、Sun製JREを入れることにします。

といっても、難しいことは何もありません。

もともとインストールされているJavaは[アプリケーション]-[ソフトウェアの追加/削除]でパッケージマネージャを開き、図1のようにチェックを外して、「適用」ボタンを押下するだけです。

パッケージマネージャ

図1.パッケージマネージャ

JRE1.6に関してもインストールは難しくありません。
GoogleでJavaと検索すればすぐにSunのホームページにたどり着くはずです。ダウンロードボタンを押せば、ブラウザがOSを判断して最新のLinux用JREを提示してくれます。また、そのリンクと一緒にインストール手順も掲載されているので、Linux初心者でも読みながら、インストール作業を進められます。
Sun Microsystems から Linux 版 Java ソフトウェアをダウンロード

インストール作業が完了したら、以下のいずれかのファイルにパスを設定してやります。
・/etc/profile
・${HOME}/.bash_profile

全ユーザに対しての適用は前者で、単一ユーザに対しては後者のファイルを指します。
以下の4行を追加して、そのファイルを保存します。
JAVA_HOME=/usr/java/jre1.6.0_05
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH


追加を反映させるには、
$ source ~/.bash_profile
または
$ source /etc/profile

というコマンドを実行してやります。

なお、うまくいかない場合は次の用な点に気を付けてみてください。
・bash: /usr/java/jre1.6.0_05/bin: is a directoryと表示される場合
 「=」の前後に空白が入ってませんか?

sourceコマンド実行後に特に変わったメッセージが表示されていなければ、
$java -version

というコマンドで、JREのバージョンを確認してみてください。以下のように表示されていればOKです。

java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)

次のようなエラーが出る場合は、上記のクラスパスの設定が正しいかどうか?確認してみてください。
Unrecognized option: -verstion
Could not create the Java virtual machine.


上記手順が完了すれば、Windowsでコンパイルしたクラスファイルも実行できるようになりました。

Windowsで開発、コンパイルしたJavaプログラムがCentOS上で動かない。JREバージョンの違い?

Windows側にインストールしてるEclipseでHello Worldを表示させるJavaプログラムを作成し、FTP転送でCentOSマシンに送信。
そこで、コマンドからJavaを実行すると下記のエラーが発生。
Exception in thread "main" java.lang.ClassFormatError: practice.CentOSHelloWorld (unrecognized class file version)
at java.lang.VMClassLoader.defineClass(libgcj.so.7rh)
at java.lang.ClassLoader.defineClass(libgcj.so.7rh)
at java.security.SecureClassLoader.defineClass(libgcj.so.7rh)
at java.net.URLClassLoader.findClass(libgcj.so.7rh)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at gnu.java.lang.MainThread.run(libgcj.so.7rh)

バージョンを調べてみると、

【WindowsXPマシン】
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)

【CentOSマシン】
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 20070626 (Red Hat 4.1.2-14)

Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

明らかにバージョンが違うことが判明。
CentOS側はデフォルトでインストールされてるJavaなので、週末にでも最新の1.6をインストールしてみる予定。Linux版で1.6ってあるの?
プロフィール

白鯖

Author:白鯖
安い寄せ集めの部品で構築し、CentOS5をインストールしました。主に、Webサーバ、アプリケーションサーバとして運用中。ハードの知識はあまり無いプログラマですが、全部自前で作るのは、手間はかかるけど、レン鯖より面白いです。

ハードウェア構成

カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
Max TDP控え目なCPU
安くて静音なクーラー
検索フォーム
ユーザータグ
RSSフィード
はてな
スポンサード リンク
おすすめ書籍
twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。