JavaプログラムにJREを持たせる


Java開発プログラムを用いて,配布時に常に考慮すべき問題は,利用者の機器にJREをどのように装着するかである.考慮すべき問題は、使用者がJREを独自にインストールする能力があるかどうか、使用者の既存のJREが私たちが必要とするバージョンと一致しているかどうか、バージョンの問題が発生するかどうかなどです.使用するNETが考えなければならない問題は少ない.今NET CLRはすでに普及しているようで、多くのD版のWin XPを見ても自分で最新のものをインストールします.NET CLRは、インストールインタフェースもJREより友好的なようです.JREをインストールする問題を徹底的に解決する方法は、私たちのアプリケーションが自分でJREを背負っていることです!このように、私たちのプログラムは伝統的なWin 32アプリケーションのように、ダブルクリックで実行することができます.ある機械にJREがあるかどうかは関係ありません.どんなバージョンのJREなのか、いずれにしても、私は自分のものを持っています.それをするには、実はとても簡単です.
王森は彼の『Java深度冒険』(この本を強く推薦して、内容は少なくて精巧である)の第一章でJDK、JRE、JVMの関係を説明した.私たちがjava.exeを実行する時に起こったことを説明した.その中で、java.exeは論理によって使えるJREを探して、まず自分の(王森さんによると、私はJDKのすべてのソースコードを持っていないので、ここでは検証できません)、次に自分の親ディレクトリの下にJREがあるかどうかを探します.最後にWindowsのレジストリを調べます.
通常、JREをインストールしたマシン上のどのディレクトリでもjavaを実行できます.exe.インストール時にwindowsのsystem 32ディレクトリにコピーされ、後者はどうしてもpath環境変数にコピーされるからです.これexeは最終的に必ずレジストリにアクセスして、本当のJREの所在地を決定します.アプリケーションごとにJREを持参するように要求すると、この道を歩むことはできません.しかし、論理の2つ目はjavaです.exeは親ディレクトリの下でJREを検索し、ソリューションはこのバーにあります.
私たちのアプリケーションがMyAppというパッケージを作ったとします.JAr、MyAppのディレクトリの下に置きます.MyAppディレクトリの下でjava-jar MyAppを実行できます.jarは私たちのプログラムを実行します.私たちがインストールしたのはJRE 1.5で、C:Program FilesJavajre 1です.5.0で.今、私たちは簡単にjre 1を必要とします.5.0ディレクトリはMyAppディレクトリの下に移動し、ついでに書きやすい名前を変更します.例えばjreと言います.今、私たちのアプリケーションはこのようにしています.
MyApp
       MyApp.jar
       Jre
              Jre1.5.0ディレクトリのすべて
