JARファイルを実行する方法


207

次のようなJARファイルを作成しました。

jar cf Predit.jar *.*

このJARファイルをダブルクリックして実行しました(機能しませんでした)。したがって、DOSプロンプトから次のように実行しました。

java -jar Predit.jar

「Failed to load main class」例外が発生しました。だから私はこのJARファイルを抽出しました:

jar -xf Predit.jar

そして私はクラスファイルを実行しました:

java Predit

うまくいきました。JARファイルが機能しなかった理由がわかりません。JARファイルを実行する手順を教えてください

回答:


207

jarファイルのマニフェストでMain-Classを指定する必要があります。

Oracleのチュートリアルには完全なデモンストレーションが含まれていますが、ここでは最初から別のデモを示します。次の2つのファイルが必要です。

Test.java:

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Hello world");
    }
}

manifest.mf:

Manifest-version: 1.0
Main-Class: Test

テキストファイルは改行または改行で終了する必要があることに注意してください。最後の行が改行または改行で終わっていない場合、最後の行は適切に解析されません。

次に実行します:

javac Test.java
jar cfm test.jar manifest.mf Test.class
java -jar test.jar

出力:

Hello world

1
Testクラスがjarファイルを介して別のクラスを参照する場合、その場合、どのような変更を行う必要がありますか?
アナンド

@Anand次に、マニフェストにClass-Path行を含め、他のjarを参照する必要があります。 docs.oracle.com/javase/tutorial/deployment/jar/downman.html
rob

この質問に私を助けてください:stackoverflow.com/questions/24740803/...
Sajad

指定されたマニフェストファイルの内容が、バージョンdocs.oracle.com/javase/tutorial/deployment/jar/appman.html
Georgii

2
これは単なるエンドツーエンドのサンプルです。完璧なシンプルなパリパリ。このようなものを何時間も探していました。「Hello world」Java jarの作成方法を検索すると、インターネット全体がこのような単純な例なしですべての迷惑メールでいっぱいである理由がわかりません。大変感謝します。
Atul

58
java -classpath Predit.jar your.package.name.MainClass

このjarが他のjarを使用する場合、クラスパスは "/ path / to / jars / *"のようにすべきではありませんか?
Maxim Chetrusca、2015

5
@Max Chetruscaはいしかし、セパレータがされて:使用して*、あなたのシェルはこのようにそれを拡大していきますので、動作しません。"/path/to/jars/a.jar" "/path/to/jars/b.jar"しかし、あなたが本当にしたいことは次のとおりです"/path/to/jars/a.jar:/path/to/jars/b.jar"
リンチ

29

実行前に、jarチェックMain-Class: classnameMANIFEST.MFファイルで使用できるかどうかを確認します。MANIFEST.MFはjarにあります。

java -jar filename.jar

16

jarにマニフェストを追加する必要があります。これにより、Javaランタイムにメインクラスが何であるかが通知されます。次の内容のファイル「Manifest.mf」を作成します。

Manifest-Version: 1.0
Main-Class: your.programs.MainClass

「your.programs.MainClass」を実際のメインクラスに変更します。次に、ファイルをJARファイルの「META-INF」という名前のサブフォルダーに置きます。そのために、任意のZIPユーティリティを使用できます。


1
好奇心のために、「Meta-inf」サブフォルダー名は大文字と小文字が区別されますか?私は伝統的にそれが「META-INF」と綴られているのを見ました
Adam Paynter

あなたが正しい。スペックは「META-INF」と言うと、ケース非感受性については何も(言っていないjava.sun.com/j2se/1.4.2/docs/guide/jar/...
フロリアンFankhauser

12

.class、.jarファイルを作成するための非常にシンプルなアプローチ。

jarファイルを実行します。マニフェストファイルについてあまり心配する必要はありません。シンプルでエレガントにしましょう。

JavaサンプルHello Worldプログラム

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

クラスファイルをコンパイルする

javac HelloWorld.java

jarファイルの作成

jar cvfe HelloWorld.jar HelloWorld HelloWorld.class

または

jar cvfe HelloWorld.jar HelloWorld *.class

jarファイルを実行する

 java -jar HelloWorld.jar

または

java -cp HelloWorld.jar HelloWorld

はい。jarのオプションをe使用すると、Main-Classentrypoint)を指定でき、対応するマニフェストファイルも作成されます。jarの公式ドキュメントを参照してください。
PetrBodnár19年

