お世話になっています。エクリプスで作ったプロジェクトをいつでも実行可能な形(コマンドプロンプト等ではなくダブルクリックで起動するような形)にしたいのですが、初めてなのでどうすればよいかわかりません。一応自分でも調べ、エクスポートから.jarの形にしてみたのですがダブルクリックしても起動しませんでした。どうか、よろしくお願いします。
CC BY-SA 3.0
2017-11-07T15:43:01.893
39391
2019-11-08T23:41:01.493
24534
question
java
エクリプスで作ったプロジェクトをいつでも実行可能なファイルにする
適切なマニフェスト・ファイルを作らないと、実行可能なjarファイルにはなりません。

「executable jar」とか「実行可能 jar」などのキーワードでググってみましたか？たくさん情報はあると思いますよ。

例えば、このページはどうですか？

<http://sunjava.seesaa.net/article/57546363.html>
CC BY-SA 3.0
2017-11-07T15:58:22.940
39393
2017-11-07T15:58:22.940
21092
39391
answer
Windows10を前提に記載します。また、記載したコマンドはPowerShellで実行しています。

サンプルコードは以下になります。ダブルクリックで開きたいということからおそらくGUIを持つアプリケーションだろう、ということでSwingを用いています。

  * <https://github.com/yukihane/stackoverflow-qa/tree/master/so39391>

# 1\. 前準備: executable-jar を作成する

ここで言うexecutable-jarとは、下記のコマンドにより想定通り動作するようなファイルを指します。

```

    java -jar <jarファイル名>
    
```

excecutable-jarはおおよそ次のような性質を持ちます:

  * 実行に必要な `.class` ファイルが全てjarファイルに含まれている
  * マニフェストに `Main-Class` 属性を持つ

(実のところ、executable-
jarの作成は今回の質問を解決するうえで必須ではありませんが、問題をシンプルにするために行っておいた方が良いと考えます。)

## 選択肢a) Eclipse で executable-jar を作成する

(※ この方法はもはや主流ではありません。次に説明するMavenによる作成を試してみてください)

Project Explorer で今回のプロジェクトを右クリックし、 **Export > Runnable JAR file** から作成できます。  
このとき、 Library handling の選択肢は " **Extract requred libraries into generated
JAR** " を選択するようにしてください。

[![画像の説明をここに入力](https://i.stack.imgur.com/Fcv0u.png)](https://i.stack.imgur.com/Fcv0u.png)

## 選択肢b) Maven で executable-jar を作成する

Mavenパッケージであるなら、Eclipseのメニューから作成するより Maven plugin で解決した方がよいでしょう。  
例えば maven-assembly-plugin を用いて次のように書けます。

```

      <!-- https://maven.apache.org/plugins/maven-assembly-plugin/usage.html -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>com.github.yukihane.App</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    
```

`mvn package` コマンド実行時に、通常のjarファイルと同時に、接尾に `-with-dependencies`
が付与されたファイルも生成されるようになります。  
これが executable-jar です。

# 2\. executable-jar をダブルクリックで起動できるようにする

## 2.1. パブリックJRE

Java8までは、OracleのサイトからダウンロードできるJDK/JREインストーラでインストールすると、パブリックJREのインストールを選ぶことができました。

[![画像の説明をここに入力](https://i.stack.imgur.com/psPns.png)](https://i.stack.imgur.com/psPns.png)

パブリックJREをインストールしていれば、jarファイルをダブルクリックした際にJVM上でプログラムが実行されるような設定が自動で行われていました。  
この場合、特に意識することなく所望の動作になります。

[![画像の説明をここに入力](https://i.stack.imgur.com/pqK6V.png)](https://i.stack.imgur.com/pqK6V.png)

[launch4j](http://launch4j.sourceforge.net/)などでjarをラップしexeファイル化することで、見た目などをネイティブ実行ファイルと変わらなくすることもできます。

```

      <!-- https://github.com/lukaszlenart/launch4j-maven-plugin/blob/master/src/main/resources/README.adoc -->
      <plugin>
        <groupId>com.akathist.maven.plugins.launch4j</groupId>
        <artifactId>launch4j-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>l4j-gui</id>
            <phase>package</phase>
            <goals>
              <goal>launch4j</goal>
            </goals>
            <configuration>
              <headerType>gui</headerType>
              <outfile>target/myapp.exe</outfile>
              <jar>target/execjava-0.0.1-SNAPSHOT-jar-with-dependencies.jar</jar>
              <classPath>
                <mainClass>com.github.yukihane.App</mainClass>
              </classPath>
              <jre>
                <minVersion>1.8.0</minVersion>
              </jre>
            </configuration>
          </execution>
        </executions>
      </plugin>
    
```

今回の質問はおよそ2年前に行われていますが、当時はこれで問題なかったかと思います。  
が、現在は利用できる状況は限られつつあります。  
現在主流のJavaディストリビューションにはもはやパブリックJREは含まれないからです。

## 2.2. jpackage

<https://jdk.java.net/jpackage/>

アーリーアクセス(つまり、まだ正式版ではない)の段階ですが、jpackageも今回の目的に沿うプロダクトです。

冒頭に記載したリポジトリのコードでは、次のコマンドで作成できます:

```

    mvn clean package
    mkdir fatjar
    mv .\target\execjava-0.0.1-SNAPSHOT-jar-with-dependencies.jar .\fatjar\
    jpackage --package-type app-image -d target -i fatjar -n myjpkg `
      --main-class com.github.yukihane.App `
      --main-jar execjava-0.0.1-SNAPSHOT-jar-with-dependencies.jar
    
```

`target\myjpkg` 以下のファイルが生成物(配布対象)です。  
`myjpkg.exe` ダブルクリックで実行できます。

前述パブリックJRE方式は、実行するユーザの環境にあらかじめパブリックJREの導入が必要です。  
一方、jpackageはランタイムを同梱するのでそのような前提はありません。(その分配布物のサイズが増加しますが)

## 2.3. GraalVM

<https://www.graalvm.org/>

[`native-image`](https://www.graalvm.org/docs/reference-manual/native-
image/)コマンドでネイティブイメージ化する方法です。

```

    native-image -jar .\fatjar\execjava-0.0.1-SNAPSHOT-jar-with-dependencies.jar --no-fallback
    
```

試してみたところ残念ながら現在の最新版 `19.2.1` はまだ
WindowsのSwingアプリケーションには対応できていないようですが、将来的には選択肢に含まれるかもしれません。

  * [[native-image] Windows with a swing application #1327](https://github.com/oracle/graal/issues/1327)
CC BY-SA 4.0
2019-11-08T23:41:01.493
60364
2019-11-08T23:41:01.493
2808
39391
answer