既存のJavaアプリケーションにsshサーバーを埋め込む方法を説明します。これにより、端末でhabrahabrを使用して最高の記事を表示できます。 これはほんの一例ですが、それに基づいて、ソースコードを変更したりアプリケーションを再構築したりすることなく、プログラムを管理し、コマンドを使用して動作を拡張するための追加ツールを入手できます。
記事の最後に作品のスクリーンキャストを見ることができます。
sshサーバーとして、 RaSHを使用します -これはJavaシェル実装の1つです。 ssh / telnetプロトコルを使用してコマンドを実行し、groovyで新しいコマンドを作成できる既製のコマンドセットを含むjavaプロセスでサーバーを作成できます。 すぐに使えるJMXの操作、データベースへのアクセス、Javaストリーム、ヒープの監視、ロギングレベルの変更のための既製のコマンドがあります。
このプロジェクトは、Spring Boot、Mulesoft Enterprise Service Bus、Play Framework、Vert.xを使用している場合に馴染みがあるかもしれません。 企業のJavaレガシーに組み込むこともできます!
それでは、コマンドの実装から始めましょう 実装はgroovyで書かれています。 Javaに精通している人にとっては、新しい実装を書くことは難しくありません。
Habrのコマンドをファイルsonarqube-5.1.2 / cmd / habrahabrShell.groovyに保存しましょう。
import org.crsh.cli.Usage import org.crsh.cli.Command import org.crsh.cli.Argument import org.crsh.cli.Required @Usage("Example for habrahabr") class habrahabrShell { @Usage("Display best topics from habrahabr") @Command public void displayBest() { def feedContent = "http://habrahabr.ru/rss/best/".toURL().text def rss = new XmlSlurper().parseText(feedContent) rss.channel.item.each{ out << "$it.title [$it.link]\n" } } @Usage("Say hello") @Command public void sayHello(@Required @Argument String message) { out << "Hello habrahabr $message" } }
シェルは、クラス名ではなくファイル名に基づいてコマンド名を使用することに注意してください。 @Usageアノテーションにより、CRaSHはコマンドとそのパラメーターのヘルプを出力できます。 コンソールにパラメーターを指定してHello habrahabrを表示するこのコマンドは、特に有用ではなく、やる気を起こさせる効果があり、コマンドの作成が非常に簡単であることを示しています。 displayBestコマンドの実装はより困難です。toURL()を使用してrssフィードのコンテンツを取得します。テキスト、XmlSlurper()で解析し、ParseText()を使用して、その日のベスト記事とそれらへのリンクのリストをコンソールに出力し、フィードの要素を繰り返し処理します。
実験的なCRaSHアプリケーションはSonarQubeのままです。 それをダウンロードし、構成し、エージェントでaspectjを詰める方法は、前の記事で詳細に説明されていました。 -javaagent構成は変更せずに残し、org.aspectj.weaver.loadtime.configurationで新しい構成スクリプトファイルを指定します:ファイル:/home/igor/dev/projects/sonar-demo/scripts/shell-console.xml
shell-console.xmlファイルの内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <configuration> <aspects> <name>com.github.igorsuhorukov.rashubSsh</name> <type>AFTER</type> <pointcut>execution(* org.sonar.server.app.WebServer.start(..))</pointcut> <artifacts> <artifact>org.crashub:crash.connectors.ssh:1.3.1</artifact> <classRefs> <variable>Bootstrap</variable> <className>org.crsh.standalone.Bootstrap</className> </classRefs> <classRefs> <variable>Builder</variable> <className>org.crsh.vfs.FS$Builder</className> </classRefs> <classRefs> <variable>ClassPathMountFactory</variable> <className>org.crsh.vfs.spi.url.ClassPathMountFactory</className> </classRefs> <classRefs> <variable>FileMountFactory</variable> <className>org.crsh.vfs.spi.file.FileMountFactory</className> </classRefs> </artifacts> <process> <expression> classLoader = Bootstrap.getClassLoader(); classpathDriver = new ClassPathMountFactory(classLoader); otherCmd = new FileMountFactory(new java.io.File(System.getProperty("user.dir"))); cmdFS = new Builder().register("classpath", classpathDriver).register("file", otherCmd).mount("classpath:/crash/commands/").mount("file:cmd/").build(); confFS = new Builder().register("classpath", classpathDriver).mount("classpath:/crash/").build(); bootstrap = new Bootstrap(classLoader, confFS, cmdFS); config = new java.util.Properties(); config.put("crash.ssh.port", "2000"); config.put("crash.ssh.auth_timeout", "300000"); config.put("crash.ssh.idle_timeout", "300000"); config.put("crash.auth", "simple"); config.put("crash.auth.simple.username", "admin"); config.put("crash.auth.simple.password", "admin"); bootstrap.setConfig(config); bootstrap.bootstrap(); //bootstrap.shutdown(); </expression> </process> </aspects> </configuration>
この構成により、エージェントはorg.sonar.server.app.WebServerクラスのstart()メソッドを実行した後、org.crashub:crash.connectors.ssh:1.3.1アーティファクトをMavenリポジトリからダウンロードし、サーバーを構成して、bootstrap.bootstrapを呼び出して起動できます。 ()。 サーバーは、mount( "file:cmd /")で初期化するときに指定したcmdディレクトリでコマンドを見つけます。 さて、認証は設定したユーザー名とパスワードadmin / adminを使用し、sshサーバーはポート2000をリッスンします-put( "crash.ssh.port"、 "2000")
これはMVEL- AspectJスクリプトエージェントと対応する構成を使用するjavaのようなスクリプトで実装されます。 中央のMavenリポジトリで利用可能なエージェント
9月9日、モスクワで、アスペクト指向プログラミングに関する公開セッションが開催されます。 ハブでレポート資料を公開した後、入場は無料です 登録openevent9sept2015.questionpro.com
この記事のすべての魔法は、 アスペクト指向プログラミングを使用して実装され、habrahabrShell.groovyとshell-console.xmlの2つのファイルと、jvmエージェントを指定するパラメーターのみで構成されています。 簡単じゃないですか!?