Java学習ノート_140714（パッケージとクラス）

# パッケージとクラス

自分でパッケージつきクラスを作成することが目標。

クラスパスとは、**JVMがクラスファイルを探す場所のこと。**クラスパスの指定はjava,javacコマンドの -cpオプションで指定する。

```shell-session
// javac,javaコマンドのクラスパス指定
javac -cp <クラスパス> <ソースファイル名>
java -cp <クラスパス> <クラス名>
//javaの-dオプション
javac -d <出力ディレクトリ> <ソースファイル名>

```
ぶっちゃけ、現状で何言ってるかわかんないけど、srcに階層化していく感じが慣例っぽい。ソースファイル（.java)はsrcディレクトリ、出力されるクラスファイルはbinディレクトリに作成・保存するのが基本。Eclipseは何も考えないでもそういうふうに作られるようだ。便利。

## 簡単なクラスの作成

Eclipseでやると何もやらないでよさ気なのだけど、コマンドプロンプト or Terminalで処理をやってみることにする。
.javaファイルをテキストエディタ（Sublime Text）で作成（コード補完出ないの辛い）。

Terminal.appで、cd 作業しているプロジェクトのディレクトリへ。

```shell-session
takawo$ javac -d bin src/Hello.java
takawo$ java -cp bin Hello
```
パッケージファイルの呼び出し

```shell-session
c:\javaProject>javac -cp bin -d bin src/PackageSample.java
c:\javaProject>java -cp bin PackageSample
Hello
```

コンパイル時に -d オプションで出力ディレクトリを指定、実行時に、 -cp オプションでクラスパスを指定。cpって言われるとコピーと間違えそうだけど、クラスパス。

## パッケージつきクラスの作成

```shell-session
c:\javaProject>javac -d bin src/org/cenkhor/Hello.java
```

### パッケージとクラスパスについて

publicなクラスのファイル名は必ずクラスと同じにする。
クラスパスの指定は、`set CLASSPATH=bin`のように、環境変数として指定することで、-cpオプションをつけなくても利用できる。

・-sourcepathオプションで、依存するソースファイルをまとめてコンパイルしてくれる。

```shell-session
c:\javaProject>javac -cp bin -sourcepath src -d bin src/PackageSample.java
```

### ドメイン名とパッケージ名

他言語と一緒で`jp.co.yahoo`みたいに定義すると衝突が避けられる（一意になる）。

## JARファイル

JAR(Java Archive)ファイルは、複数の**クラスファイル**を単一のファイルにまとめて圧縮したもの。構造ごと配布する際に便利。ZIP形式で圧縮されている。

### JARファイルの作成

末尾の"."はカレントディレクトリ以下のファイルを指定するということ。

```shell-session
c:\javaProject\bin>jar -cvf PackageSample.jar .
マニフェストが追加されました
org/を追加中です(入=0)(出=0)(0%格納されました)
org/cenkhor/を追加中です(入=0)(出=0)(0%格納されました)
org/cenkhor/Hello.classを追加中です(入=506)(出=332)(34%収縮されました)
PackageSample.classを追加中です(入=340)(出=258)(24%収縮されました)
```

### JARファイルの確認

```shell-session
c:\javaProject\bin>jar -tvf PackageSample.jar
     0 Mon Jul 14 10:04:38 JST 2014 META-INF/
    68 Mon Jul 14 10:04:38 JST 2014 META-INF/MANIFEST.MF
     0 Mon Jul 14 09:20:34 JST 2014 org/
     0 Mon Jul 14 09:20:34 JST 2014 org/cenkhor/
   506 Mon Jul 14 09:20:34 JST 2014 org/cenkhor/Hello.class
   340 Mon Jul 14 09:54:02 JST 2014 PackageSample.class
```

### JARファイルの利用

```java:PackageClient.java
import org.cenkhor.Hello;

public class PackageClient{
	public static void main(String[] args){
		Hello hello = new Hello();
		hello.sayHello();
	}
}
```

#### 階層関係

```
javaProject2
 ├ src
 │   └ PackageClient.java
 ├ bin
 │   └ PackageClient.class
 └ lib
     └ PackageSample.jar

```

#### コマンドプロンプトでの実行

```shell-session
c:\javaProject2>javac -cp lib/PackageSample.jar -d bin src/PackageClient.java

c:\javaProject2>java -cp lib/PackageSample.jar;bin PackageClient
Hello
```

## Eclipseでのパッケージの利用

パッケージの作成は普通にパッケージ・エクスプローラーやメニューから行える。インポートしてからの実行も普通、クラスパスが通ってない時は補完されるか、エラーが出る。クラスパス、ソースパスの指定とかいちいちしなくていいから楽。

## EclipseでのJARファイルの作成、利用

JARファイルの作成は対象のパッケージファイルをエクスポート→Java→JARファイルで作成できる。

使用したい場合は、プロジェクトファイルを右クリック→ビルドパス→外部アーカイブの追加で、JARファイルを追加できる。

# その他

## gVim
環境構築ばっかしてる気がするけど、以下の記事を参考にvimのインストールをした。gVim。

* [連載記事 「いまさら聞けないVim」](http://www.atmarkit.co.jp/flinux/index/indexfiles/vim.html)

## コマンドプロンプトからのコピペ

よく考えたらCUIツールだからコマンド書いてるほうが変なのかもしれないが、直感的にコピペできないの違和感ある。

![140714cmdprompt.png](https://qiita-image-store.s3.amazonaws.com/0/6576/8da9b7c0-3ae0-3275-4d98-5e5cc0ab2a1b.png)

* [コマンドプロンプトでコピー＆ペースト:Windows(ウィンドウズ)の使い方-コマンドプロンプト](http://www.relief.jp/itnote/archives/002157.php)

## Win <=> Mac 間でのプロジェクトファイル

週末普段と違うコンピュータで作業した。Dropboxでディレクトリは同期しているため、プロジェクトファイルが存在するが、パッケージエクスプローラーには反映されていなかった（この辺の設定ファイルがどこに保存されているのか気になるというか、それが同期できればいちいちインポートする手間が省けそう）。以下リンクから該当ファイルをインポートした。重複するものにはチェックされないので安心して実行できるが、慣れたらGit導入してファイル管理するのが良いっぽい。今日は前半の内容の都合、テキストエディタとコマンドプロンプトで作業してたけど、IDEって便利だとつくづく思った。


* [プロジェクトをインポート - プロジェクト管理 - Eclipse入門](http://www.javadrive.jp/eclipse3/project/index4.html)