モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

JAR の基本的な使い方

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

公開日公開日
2015/03/21
最終更新最終更新
2021/10/07
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    Scalaはいいぞ

    0
    ステッカーを贈るとは?

    jar (Java Archive) は tar コマンドのようにファイルをアーカイブする JAVA のコマンドです。簡単に使用方法をまとめます。jar コマンドを利用するためには Oracle のページから JDK をダウンロードおよびインストールして PATH を通しておく必要があります。

    基本的な使用方法

    sample/HelloWorld.java

    package sample;
    
    class HelloWorld {
        public static void main(String args[]) {
            System.out.println("Hello World!");
        }
    }
    

    コンパイルしておきます。

    $ javac sample/HelloWorld.java
    

    ディレクトリ構成は以下の通りです。

    .
    └── sample
        ├── HelloWorld.class
        └── HelloWorld.java
    

    実行例

    $ java sample.HelloWorld
    Hello World!
    

    エントリーポイントのある実行可能な jar を作成

    エントリーポイントとなる class ファイルを指定すれば実行可能な jar が生成できます。jar 生成時にマニフェスト情報が記載されたファイルを引数で指定することで情報を取り込めます。ファイル名は何でもよいですが、例えば Manifest.txt としてみます。

    .
    ├── Manifest.txt
    └── sample
        ├── HelloWorld.class
        └── HelloWorld.java
    

    Manifest.txt

    Main-Class: sample.HelloWorld
    

    以下のコマンドで jar を生成します。

    $ jar cvfm sample.jar Manifest.txt sample
    

    オプションの意味は以下の通りです。

    -c jar を新規作成する
    -v 標準出力に詳細な出力を生成する
    -f jar ファイル名を指定する
    -m 指定のマニフェスト・ファイルからマニフェスト情報を取り込む
    

    成果物 jar を実行してみます。

    $ java -jar sample.jar
    Hello World!
    

    jar ファイルの中身を閲覧

    「-t アーカイブの内容を一覧表示する」を利用します。

    $ jar tf sample.jar
    META-INF/
    META-INF/MANIFEST.MF
    sample/
    sample/HelloWorld.class
    sample/HelloWorld.java
    

    jar ファイルを展開

    「-x ファイルをアーカイブから抽出する」を利用します。

    $ jar xvf sample.jar
    

    以下のように展開されます。

    .
    ├── META-INF
    │   └── MANIFEST.MF
    ├── sample
    │   ├── HelloWorld.class
    │   └── HelloWorld.java
    └── sample.jar
    

    先程取り込んだマニフェスト情報が追加されています。

    $ cat META-INF/MANIFEST.MF
    Manifest-Version: 1.0
    Created-By: 1.7.0_75 (Oracle Corporation)
    Main-Class: sample.HelloWorld
    

    エントリーポイントのない実行不可能な jar を作成

    マニフェスト情報を取り込むためのファイルを指定しなければよいです。

    $ jar cvf sample.jar sample
    $ java -jar sample.jar 
    sample.jarにメイン・マニフェスト属性がありません
    $ jar tf sample.jar 
    META-INF/
    META-INF/MANIFEST.MF
    sample/
    sample/HelloWorld.class
    sample/HelloWorld.java
    

    そもそもマニフェストファイルを生成しないようにするためには M オプションを利用します。

    $ jar cvfM sample.jar sample
    $ jar tf sample.jar 
    sample/
    sample/HelloWorld.class
    sample/HelloWorld.java
    

    jar にファイルを追加する

    「-u 既存アーカイブを更新する」オプションを利用します。

    $ jar uvf sample.jar Append.class
    $ jar tf sample.jar
    sample/
    sample/HelloWorld.class
    sample/HelloWorld.java
    Append.class
    

    カレントディレクトリを指定する

    「-C 指定のディレクトリに変更し、以下のファイルを取り込む」オプションを利用することでカレントディレクトリを変更できます。

    .
    └── sample
        ├── HelloWorld.class
        └── HelloWorld.java
    

    ルートに HelloWorld.class などが直接配置されています。

    $ jar cvf sample.jar -C sample .
    $ jar tf sample.jar
    META-INF/
    META-INF/MANIFEST.MF
    HelloWorld.class
    HelloWorld.java
    

    比較のために -C を利用しない場合の例を示します。

    $ jar cvf sample.jar sample
    $ jar tf sample.jar
    META-INF/
    META-INF/MANIFEST.MF
    sample/
    sample/HelloWorld.class
    sample/HelloWorld.java
    

    応用例

    .
    └── sample
        └── HelloWorld.java
    

    sample/HelloWorld.java

    package sample;
    
    public class HelloWorld {
        public static void print() {
            System.out.println("Hello World!");
        }
    }
    

    コンパイルして jar にまとめます。

    $ javac sample/HelloWorld.java
    $ jar cvf sample.jar sample
    $ jar tf sample.jar
    META-INF/
    META-INF/MANIFEST.MF
    sample/
    sample/HelloWorld.class
    sample/HelloWorld.java
    

    jar を別の java ファイルで利用する

    Main.java

    import sample.HelloWorld;
    
    class Main {
        public static void main(String args[]) {
            HelloWorld.print();
        }
    }
    

    ディレクトリ構成

    .
    ├── Main.java
    └── sample.jar
    

    以下のように Main.java のコンパイルおよび実行ができます。

    $ javac -classpath ./sample.jar Main.java
    $ java -classpath '.;./sample.jar' Main
    Hello World!
    

    環境変数 CLASSPATH を利用すればオプション classpath は不要になります。

    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    Scalaはいいぞ

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0