web-dev-qa-db-ja.com

JARファイルがCMDで実行されるのに、ダブルクリックでは実行されないのはなぜですか?

そのため、JARファイルをダブルクリックするだけでユーザーが使用できるようにしたシンプルな3DGUIアプリケーションを作成してきました。 JARファイルに入れる前に完全に機能し、コマンドプロンプトから実行しているときにJARファイルで完全に機能しました(jarファイルのディレクトリにあるときに「Java-jarModeler.jar」と入力します)。ただし、ダブルクリックしても何も起こりません。コマンドプロンプトからのエラーがなく、問題なく実行されます。経験上、コンソールが表示されない(または表示が速すぎる)ため、起動時のクラッシュレポートは表示されませんが、コマンドプロンプトから実行するとクラッシュレポートは表示されません。なぜそれが機能しないのかについてのアイデアはありますか? Windows 7 Home Premiumを実行しています。役立つ場合は、JARファイルの内容を次に示します。

Modeler.jar
|
+--*all the class files necessary*
|
+--META-INF
   |
   +--MANIFEST.MF

MANIFEST.MFの内容:

Manifest-Version: 1.0
Built-By: AnonymousJohn
Class-Path: bin/j3dcore.jar bin/j3dutils.jar bin/vecmath.jar
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Main-Class: Start

編集:それで、javaw.exeの代わりにJava.exeを使用するようにファイルの関連付けをいじった後(それによって印刷用のウィンドウを提供します)、起動メカニズムを少し変更して現在の作業ディレクトリを印刷した後、私はjarファイルを発見しました私が置いたデスクトップ上のフォルダの代わりに「C:\ Windows\system32」から実行されています。ただし、必要な外部ファイルをそこに移動しても何の役にも立ちません。

編集2:別のJARファイルを作成してみましたが、今回は、現在の作業ディレクトリを示すボタンが付いた単純なJFrameを使用しました。ボタンを押すと、(役に立たない)JFileChooserが開きます。これは、コンピューターのどこに配置しても、ダブルクリックで機能しました。したがって、JARファイルに問題があるはずです。プログラムのトラブルシューティングを再開します。

編集3:問題は私が思ったとおりです:ダブルクリックしたときにライブラリが正しく読み込まれていません。奇妙な部分は、現在のパスとライブラリパスを表示するテストでは、コマンドプロンプトを使用して実行しても、ダブルクリックして実行しても、出力がまったく同じであるということです。スタックトレースは次のとおりです。

Java.lang.UnsatisfiedLinkError: no j3dcore-d3d in Java.library.path
  at Java.lang.ClassLoader.loadLibrary(Unknown Source)
  at Java.lang.Runtime.loadLibrary0(Unknown Source)
  at Java.lang.System.loadLibrary(Unknown Source)
  at javax.media.j3d.NativePipeline$1.run(NativePipeline.Java:231)
  at Java.security.AccessController.doPrivileged(Native Method)
  at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.Java:200)
  at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.Java:157)
  at javax.media.j3d.MasterControl.loadLibraries(MasterControl.Java:987)
  at javax.media.j3d.VirtualUniverse<clinit>(VirtualUniverse.Java:299)
  at javax.media.j3d.Canvas3D.<clinit>(Canvas3D.Java:3881)
  at ModelPreview.<init>(ModelPreview.Java:51)
  at Modeler.<init>(Modeler.Java:76)
  at Modeler.main(Modeler.Java:1227)
  at Start.main(Start.Java:92)

問題は、それがISライブラリパスにあることです。プログラムで具体的に設定しました。問題となる可能性があると考えたので、このように設定しました(これはメソッドでした)インターネットのどこかで見つけました。覚えていない場所です):

//above was code to get newPath based on the Operating System.
//all this code is set in a try-catch phrase.
//reset the library path
System.setProperty("Java.library.path", ".\\bin\\natives" + newPath + ";");
//make sure the ClassLoader rereads the NEW path.
Field f = ClassLoader.class.getDeclaredField("sys_paths");
f.setAccessible( true );
f.set(null, null); //ClassLoader will automatically reread the path when it sees that it is null.  

最終編集:まあ、私のコードを見て再検討した後、問題は、間違ったdllをロードしている64ビットシステムの検出を含むいくつかのBSにあることを発見しました。ダブルクリックではなくコマンドラインから機能した理由はわかりませんが、多分決してわかりませんが、今はダブルクリックで機能するので嬉しいです。ご迷惑をおかけして申し訳ありません。

