Java / JVMアプリケーションをデーモンに変える

jvmアプリケーションを実行するために、シェルスクリプトとバッチファイルをどのくらいの頻度で作成しますか。また、別のプロジェクトからどのくらいの頻度でコピーしますか。











appassembler-maven-pluginを使用してスクリプトを生成し、プログラムを起動してそこからデーモンを作成できます。 プラグインは、 Javaサービスラッパーの構成、スクリプトの生成、アプリケーションの構築に関するすべてのルーチン作業を行います。



しかし、私たちは生活を簡素化し、自動化されたソリューションを使用してMavenアーティファクトのスケルトンを作成し、悪魔を構築します。 ジェネレータプラグインcom.github.igor-suhorukov:mavenのdaemon-archetype。これは中央リポジトリgithubで 利用可能です 。 とにかく、appassembler-maven-plugin!



デーモンのスケルトンを作成するために必要なことは、対話モードでcreateコマンドを実行し、プロジェクトで何が起こったかを構成することだけです。



mvn archetype:generate -DarchetypeGroupId=com.github.igor-suhorukov -DarchetypeArtifactId=daemon-archetype -DarchetypeVersion=0.1
      
      





重要なお知らせ! JavaサービスラッパーデーモンはSIGINTシグナルによって停止されるため、リソースを正しく解放するには、Runtime.getRuntime()。AddShutdownHook(...)を登録する必要があります。



デーモンアーキタイププラグインの構成



パラメーターgroupId、artifactId、versionは、すべてのアーキタイププラグインに必要であり、これが対応するpom.xmlタグに含まれているため、特別な注意に値しません。



entry-point-classパラメーターを使用して、完全修飾クラス名、メソッドpublic static void main(String [])を指定する必要があります。このメソッドのデーモンは、起動時に呼び出します。 Javaアプリケーションの場合、main-artifact *プロジェクトの依存関係と現在のプロジェクトのsrc / main / javaディレクトリの両方から、mainメソッドでクラスを指定できます。



パラメーターmain-artifact-artifactId、main-artifact-groupId、main-artifact-versionは、 entry-point-classを含む依存関係を示します。 main-artifact *の推移的な依存関係もアセンブリにパッケージ化されています。



launcher-nameは、binディレクトリ内のデーモンスクリプトの名前を定義します。



例:gitblitサーバーのgitデーモン。



サンプルでは、​​gitサーバーデーモンを作成します。 コンソールでコマンドを実行するか、対話モードで同じパラメーターを指定します。



 mvn archetype:generate -DarchetypeGroupId=com.github.igor-suhorukov -DarchetypeArtifactId=daemon-archetype -DarchetypeVersion=0.1 -DgroupId=com.github.igor-suhorukov -DartifactId=gitblit-launcher -Dversion=1.0-SNAPSHOT -Dpackage=com.github.igor-suhorukov -Dentry-point-class=com.github.igorsuhorukov.groovy.GroovyMain -Dlauncher-name=launcher -Dmain-artifact-artifactId=groovy-grape-aether -Dmain-artifact-groupId=com.github.igor-suhorukov -Dmain-artifact-version=2.4.5.4 -DinteractiveMode=false
      
      









結果のpom.xmlを編集した後、次の構成フラグメントをプログラムおよびデーモンタグに追加します。



 <commandLineArguments> <commandLineArgument>https://raw.githubusercontent.com/igor-suhorukov/git-configuration/master/gitblit.groovy </commandLineArgument> </commandLineArguments>
      
      





コマンドを実行します:



 mvn package
      
      





アセンブリ後、ターゲットディレクトリにはデーモンを含むアーカイブ:gitblit-launcher-1.0-SNAPSHOT-daemon.tgzと、コンソールアプリケーションを起動するための通常のスクリプトを含むtgzおよびzip形式の2つのアーカイブgitblit-launcher-1.0-SNAPSHOT-assembly.tgz、gitblit- launcher-1.0-SNAPSHOT-assembly.zip。



この例では、 com.github.igor-suhorukov:groovy-grape-aether:2.4.5.4のjarファイルがデーモンとともにアセンブリにパックされています。 デーモンは、メインクラスcom.github.igorsuhorukov.groovy.GroovyMainを指定してJVMを起動し、パラメーターとして Groovyスクリプトraw.githubusercontent.com/igor-suhorukov/git-configuration/master/gitblit.groovyにパスを渡します



Groovyスクリプトは、プロジェクトリポジトリからgitblit.warをダウンロードし、ユーザーのホームディレクトリに解凍し、gitblit構成のリポジトリリポジトリへのパスを置き換えます。 その後、jettyサーバーとその内部のgitblitを起動します。



gitblit.groovy
 import com.github.igorsuhorukov.smreed.dropship.MavenClassLoader @Grab(group='org.codehaus.plexus', module='plexus-archiver', version='2.10.2') import org.codehaus.plexus.archiver.zip.ZipUnArchiver @Grab(group='org.codehaus.plexus', module='plexus-container-default', version='1.6') import org.codehaus.plexus.logging.console.ConsoleLogger @Grab(group = 'org.eclipse.jetty', module = 'jetty-runner', version = '9.3.7.RC1' ) import org.eclipse.jetty.runner.Runner def gitblit = new File(MavenClassLoader.using('http://gitblit.github.io/gitblit-maven').resolveArtifact('com.gitblit:gitblit:war:1.7.1').getFile()) File gitblitDirectory = new File(System.getProperty('user.home'), gitblit.getName().replace('.war','')) if(!gitblitDirectory.exists()){ gitblitDirectory.mkdir() ZipUnArchiver unArchiver = new ZipUnArchiver() unArchiver.setSourceFile(gitblit) unArchiver.enableLogging(new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG,"Logger")) unArchiver.setDestDirectory(gitblitDirectory) unArchiver.extract() def dataPath = new File(System.getProperty('user.home'), '.gitblit_data') if(!dataPath.exists()){ dataPath.mkdir() } def webXml = new File(gitblitDirectory.getAbsoluteFile(), 'WEB-INF/web.xml') webXmlText = webXml.text webXml.withWriter { w -> w << webXmlText.replace('${contextFolder}/WEB-INF/data', dataPath.getAbsolutePath()) } } Runner.main([gitblitDirectory] as String[])
      
      





悪魔の作成と作業の例を含むスクリーンキャストを見ることができます。







デーモンとスクリプトを作成して、1つのコマンドだけでアプリケーションを構築できます。



All Articles