質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.05%

javapackagerでexeファイルを作成しても、インストール後に起動できない

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 3,289

serona

score 25

いつもお世話になっています。
JavaFXでGUIアプリケーションを作成しています。
開発環境はeclipceを使用してます。 

私は、MacOS XとWindows7(64bit)のパソコンを持っており 
アプリケーションは、MacOS Xの方で作成しました。

作りたかった機能があらかた完成し、
eclipseで実行しても問題なく動作しているようなので、
「エクスポート」>「実行可能JARファイル」として出力したのですが、
MacでもWindowsでも、正しく起動しません。
追記:この現象は、「生成されるJARに必須ライブラリーをパッケージ」を選択した場合のみで発生します。

「エクスポート」>「JARファイル」として出力すると、
MacでもWindowsでも、
問題なく起動し、アプリケーションを使用できます。

Windowsの方は、実行可能jarファイルを起動するために、
Javaを再インストールしたり、64bit用のJavaをインストールしたり
環境変数の設定をしたりと色々触ってみたりみたのですが、ダメでした。

fxmlファイルについては、JARファイルでエクスポートすれば起動できることと
ほとんど「JavaFx Scene Builder2.0」で作成していたため
ここには原因がないのではないかと思い、細かい確認などはしていないです。

追記:eclipseにて、「実行可能JARファイル」をエクスポートする際、
「生成されるJARに必須ライブラリーを抽出」や
「生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー」を選択していた場合は、
jarファイルが問題なく起動しました。

追記:目的

後々は、javapackagerを使って
自己完結型アプリケーションにしたいです。

http://aoe-tk.hatenablog.com/entry/2015/12/19/170651

上記のサイトを参考に、起動できるJARファイルから
javapackagerを使ってexeファイルを作成してみましたが
インストール後、「No main class specified」「Find angle to launch JVM」
というメッセージが出るだけで、こちらも起動しません。

まだ、エクスポート時の方法によって起動できない原因は分かっていませんが
最終目的は、自己完結型アプリケーションとしてのパッケージなので、
それを達成するための原因は別件かと思い、タイトルも変更しました。
恐れ入りますが、何卒よろしくお願いします。><

エラーメッセージ

コマンドプロンプトで

java -jar  アプリケーション名.jar > log.txt 2>&1

このように入力すると、
eclipseで、「実行可能JARファイル」の
「生成されるJARに必須ライブラリーをパッケージ」を選択してエクスポートした場合のみ、
以下のようなエラーが出力され、ウィンドウなどが全く表示されません。

ただ、タスクマネージャーを確認すると、「java.exe」が起動しています。
ダブルクリックで起動した場合は、「javaw.exe」が起動します。
どちらも、「Java(TM) Platform SE binary」となってます。
これらは、エラーが出た後、タスクマネージャーから終了させるまで動いているみたいです。

javafx.fxml.LoadException: 
application/MainForm.fxml:26

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at application.Main.start(Main.java:21)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.MalformedURLException: Could not open InputStream for URL 'rsrc:ActionForm.fxml'
    at org.eclipse.jdt.internal.jarinjarloader.RsrcURLConnection.getInputStream(RsrcURLConnection.java:46)
    at java.net.URL.openStream(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2440)
    at javafx.fxml.FXMLLoader.access$2700(FXMLLoader.java:103)
    at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
    ... 17 more

追記:MANIFEST.MF

こちらが「実行可能JARファイル」でエクスポートした.jarファイルから
MANIFEST.MFを展開したものです!

Manifest-Version: 1.0
Rsrc-Class-Path: ./ org.eclipse.fx.ide.css.jfx8_2.3.0.201603030809.jar
Class-Path: .
Rsrc-Main-Class: application.Main
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader


こちらが「JARファイル」でエクスポートした.jarファイルから
MANIFEST.MFを展開したものです!

Manifest-Version: 1.0
Main-Class: application.Main

追記:javapackager

「管理者として実行」でコマンドプロンプトを起動して、以下のように入力しています。

javapackager -deploy -native exe -outdir C:\test -outfile test -srcdir C:\test -srcfiles test.jar -appclass application.Main -name test

C:\testの中にJARファイルを保存しています。出力先も同じC:\testです。
この時点では、特にエラーなどは確認されず、
ファイルは以下のディレクトリに保存されました、みたいなメッセージが出てきて終了しています。
作成された.exeファイルも、インストールやアンインストール時の動作に問題はないように見えます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

スタックトレースを拝見するとFXMLの場所の指定の仕方に起因する問題に見えます。

java.net.MalformedURLException: Could not open InputStream for URL 'rsrc:ActionForm.fxml'

とありますね。自分は普段次のように単純にメインクラスパッケージにFXMLを置く前提でスタートメソッドを書きます。

package com.ksoh.myapp;
...
public class MyApplication extends Application {
  @Override
  public void start(Stage primaryStage) throws Exception {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
    Parent root = loader.load();
    ...
  }
}

IDEはeclipseではなくIntelliJなのですが、「JavaFXアプリケーション」という専用のパッケージャーを用いてJavaFXアプリケーションに関する諸元を入力した場合のMANIFEST.MFは例えば次のようになります。(太字がJavaFXアプリケーションの諸元として指定した内容です)

Manifest-Version: 1.0
Implementation-Title: KSOH MyApplication
Implementation-Version:
Permissions: sandbox
JavaFX-Version: 8.0
Class-Path:
Created-By: JavaFX Packager
Implementation-Vendor: KSOH
Main-Class: com.ksoh.myapp.MyApplication

こうして生成されたjarをWindows10のexplore上でダブルクリックすると普通に起動できます。MANIFEST.MFの中で肝心と思えるのはMain-Classの指定です。ここが正しく設定されてさえいればJavaFXアプリケーションでも普通のアプリケーションでもダブルクリックで起動できる気がします。

質問者さんはeclipseにより2つの違ったjarパッケージングをされているようですが、動く場合と動かない場合のMANIFEST.MFの違いを確認してみるとよいと思います。(質問を編集してその2つを記載されるとeclipseを使っていない閲覧者のみなさんにも内容が把握できると思います)


ご存知と思いますが、生成されたjarファイルがx.jarだとするとターミナル上で

jar xvf x.jar META-INF/MANIFEST.MF

とするとjarの中のMANIFEST.MFが展開されるので中身を確認できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/16 14:08

    早々のご回答、ありがとうございます!!
    まずは、ご教示どおりMANIFEST.MFの展開をして、編集させて頂きました。

    起動ができない、実行可能JARファイルの方が
    「Rsrc-Main-Class: application.Main
    Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader」
    となっており、この「Main-Class」が「application.Main」である必要がある、ということかなと思っています。
    まずは「MANIFEST.MF」について調べてみたいと思います!

    取り急ぎ、お礼まで失礼します!><

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る