多くの人がJavaアプリケーションをサービスにする方法を尋ねてきましたが、その答えは常にラッパー(つまり、JSW)です。
Javaアプリケーションをサービスに変える理由と、ラッパーなしでそれを実装する方法を知りたいです。
車輪の再発明をするつもりはありません。この問題の背後にある概念を処理しないと、「弱い」と感じるだけです。
WindowsはLunixではありません。Linuxサービスは、開始、停止、再起動などのオプションを実装する単なるシェルスクリプトです。Windowsサービスは、明確に定義されたインターフェイスを実装するネイティブコンポーネントです。JVMはそのようなインターフェースを実装していないため、それを実行してJavaを実行するものが必要です。
そのようなコンポーネントがいくつかあります。私はJavaServiceとApacheDaemonを知っているので、それらを使用することをお勧めします。私は何か「弱い」ものがあるとは思いませんし、言及された解決策が重すぎるとは思いません。JavaServiceは単なる小さなDLLです。
https://en.wikipedia.org/wiki/Service_wrapperを見てください:
「Java自体はシステムサービスの作成をサポートしていません」
Javaはネイティブ実行可能ファイル(!indowsまたはLinux elf実行可能ファイルの.exeファイル)にコンパイルされません。Javaクラスが実行される唯一の方法は、Java仮想マシン内であるためjava -cp Main
、Javaアプリケーションを起動するときに入力します。これは、どのプラットフォームがクラスファイルとjarファイルを作成したかに関係なく、Javaバイナリを複数のプラットフォームで実行できる理由でもあります。
サービスは、ある時点(たとえば起動時)にオペレーティングシステムによって開始される実行可能ファイルにすぎません。このようなサービスの作成は、オペレーティングシステムの問題であるため、Javaとは完全に独立しています。サービスについて詳しく知りたい場合は、関連するWebサイトで「サービス」(または作業しているプラットフォームでサービスと呼ばれるもの)の作成を調べることをお勧めします。詳細については、既存のラッパーライブラリのソースコードを確認することもできますが、OSのサービスを実装するには、必然的にJava以外の言語を使用する必要があります。
少なくとも他の言語でのネイティブコーディングを回避するために既存のラッパーライブラリを使用することに弱点はありません。あなたが言ったように、車輪の再発明をしないでください。
これらのラッパーが必要な理由を知りたい場合は、それらのソースコードを確認できます(一部はオープンソースです)。
java.exe
アプリケーション(および)の実行に通常使用される実行可能ファイルにはjavaw.exe
、サービスの実行に必要なシグナルを処理するものがありません。特に、アプリケーションの起動は簡単ですが、停止して再起動する必要があることをサービスアプリケーションに通知することは別の問題です。アプリケーションの実行中にこれらの通知をキャッチするための何かが必要です。これがプロセスの突然の終了でない場合は、確かに優れています。
サービスの登録の側面に加えて、サービスラッパーはいくつかのJNI関数も実装し、アプリケーションにそれがサービスであることを認識させます。(私が知る限り、実行可能ファイルの代わりにJVM DLLを使用する傾向もあります。)
たとえば、 Winrun4Jコードを見てください。ネイティブセクションとJavaセクションがあります。
さらに、サービスは特定のトリックを認識する必要もあります。たとえば、を使用しない-Xrs
場合、ユーザーがログオフするとサービスがシャットダウンされます。