スポンサーサイト

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

「.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ってあるの?

Windows JavaアプリケーションからCentOSマシンのMySqlサーバへの接続エラー ~2.MySQL側の問題~

前回からの続きになりますが、Windows上のJavaアプリケーションからLinuxマシン上のMySQLサーバへ接続しようとした場合に発生した問題の、今回はMySQL側の問題についてとりあげます。

[前回の記事]
Linux OSをクライアントマシンとして使ってみる Windows JavaアプリケーションからCentOSマシンのMySqlサーバへの接続エラー ~1.CentOS側の問題~

2.MySQL側の問題

前回記事にも取り上げましたが、現状の状態で接続を試みると、以下のエラーが発生します。

- コンソール出力エラーコード2 -
ComDbUnit Init Error:java.sql.SQLException: null,  
message from server: "Host '×××.×××.×.××' is not allowed to connect to this MySQL server"

このエラーコードを解析しますと、
MySQLサーバへ接続するのにHost '×××.×××.×.××'は許可されていないということを訴えています。MySQLというデータベースをにわか知識で操る僕としましては、ネットで調査したところ、
外部からのアクセスには権限を与えてやる必要があるとのこと。
で、現状の権限がどうなっているか?はMySQLサーバが持つ”mysql”データベースが管理しています。
# mysqlshow

【実行結果1:root権限のデータベース一覧】
+--------------------+
| Databases |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+

ということで、"mysql"データベースにログインします。
# mysql -u root mysql

ログインが完了したら、以下のSQLコードを実行してみてください。
mysql> SELECT Host, User, Select_priv, Insert_priv,Update_priv, Delete_priv FROM user;

実行結果2のように出力されるはずです。Host名にはlocalhostのみしか表示されておらず外部からのhostを受け付けるような設定にはなってないことがわかります。

【実行結果2:ユーザテーブルの確認】
+-----------------------+------+-------------+-------------+-------------+-------------+
| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv |
+-----------------------+------+-------------+-------------+-------------+-------------+
| localhost | root | Y | Y | Y | Y |
| localhost.localdomain | root | Y | Y | Y | Y |
| localhost.localdomain | | N | N | N | N |
| localhost | | N | N | N | N |
+-----------------------+------+-------------+-------------+-------------+-------------+

MySQLサーバのroot権限はこのままlocalhostのみからのアクセスに限定させておくとして、
新しくユーザを作成し、そのユーザでログインできるようにします。
以下のコマンドを実行すれば、developユーザが追加されます。
mysql>GRANT ALL PRIVILEGES ON *.* TO develop@"%" IDENTIFIED BY 'test';
mysql>flush privileges;


簡単に上記コマンドを説明します。

GRANT構文はユーザを登録するコマンドです。「develop」は追加するユーザ名です。

「*.*」としてるところがアクセス可能なデータベースおよび、テーブルになりますが、ワイルドカードで*.*としているので、全データベース全テーブルがアクセス対象となります。

アットマークの後ろにある"%"は許可するホスト名です。IPアドレス等でも可です。"%"もワイルドカードで、すべてのhostを受け付けるというちょっと危険な設定です。IPアドレスやホスト名で限定することが望ましいです。

最後の'test'はパスワードになります。

そして、GRANT構文を反映させるために、「flush privileges」というコマンドを実行しています。
では、再び以下のSQLコマンドで追加されていることを確認します。
mysql> SELECT Host, User, Select_priv, Insert_priv,Update_priv, Delete_priv FROM user;

確認できたら、Javaアプリケーションから今回追加したユーザでログインできるように設定し、実行すると見事接続が完了しました。

Windows JavaアプリケーションからCentOSマシンのMySqlサーバへの接続エラー ~1.CentOS側の問題~

Windows上のJavaアプリケーションからJDBCを使って、Linuxマシン上のMySqlサーバへ接続を試みました。Javaアプリケーションは下記のものを採用。

もしかしたら使えるかも?Java Tips集 MySqlに接続するクラスサンプル

そうしましたところ、表題にあります通り、
以下のエラーが発生しました。
- コンソール出力エラーコード1 -
ComDbUnit Init Error:com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: java.net.ConnectException: Connection timed out: connect

STACKTRACE:

java.net.SocketException: java.net.ConnectException: Connection timed out: connect
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)
at com.mysql.jdbc.MysqlIO.(MysqlIO.java:284)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2569)
at com.mysql.jdbc.Connection.(Connection.java:1485)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at dbCom.ComDbUnit.ComDbUnitInit(ComDbUnit.java:48)
at dbCom.ComDbUnit.(ComDbUnit.java:29)
at practice.EntryPoint.main(EntryPoint.java:27)

** END NESTED EXCEPTION **
Last packet sent to the server was 16 ms ago.


Windowsの環境は、
OS:Windows XP SP2
java version :1.6.0_03
Eclipse:Version: 3.3.1.1

Linux側の環境は、
OS:CentOS 5
MySQL:5.0.22

上記問題点は2つあり、1つはCentOS側の問題。
もうひとつは、MySqlサーバ側の問題でした。
以下に解決策を掲載しますが、正しいかどうかは知りません。

1.CentOS側の問題
他のマシンからの受付をファイアウォールで勝手にブロックしてくれてたようです。
なので、ファイアウォールを無効にしてやれば、この問題自体は解決するのですが、
ファイアウォールを有効な状態でMySqlへ接続したいので、以下の手順でMySqlのポートは安全であることを教えてやります。
メニューバーから[システム] - [管理] - [セキュリティレベルとファイウォールの設定]を選択すると、セキュリティレベルの設定画面が開きます。