18
AnonymousJohn

わかりましたので、私はこの正確な問題に1週間以上行き詰っていました(これは、1日数時間しか費やせなかったサイドプロジェクトのためのものでした)。

これは私のデスクトップで発生しましたが、何らかの理由でラップトップでは発生しませんでした。

周りを見回した後、私はこの答えを見つけました。私と同じような人々のためにそれを共有したいと思いました。クレジットは匿名のスタックオーバーフローユーザーに送られます。

一見無関係な問題に対する他の回答で述べたように、この小さなプログラムを使用して、JARファイルを64ビットバージョンのJavaに関連付けます。

http://johann.loefflmann.net/en/software/jarfix/index.html

プログラムをどこかに保存し、コマンドラインからパラメータ/ 64を指定して実行します:c://path//jarfix.exe/64

他に何もうまくいきませんでしたが、これは魔法のようでした。 :)

25
Eric

JARはCMDから実行可能です。これは、JAR自体が正しく形成されていることを意味します。良い。

現在失敗する唯一の理由は、ダブルクリックで正しいコマンドが生成されないことです。あなたが正しく言ったように、期待されるコマンドは

Java -jar Modeler.jar

しかし、javaw.exeをJAR拡張機能に関連付けると、実行されるのではないかと思います

javaw Modeler.jar

確認は簡単です。以下を含むjavajar.cmdファイルを作成します

javaw -jar %*

そしてそれをJARに関連付けます。アプリが正常に起動すれば、私は正しいです。そうでなければ、ごめんなさい。

7

Windows 7のコントロールパネルでファイルの関連付けを変更できないことにうんざりし、レジストリを編集しました(注:失敗する可能性があると思われる場合は、続行する前に復元ポイントを設定することはまったく悪い考えではありません)(復元ポイントを設定したり、失敗したりしません):

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\jar_auto_file]
@=""
"EditFlags"=hex:00,00,00,00

[HKEY_CLASSES_ROOT\jar_auto_file\Shell]

[HKEY_CLASSES_ROOT\jar_auto_file\Shell\open]

[HKEY_CLASSES_ROOT\jar_auto_file\Shell\open\command]
@="\"C:\\Program Files\\Java\\jdk1.7.0_60\\bin\\javaw.exe\" -jar \"%1\" %*"

これは、.jarファイルの値が(Default)jar_auto_fileであることを前提としています。そうでない場合:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.jar]
@="jar_auto_file"

p.s.レジストリで見つけた1つの問題は、jarfileApplications\Java.exeだけでなく、Netbeans、Chrome、Java.exeにも関連付けられていたことです。私はそのノード全体を削除しました(エクスポートした後、必要な場合は元に戻すことができましたが、そうでなかったためです)。これで、レジストリにjarfileがなくなり、すべての.jarファイルが以前と同様に実行されます。

これは、コントロールパネルに.jarファイルに関連付けられた複数のファイルタイプを表示することで明らかになります。あなたはこれを求めている:

enter image description here

推奨プログラムに複数のアイテムが表示されている場合は、レジストリでjarfileを検索し、(最初にエクスポートしてから)そのノードを削除します。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jar

1
DSlomer64

複数のバージョンのJavaがインストールされていることに気付いた後、.jarファイルで同じ問題が発生しました。不要なバージョンを削除すると問題が解決しました。jarがJREの異なるバージョン。

ちょうど私の2セントを置くために、私はこの問題があり、それはマニフェスト内の何かによって引き起こされたと思います。別の方法で実行可能JARを生成することで解決しました。

以前の開発者はEclipseからRunnableJARを生成し(プロジェクトを右クリック->エクスポート...-> Runnable JAR)、これはすべての人にとって問題なく機能しました。次に、pom.xmlでMavenプラグイン(「アセンブリ」)を構成して実行可能なJARを生成したので、従来のMavenビルドで実行可能なJARが生成されました。

これは私にとってはうまく機能しましたが(cmd およびからダブルクリックして)、エンドユーザー(cmdからツールを実行できたがJARをダブルクリックした場合は実行できなかった)では機能しませんでした。

Eclipseから実行可能なJARを生成しましたが、今では誰もが再び満足しています。なぜmavenで生成されたJARがダブルクリックで実行しても問題ないのかはわかりませんが、ジョブが完了したので、さらに調査する必要はありません。この半分のアドバイスが誰かを助けることを願っています。

0
Peter Perháč