読者です 読者をやめる 読者になる 読者になる

文系エンジニアの備忘録

文系ですがエンジニアです。

MacでのJava外部ライブラリのインストール方法

Java Mac

外部ライブラリをインストールする

普段はTomcatにライブラリをインストールしてるのでJava自身にライブラリをインストールする方法を知らなかった。
コンパイル時にクラスパスを指定してもどうしてもNoClassDefFoundErrorが発生し実行できなくてハマった。

別個にCLASSPATHを通す方法もあるが、そこにjarファイル等を置けば自動的にパスが通る特別なフォルダが有るらしいので備忘録

その場所とは

/Library/java/Extensions/

ここに置けばコンパイル時にクラスパスを指定すること無くコンパイルすることができ、
実行時に「NoClassDefFoundError」が発生することもなくなったのでよかったよかった。

参考サイト:
jarファイルとjniライブラリのインストール方法 - FIELD NOTES: 書を持って街へ出よう

MacAppleJavaを提供していた時期なんかもあって情報が非常に錯乱してるイメージがあって上記サイト様はOSでのごとにまとめてくれててとても助かりました。

※2016/05/24追記
上記はMacでの話です、WindowsLinux系、その他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サーブレットのコンパイルの話

Java Tomcat

基本的なことですが、時々忘れてしまって検索する羽目になるので備忘録。

サーブレットは"HttpServlet"クラスを継承しておりHttpServletクラスの様々なメソッドを利用しているらしい。

なのでHttpServletが存在するクラスパスを指定してあげないとClassNotFoundになりコンパイルがこける。

 

まずはクラスパスを指定しないでコンパイルしてみると

 

f:id:kuwwta:20160512112630p:plain

上図のように見事にコケる。

関連クラスを見つけられないからだと思う。

 

そこで-classpathオプションでHttpServletクラスを含むservlet-api.jarを指定して上げる

ちなみに"servlet-api.jar"は"[Tomcatホーム]/lib"に含まれるので環境変数やパスを通してない場合はフルパスで指定する。

 

結果↓

f:id:kuwwta:20160512120909p:plain

コンパイルが通っているのがわかる。

 

以上

 

※何か間違っていたり、こうしたほうがいいということがあればどしどしコメントください。

javaはほぼ独習なのでめっちゃよろこびます。

 

----追記----

ちなみにサーブレットコンパイルするときに"-d"オプションを使って"classes"フォルダに落としておくといちいちコピーしなくても便利なのでいつもしてます。

(ちょっとあほそうなのでなにかいい方法があればご教授ください、、)

ブログ始めました

こんにちは

くぅたです。

 

主にプログラミング、AppleiPhoneAndroidなどIT関連の事柄を備忘録的に記録していきたいと思います。

 

とても文章が下手ですし、面白くもないと思いますがよろしくお願いします。