ファイアウォールの設定

- 図1 セキュリティレベル設定画面 -

「追加」ボタンを押下して、MySqlのポート番号である3306で設定してやります。
これでCentOS側の問題は解決されますが、この状態で実行すると、
今度は以下のようなエラーが発生します。
- コンソール出力エラーコード2 -
ComDbUnit Init Error:java.sql.SQLException: null,  
message from server: "Host '×××.×××.×.××' is not allowed to connect to this MySQL server"

この問題に関しては長くなるので、下記で取り上げます。
Linux OSをクライアントマシンとして使ってみる Windows JavaアプリケーションからCentOSマシンのMySqlサーバへの接続エラー ~2.MySQL側の問題~

「Can't connect to local MySQL server through socket」エラーについて

MySqlのサーバを導入してみることにしました。

Windowsマシンと違って、Cent OSの場合はあらかじめ用意してあるので、
メニューバーの「アプリケーション」-「ソフトウェアの追加/削除」を選択すると、
パッケージマネージャダイアログが表示されるので、その中の”サーバ”項目内に「MySQLデータベース」にチェックを付けます。すでについている場合はインストール済みです。
その後”適用”ボタンをクリックすれば、インストールが開始されます。

Windowsの場合は、MySQLのサイトからファイルをダウンロードして、インストーラを起動してなどの作業がある為、面倒ですが、CentOSの場合はとても簡単に導入できます。

で、インストールが完了したので、GNOME 端末から以下のコマンドで起動してみることにしました。
# mysql -u root


そうすると表題のようなエラーが・・
Can't connect to local MySQL server through socket


で、どうやら、なんてことない、原因はMySqlサーバが起動していなかったということです。
以下に起動に関するコマンドを掲載しておきます。

■MySqlサーバをコマンドで起動
#/usr/bin/mysqld_safe &

以下が端末上に表示されれば起動OKです。
Starting mysqld daemon with databases from /var/lib/mysql

■MySqlサーバをコマンドで停止
#mysqladmin shutdown


■MySqlサーバの起動確認
#mysqladmin ping


コマンドが面倒だという方はGUI上からサービスに登録することができます。
メニューバー[システム] - [管理] - [サービス]からサービスの設定ダイアログを表示させ、
mysqldにチェックを付けて、開始ボタンを押下します。下図参照。

サービスの設定


サーバの起動確認ができたら、下記のコマンドでログインできることを確認しましょう。

■MySqlへログイン
#mysql -u root

【参考】
「Can't connect to local MySQL server through socket」エラーについて

WindowsパソコンとLinuxパソコンのマシン構成

我が家にはPCが2台あり、片方はドスパラWeb通販サイトから購入したカスタマイズマシンでWindowsXPが稼働しています。
もう一台がそこら辺から集めたパーツで作ったマシンで、Cent OS 5が稼働しています。
で、そこいら辺から集めたLinuxマシンのスペックは以下の構成です。

【Linuxマシン環境】
・OS:CentOS 5
・マザーボード:BIOSTAR 945GC-M7 TE
・CPU:Intel(LGA755) Celeron420 リテールBOX
・メモリ:ノーブランドDDR2 SDRAM PC2-6400 1GB
・HDD:Maxtor 2F040J0 40GB
・CD-ROM:AOPEN CRW5232/AAO PRO
・LANカード:アイ・オー・データ機器 ETX-PCI

MSNメッセンジャーや、Windows Media Player、その他Windowsに特化したものを使う必要がなければ、十分Linuxマシンはクライアントマシンとして扱えます。また、秀丸のようなテキストエディタがなくても、Eclipseをいれてしまえば、強力なエディタとして使えますし・・・現にこうやって、Cent OS 上でブラウザを開いて、ブログを更新できているわけですから・・。まぁ、いろいろLinuxでの検証をやっていきたいと思います。

また、上記2台のPCはインターネットにつなげる必要があるので、以下のブロードバンドルータでLAN接続しています。
CG-BARMX 有線ブロードバンドルーター



で、そのブロードバンドルータを介して、旧型のADSLモデムと接続して、インターネットへ接続しています。下図がその構成です。

ネットワーク構成


モデムとルータの実物は以下の写真の通り。

モデムとルータ


MySqlを動かそうとして、ユーザ作成にたどりつきました・・・

アプリケーションの追加できる「パッケージマネージャ」を使ってMySqlを導入してみました。
GUIが発達しすぎてて、若干物足りなさを感じる今日この頃ですが、

MySqlの失敗談をこのブログへ投稿しようとして、
いろいろ、テキストエディタや画像キャプチャなどを調べてたら、
やっぱり、root権限のままいろいろ作業するのは、どうかと思い、ユーザを作るに至りました。

このマシン、僕しか使いませんけどね。

ユーザを追加するのも、
メニューバーにある、「システム」- 「管理」-「ユーザとグループ」で、ユーザ管理者画面を開くことで簡単に作れました。難易度でWindowsのコントロールパネルと同じです・・。

一応、GNOME 端末から以下のコマンドで、ユーザを切り替えてみました。
#su [ユーザ名]

見事に切り替わりました。
プロフィール

白鯖

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

ハードウェア構成

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