MacでのJava外部ライブラリのインストール方法
外部ライブラリをインストールする
普段はTomcatにライブラリをインストールしてるのでJava自身にライブラリをインストールする方法を知らなかった。
コンパイル時にクラスパスを指定してもどうしてもNoClassDefFoundErrorが発生し実行できなくてハマった。
別個にCLASSPATHを通す方法もあるが、そこにjarファイル等を置けば自動的にパスが通る特別なフォルダが有るらしいので備忘録
その場所とは
/Library/java/Extensions/
ここに置けばコンパイル時にクラスパスを指定すること無くコンパイルすることができ、
実行時に「NoClassDefFoundError」が発生することもなくなったのでよかったよかった。
参考サイト:
jarファイルとjniライブラリのインストール方法 - FIELD NOTES: 書を持って街へ出よう
MacはAppleがJavaを提供していた時期なんかもあって情報が非常に錯乱してるイメージがあって上記サイト様はOSでのごとにまとめてくれててとても助かりました。
Javaのクラスパスの話
前記事でサーブレットコンパイル時のクラスパス指定について書きましたが、Javaのクラスパスというものその物について少し備忘録
クラスパスとは
JavaはコアAPIと呼ばれる標準的なライブラリを持っており、それらについては特にパスを通すこと無く使うことができます。
ですが、他の方が開発されたライブラリや自分で作ったアプリケーション共有のクラスファイルなどを利用したいことがあります。(.jarファイルや、.classファイルなど)
それらを利用するにはクラスの場所を指定するクラスパスの指定が必要です。
以下2つ方法があります。
"-classpath"オプションを付ける
前記事でも紹介したコンパイル時に"-classpath"オプションを付ける方法
$javac -classpath /hoge/hoge/hoge.jar hoge.java
など。
また複数のクラスパスを指定することも可能で、
$javac -classpath /hoge/hoge/hoge.jar:/fuga/fuga/fuga.jar hoge.java
と言った風に「:」コロンで繋ぐ。
但し、これはLinux,MacなどUNIX系のOSでの話でありWindows系では
C:¥hoge¥hoge.jar;C:¥fuga¥fuga.jar hoge.java
という風に「;」セミコロンで繋ぐことで複数のクラスパスを指定できるらしい。
環境変数CLASSPATHを通す
これは環境変数としてクラスパスを通してやることで指定なしにデフォルトで参照させることができる。
だが、これはすべてのコンパイルで参照されるので他のアプリケーションに影響をあたえる可能性があるため可能であれば上記"-classpath"オプションを推奨したい。
設定としてはUNIX系では各ユーザホームディレクトリに存在する".bash_profie"へ下記を追加する
CLASSPATH=.:/hoge/hoge/hoge.jar
はじめの「.:」では . はカレントディレクトリを表している。
上記オプションと同じくコロンで複数指定することが出来る。
以上クラスパスについて調べてみたことでした。
間違いや、更にいい方法などがあれば是非コメントをお願いします。
javaサーブレットのコンパイルの話
基本的なことですが、時々忘れてしまって検索する羽目になるので備忘録。
サーブレットは"HttpServlet"クラスを継承しておりHttpServletクラスの様々なメソッドを利用しているらしい。
なのでHttpServletが存在するクラスパスを指定してあげないとClassNotFoundになりコンパイルがこける。
まずはクラスパスを指定しないでコンパイルしてみると
上図のように見事にコケる。
関連クラスを見つけられないからだと思う。
そこで-classpathオプションでHttpServletクラスを含むservlet-api.jarを指定して上げる
ちなみに"servlet-api.jar"は"[Tomcatホーム]/lib"に含まれるので環境変数やパスを通してない場合はフルパスで指定する。
結果↓
コンパイルが通っているのがわかる。
以上
※何か間違っていたり、こうしたほうがいいということがあればどしどしコメントください。
javaはほぼ独習なのでめっちゃよろこびます。
----追記----
ちなみにサーブレットをコンパイルするときに"-d"オプションを使って"classes"フォルダに落としておくといちいちコピーしなくても便利なのでいつもしてます。
(ちょっとあほそうなのでなにかいい方法があればご教授ください、、)