Java.exeはjreディレクトリの下のbinディレクトリにあります.2番目の論理に基づいてjava.exeは親ディレクトリでjreを検索し、libディレクトリが検索され、libはjreディレクトリの下にあることを実験で確認しました.したがってjava.exeはjreの場所を特定してjavaプログラムを正常に実行し、JREがインストールされているかどうか、レジストリに登録項目があるかどうかなどの雑用はしません.
試しに、コマンドラインの下でMyAppのディレクトリに入り、Cディスクにあると仮定して、pathをMyAppの下のJREに指します.
set path=c:\MyApp\jre\bin
次に、次のように実行します.
java –verbose –jar MyApp.jar
verboseパラメータを加えて、私たちがこのセットを使って家を出たJREを確定します.
プログラムは実行され、コマンドラインの出力の最初の行に表示されます.
[Opened C:\MyApp\jre\lib\rt.jar]
[Opened C:\MyApp\jre\lib\jsse.jar]
[Opened C:\MyApp\jre\lib\jce.jar]
[Opened C:\MyApp\jre\lib\charsets.jar]
そのため、プログラムが読み込んだのは確かにそのプライベートなJREです.
これで、私たちは任務を果たしたようだ.しかし、今でも私たちのプライベートJREは完璧ではありません.欠点は大きすぎます.JRE 1.5は70 MB近くあり、私たちのプライベートなJREとして、多くの内容を捨てることができます.Jreディレクトリのlicenseは不要で、binの実行ファイルはjavaを保持するだけです.exeまたはjavaw.exe,libではrt,jsse,jce,charsetsのいくつかのライブラリを保持すればよい.i 386とziの2つのサブディレクトリを除いて、残りのサブディレクトリは不要です.Ziの下には、自分の地域のサブディレクトリとその下のファイルを残すだけでいいです.Libの下にはライブラリ以外のプロパティファイルなどが保持されます.このように整理すると、JREはまだ50 MB近くあります.また、いくつかのライブラリファイルの不要な内容を整理し続けることもできます.これは細かく整理する必要があります.手間がかかります.自動ツールを書いて整理したほうがいいです.Sun社から上下したJMFに付属しているJavaで書かれたメディアプレーヤーにはJREが付属しており、数MBしかありません.
クリーンアップ後、JREに何かが欠けていないことを確認するために、アプリケーションを何度も実行する必要があります.
アプリケーションを直接起動するプログラムがほしいなら、まだ時間がかかります.最も簡単な方法はショートカットを作ることですが、ショートカットの経路は相対的ではなく、インストールが不便です.私が考えた案はWin 32プログラムで包装することです.VS.NETの下にWin 32ウィジェットを書きます.
int PASCAL WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine,
    int nCmdShow )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    // Start the child process.
    if( !CreateProcess( "jre\\bin\\javaw.exe",//
                        "jre\\bin\\javaw.exe -jar MyApp.jar", //
            NULL,             // Process handle not inheritable.
            NULL,             // Thread handle not inheritable.
            FALSE,            // Set handle inheritance to FALSE.
            0,                // No creation flags.
            NULL,             // Use parent’s environment block.
            NULL,             // Use parent’s starting directory.
            &si,              // Pointer to STARTUPINFO structure.
            &pi )             // Pointer to PROCESS_INFORMATION structure.
    )
    {
            ErrorExit( "CreateProcess failed." );
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

基本的にはMSDNドキュメントの例に従っています.それをEXEファイルにコンパイルすると、私たちのタスクはすべて完了します.このEXEファイルをダブルクリックすると、私たちのプログラムが起動し、従来のWin 32プログラムと変わらないように見え、JREは完全に最下位に隠されています. 
いくつか補充します:一、exe 4 j.説明:exe 4 jはJarファイルをexeファイルに作成できますが、jreサポートが必要です.Jarファイルを外に置くこともできます.ソフトウェア性質:共有ソフトウェアダウンロードアドレス:http://www.ej-technologies.com/products/exe4j/overview.html二、JBuilder.説明:新しいバージョンのJBuilderは、Windowsシステムを含む各システムの実行可能ファイルに直接プロジェクトを作成することができます.ソフトウェアの性質:商業ソフトウェアのダウンロードアドレス:略.eMuleからダウンロードしました.三、NativeJ.説明:exe 4 j機能と類似しています.ソフトウェア性質:共有ソフトウェアダウンロードアドレス:http://www.dobysoft.com/products/nativej/download.html四、Excelsior JET.説明:Javaクラスファイルを直接exeファイルに作成できます.AWTおよびSwingおよびサードパーティグラフィックインターフェースのほかに、jreサポートは不要です(Java 5.0は不可).ソフトウェアの性質:共有ソフトウェアダウンロードアドレス:http://excelsior-usa.com/home.html5、jshrink.説明:Jarファイルをexeファイルにパッケージできます.混同機能も備えています.(これが主な機能です).ソフトウェアの性質:共有ソフトウェアダウンロードアドレス:http://www.e-t.com/jshrink.html六、InstallAnywhere.説明:パッケージングツール、Javaパッケージングに最適.各オペレーティングシステムの実行パッケージにパッケージング可能.Windowsシステムを含む.ソフトウェアの性質:ビジネスソフトウェア.ダウンロードアドレス:http://www.zerog.com/七、InstallShieldX.説明:InstallAnywhereと似ていますが、InstallAnywhereよりも強力です.相対的に、複雑で、上手ではありません.私はまだ覚えていません.ソフトウェアの性質:ビジネスソフトウェア.ダウンロードアドレス:http://www.installshield.com/