5

リクエスト:

これは、私のロケールの Java 開発者が直面する非常に一般的な問題です。私は本当にこれで何日も立ち往生しています。ドキュメントを読んで、たくさん検索して試しました。JavaExe に関連するすべての stackoverflow の質問を読んでください。以前に同様のことをしたことがあり、包括的な回答がある場合にのみ返信してください。コミュニティには本当に感謝しています!

シナリオ:

JavaExeを使用して、アプリケーションをデスクトップインタラクティブ機能のシステム サービスとして実行しています。正確には、デスクトップのスクリーンショットをキャプチャするアプリケーションがあります。誰も停止できないように、任意のユーザーログインで(管理者として)実行したい。

myapp.jar、settings.txt、および lib dir があります。

私はたくさん検索して、JavaExeが機能することを発見しました(その例を見て)

誰かがより良い方法を持っているなら。そう申し上げてください。

問題:

私の調査によると、

  1. .exe のような名前の .properties ファイルを作成し"RunType = 1"、このファイルに書き込む必要があります。

  2. メインクラスで静的メソッドを定義します:serviceInit()

クラスまたは参照/インポートを配置する必要がありますか? どのように?

編集:

以下の私のコードはスタンドアロンの .jar として、また javaExe.exeでも機能します。

システムサービスを作成し、 SYSTEMユーザーとして実行するようになりました。しかし、デスクトップに対してインタラクティブではありません。つまり、GUI は表示されません。

package temp;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;


public class Temp {


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {


          serviceInit();

    }

    public static boolean serviceInit(){

        new Thread(){
            public void run(){
                Integer i = 0;
                while(i < 999999999){
                    JOptionPane.showMessageDialog(null,i);
                    i++;

                }
            }
        }.start();

        return true;
   }




}

そして、.jar、lib ディレクトリ、および settings.txt を 1 つの .exe にバンドルすることは可能だと思いませんか?

4

2 に答える 2

2

あなたのケースにあるはずです:

public class MyApp_ServiceManagement
{
    static boolean isMsgToDisplay = false;

    /////////////////////////////
    public static boolean serviceInit()
    {
        (new Thread()
        {
            public void run()
            {
                for(int i=0;i < 6;i++)
                {
                     try { sleep(5*1000); }
                     catch(Exception ex) {}

                     isMsgToDisplay = true;
                }
            }
        }).start();

        return true;
    }

    /// is Data ready to be send to the UI ?
    public static boolean serviceIsDataForUI()
    {
        return isMsgToDisplay;
    }

    /// Data to be send to the UI
    public static Serializable serviceDataForUI()
    {
        isMsgToDisplay = false;
        return "hello, I am an interactive Service";
    }
}

およびUI部分の場合:

public class MyApp_TaskbarManagement
{
    /// To show (or not) the icon in tray
    public static boolean taskIsShow()
    {
        return false;
    }

    /// Receive the message from Service
    public static void taskDataFromService(Serializable data)
    {
        JOptionPane.showMessageDialog(null, data);
    }

    /// descr of UI
    public static String[] taskGetInfo()
    {
        return new String[]
            {
                "UI part of Service"
            };
    }
}
于 2013-05-29T19:53:15.120 に答える