11

jarファイルを実行するためだけにマニフェストを作成したくない場合は、jarファイルを実行するときにコマンドラインから直接メインクラスを参照できます。

java -jar Predit.jar -classpath your.package.name.Test

これにより、jarファイルで実行するメインクラスが設定されます。


2
-classpath直後に来てjava取り除きます-jar(つまり、この答えは正しくありません)
Pete

4

ジャワ

class Hello{
   public static void main(String [] args){
    System.out.println("Hello Shahid");
   }
}

manifest.mf

Manifest-version: 1.0
Main-Class: Hello

コマンドライン:

$ jar cfm HelloMss.jar  manifest.mf Hello.class 
$ java -jar HelloMss.jar

出力:

Hello Shahid

3

これらの詳細を処理したくない場合は、EclipseまたはNetBeansからのエクスポートjarアシスタントを使用することもできます。


3

Eclipse実行可能JARファイル

Javaプロジェクトの作成– RunnableJAR

  • 任意の場合はjarファイルが使用され、プロジェクトのビルド・パスに追加します。
  • Runnable Jarファイルの作成中にmain()を持つクラスを選択します。 ここに画像の説明を入力してください

メインクラス

public class RunnableMainClass {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Name : "+args[0]);
        System.out.println(" ID  : "+args[1]);
    }
}

引数を指定してJavaプログラム(cmd)を使用してJarファイルを実行し、出力を取得してEclipseコンソールに表示します。

public class RunJar { 
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        String jarfile = "D:\\JarLocation\\myRunnable.jar";
        String name = "Yash";
        String id = "777";

        try { // jarname arguments has to be saperated by spaces
            Process process = Runtime.getRuntime().exec("cmd.exe start /C java -jar "+jarfile+" "+name+" "+id);
                    //.exec("cmd.exe /C start dir java -jar "+jarfile+" "+name+" "+id+" dir");
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream ()));
            String line = null;
            while ((line = br.readLine()) != null){
                sb.append(line).append("\n");
            }
            System.out.println("Console OUTPUT : \n"+sb.toString());
            process.destroy();
        }catch (Exception e){
            System.err.println(e.getMessage());
        }
   }
}

Eclipseでショートカットを見つけるには:

ヘルプ►ヘルプ目次►Java開発ユーザーガイド►リファレンス►メニューとアクション


3

私はこのフォルダー構造を持っています:

D:\ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ Main.class D:\ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ press \ OlivePress.class D:\ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Kalamata .class D:\ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Ligurian.class D:\ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Olive.class

Main.class 同梱 com.lynda.olivepress

他に2つのパッケージがあります。

com.lynda.olivepress.press

com.lynda.olivepress.olive

1)"Manifest.txt"最初にMain-Classと2番目の空の行を持つ2つの行で名前が付けられたファイルを作成します。

Main-Class: com.lynda.olivepress.Main

D:\ JavaProjects \ OlivePressApp \ Manifest.txt

2)マニフェストとメインクラスのエントリポイントを使用してJARを作成する

D:\ JavaProjects \ OlivePressApp>jar cfm OlivePressApp.jar Manifest.txt com/lynda/olivepress/Main.class com/lynda/olivepress/*

3)JARを実行する

java -jar OlivePressApp.jar

注:com/lynda/olivepress/*ポイント1)の前に、上記の他の2つのパッケージを含めることを意味します。


-2

jarを実行するには、まずuを作成する必要があります

実行可能なjar

その後

java -jar xyz.jar

コマンドが機能します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.