Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring tools4

5,745 views

Published on

2018/10/31 Spring Fest 2018@KFC Hall & Rooms の発表に使用した資料です.

Published in: Engineering
  • Be the first to comment

Spring tools4

  1. 1. Copyright©2018 NTT corp. All Rights Reserved. Spring Tools 4 の機能とその実装 2018年10月31日 岩塚 卓弥,堅田 淳也 NTTソフトウェアイノベーションセンタ
  2. 2. 2Copyright©2018 NTT corp. All Rights Reserved. • 名前:岩塚 卓弥 • 所属:NTT ソフトウェアイノベーションセンタ • NTTの研究所のうちソフトウェアを専門に扱う • 自部署ではソフトウェア工学を研究 • Springベースのグループ共通フレームワークの整備を担当 • Spring関連: • Spring I/O, SpringOne それぞれ2015年から参加 • 改訂新版 Spring入門,Spring徹底入門 レビュアー • JSUG幹事 自己紹介 • 名前:岩塚 卓弥 • 所属:NTT ソフトウェアイノベーションセンタ • NTTの研究所のうちソフトウェアを専門に扱う • 自部署ではソフトウェア工学を研究 • Springベースのグループ共通フレームワークの整備を担当 • Spring関連: • Spring I/O, SpringOne それぞれ2015年から参加 • 改訂新版 Spring入門,Spring徹底入門 レビュアー • JSUG幹事
  3. 3. 3Copyright©2018 NTT corp. All Rights Reserved. • 名前:堅田 淳也 • 所属:NTT ソフトウェアイノベーションセンタ • NTTの研究所のうちソフトウェアを専門に扱う • 自部署ではソフトウェア工学を研究 • Springベースのグループ共通フレームワークの整備を担当 • Spring経験 • 元SIerで、プロジェクトへのSpring適用支援などを担当 • SpringOne(2017, 2018)、Spring I/O(2018)に参加 自己紹介
  4. 4. 4Copyright©2018 NTT corp. All Rights Reserved. 1. 概要編 • Spring Tools 4 の概要、新機能、削除された機能等の紹介 2. 実装編 • Spring Tools 4 の内部実装と動作についての紹介 今日話すこと
  5. 5. 5Copyright©2018 NTT corp. All Rights Reserved. 概要編 Spring Tools 4 の機能とその実装
  6. 6. 6Copyright©2018 NTT corp. All Rights Reserved. • EclipseベースのSpring向け統合開発環境 • 長い歴史 • STSのコア要素である Spring IDE プラグインは 2005年に初版リリース • Spring 1.x の時代 • 今日までSpringやEclipseのバージョンアップに追随 Spring Tool Suite (STS)
  7. 7. 7Copyright©2018 NTT corp. All Rights Reserved. • IDE/エディタの多様化 • 一昔前まではみんなEclipse • 有料でも良いツールが選択されるようになってきた • 軽量なソースコードエディタが増えてきた • Springアプリ開発の変化 • Spring Bootが当たり前のように使われるようになってきた • 動的コンフィギュレーションが多用されるため、ソースコードの静 的解析のみでは限界 STS を取り巻く環境の変化 時代の変化に対応した新しいツールが必要
  8. 8. 8Copyright©2018 NTT corp. All Rights Reserved. • 2018/9/25 リリース Spring Tools 4 GA released
  9. 9. 9Copyright©2018 NTT corp. All Rights Reserved. • ほぼスクラッチから再実装 • Spring Boot + アノテーション設定による 開発スタイルのサポートにフォーカス • 素のSpring開発ではほとんど恩恵を受けれない • IDE非依存なアーキテクチャの採用 • 多様なIDE/エディタに対応可能 Spring Tools 4 (aka STS4)
  10. 10. 10Copyright©2018 NTT corp. All Rights Reserved. • 3つのIDE/エディタに対応 Spring Tools 4 (aka STS4) Spring Tools 4 for Eclipse Spring Tools 4 for Visual Studio Code Spring Tools 4 for Atom IDE • 追加パッケージとして インストール • Extension Packと してインストール • オールインワン形式をダ ウンロードして利用 or • プラグインとして既存 Eclipseにインストール
  11. 11. 11Copyright©2018 NTT corp. All Rights Reserved. • Navigation • Springに特化した新しいシンボル検索 • Live Application Information • 実行中のSpring Bootアプリの情報を表示 新機能 注意: 新機能が使えるのはSpring Bootアプリのみ 素のSpringアプリでは機能しません !
  12. 12. 12Copyright©2018 NTT corp. All Rights Reserved. • Springに関連する要素をワークスペース or ソースフ ァイル内から手軽に検索 新機能 - Navigation Eclipseの場合 Ctrl(Cmd) + 6
  13. 13. 13Copyright©2018 NTT corp. All Rights Reserved. • 検索する要素ごとに専用のプレフィクスがある • e.g. Beanを検索するときは “@+xxxx” (xxxxはBean ID) • 検索できるもの 1. Spring関連のアノテーション 2. Bean IDによるBean検索 (@+) 3. RequestMappingのパス情報 (@/) 4. 実行中のSpring Bootアプリのエンドポイント (//) • spring-boot-actuatorが必要 5. Spring Cloud FunctionのFunction (@>) • まだプロトタイプ実装の扱い 新機能 - Navigation
  14. 14. 14Copyright©2018 NTT corp. All Rights Reserved. 1. Springのアノテーション検索 • “@xxxx” と入力 (xxxxはアノテーション名) 新機能 - Navigation
  15. 15. 15Copyright©2018 NTT corp. All Rights Reserved. 2. Bean検索 • “@+xxxx” と入力 (xxxxはBean ID) 新機能 - Navigation Spring Data で生成されるRepository でも検索可能
  16. 16. 16Copyright©2018 NTT corp. All Rights Reserved. 3. RequestMapping検索 • “@/xxxx” と入力 (xxxxはパス) 新機能 - Navigation
  17. 17. 17Copyright©2018 NTT corp. All Rights Reserved. 4. 実行中のSpring Bootアプリケーションのエンドポ イント • “//” と入力すると全エンドポイントが表示 • spring-boot-actuator が必須 新機能 - Navigation
  18. 18. 18Copyright©2018 NTT corp. All Rights Reserved. • 実行中のSpring Bootアプリの情報を表示 • ローカルで実行中のSpring Bootアプリを自動的に検出し、各 情報をソースコード上のマウスオーバーなどで表示する • spring-boot-actuator が必須 • 確認できる内容 1. Live Request Mappings 2. Live Bean Information 3. Conditional Beans Information 4. Live Active Profiles Information • 表示方法 • マウスオーバー • コードレンズ • Atomは非対応 新機能 - Live Application Information
  19. 19. 19Copyright©2018 NTT corp. All Rights Reserved. 新機能 - Live Application Information Live Request Mappingsの表示(マウスオーバー) 動作中のアプリの実際のURLリンクが 表示
  20. 20. 20Copyright©2018 NTT corp. All Rights Reserved. 新機能 - Live Application Information → OwnerController このBeanをインジェクションし ているBeanが表示される ← OwnerRepository このBeanがインジェクションし ているBeanが表示される Live Bean Informationの表示 (マウスオーバー)
  21. 21. 21Copyright©2018 NTT corp. All Rights Reserved. 新機能 - Live Application Information 条件付きBean定義の各条件が合 致したかどうか分かる Conditional Beans Informationの表示 (マウスオーバー)
  22. 22. 22Copyright©2018 NTT corp. All Rights Reserved. 新機能 - Live Application Information Live Active Profiles Informationの表示 (マウスオーバー) 有効になっているプロファイルが ハイライトされる 有効になっているプロファイルが表示
  23. 23. 23Copyright©2018 NTT corp. All Rights Reserved. • コードレンズ • ソースコード上に情報の1行サマリを表示する • マウスオーバーと違い、ソースコード上に常に表示 • Live Request Mappings と Live Bean Information のみ対応 • デフォルトでは無効になっている(Eclipseの場合) • Atomは未対応 新機能 - Live Application Information Live Request Mappings の サマリ情報を常に表示 Live Request Mappings の表示 (コードレンズ)
  24. 24. 24Copyright©2018 NTT corp. All Rights Reserved. 新機能 - Live Application Information Live Bean Informationの サマリ情報を常に表示 Live Bean Information の表示(コードレンズ)
  25. 25. 25Copyright©2018 NTT corp. All Rights Reserved. • Boot Dashboard • Spring Bootアプリの起動/停止 • Spring Starter Wizard • Spring Initializr からSpring Boot アプリの雛形を生成 • application.properties(.yml) の編集サポート • プロパティ名の補完 • バリデーション • プロパティ情報のマウスオーバー表示 • application.propertiesをyml形式へ変換 • RequestMappingのコードスニペット補完 • Import Getting Started Content Wizard • Spring公式のチュートリアルガイドのサンプルをワークス ペースにインポート • Quick Search • ワークスペースからテキストを素早く検索するダイアログ • Ctrl(cmd) + Shift + L STS3から継続して使える機能
  26. 26. 26Copyright©2018 NTT corp. All Rights Reserved. • Request Mapping View • @RequestMappingのパス情報のリストを表示するビュー • 新機能 ”Navigation” で代替可能 • Live Beans Graph View • 実行中のアプリのBean依存関係をグラフ表示するビュー • STS4ではグラフ表示はできないが、”Live Application Information”でBeanの依存関係は確認可能 • Spring XML config support • Bean IDの自動補完、Beanのクラス名の補完、など • STS4では代替機能なし • Spring XML config validations • 参照先に指定されたBeanが存在しない場合に警告を出す、など • STS4では代替機能なし STS4で削除された機能
  27. 27. 27Copyright©2018 NTT corp. All Rights Reserved. STS3 Features in STS4 • どうしてもSTS3のコンポーネントを使いたい場合… • リポジトリの奥底に眠る古いXMLベースのアプリをメンテしな ければならない • 謎の圧力によってSpring Bootの利用が禁止されている • 選択肢 1. STS3を使い続ける 2. STS3のコンポーネントをSTS4にインストールする • 強くは推奨しないがサポートはされている (by 公式wiki) • Eclipse MarketplaceからSpring Tools 3 Add-onをインストー ル STS 3.9.x は2019年の中頃までメンテナンス予定 → それ以降は新しいEclipseへの対応は実施されない
  28. 28. 28Copyright©2018 NTT corp. All Rights Reserved. • Spring Tools 4 • Eclipse / VS Code / Atom に対応 • Spring Boot のアプリにフォーカス • 新機能 • Navigation • Live Application Information • マウスオーバー / コードレンズ • Spring Bootではなく、素のSpringを使う場合は… • STS3を使い続ける or STS3をSTS4にインストール • STS3は2019年の中頃までメンテナンス予定 ここまでのまとめ
  29. 29. 29Copyright©2018 NTT corp. All Rights Reserved. 実装編 Spring Tools 4 の機能とその実装
  30. 30. 30Copyright©2018 NTT corp. All Rights Reserved. STS4はLanguage Serverとして機能を提供することで 複数のIDE・エディタに対応している 複数のIDE・エディタへの対応 Visual Studio Code Language Server として 別プロセスで動作 IDE/エディタの拡張機能を利用 Language Server Protocol
  31. 31. 31Copyright©2018 NTT corp. All Rights Reserved. STS4 のリポジトリ Language Server 本体のコード等
  32. 32. 32Copyright©2018 NTT corp. All Rights Reserved. STS4 のリポジトリ Atomクライアント用のコード等 eclipseクライアント用のコード等 VSCodeクライアント用のコード等
  33. 33. 33Copyright©2018 NTT corp. All Rights Reserved. STS4 のリポジトリ 未対応 未対応
  34. 34. 34Copyright©2018 NTT corp. All Rights Reserved. ? ? そんなものはない
  35. 35. 35Copyright©2018 NTT corp. All Rights Reserved. • Eclipse LSP4J Java による Language Server / Client 実装のためのライブラリ • Eclipse LSP4E Eclipse用の Language Client を実装するためのライブラリ • Eclipse JDT Language Server Java / Maven / Gradle プロジェクトをサポートする Language Server • Language support for Java for Visual Studio Code Eclipse JDT Language Server の VSCode用の Language Client • VSCode Language Server - Client Module VSCode用の Language Client を実装するためのライブラリ • Atom Language Server Protocol Client Atom用の Language Client を実装するためのライブラリ STS4 を支える技術 https://github.com/eclipse/lsp4j https://projects.eclipse.org/projects/technology.lsp4e https://github.com/redhat-developer/vscode-java https://github.com/atom/atom-languageclient https://github.com/eclipse/eclipse.jdt.ls https://github.com/Microsoft/vscode-languageserver-node/tree/master/client for for for
  36. 36. 36Copyright©2018 NTT corp. All Rights Reserved. STS4はLanguage Serverとして機能を提供することで 複数のIDE・エディタに対応している 【再掲】複数のIDE・エディタへの対応 Visual Studio Code Language Server として 別プロセスで動作 IDE/エディタの拡張機能を利用 Language Server Protocol
  37. 37. 37Copyright©2018 NTT corp. All Rights Reserved. Microsoftが策定した,プログラム解析器 (Language Server) とそれを利用するツール間で会話するためのプ ロトコル - https://langserver.org LSPを利用するメリット 1. 一つの Language Server だけで複数のクライアント に対応できる 2. クライアントの実装言語とは独立して Language Server を実装できる 3. Language Server が不安定な挙動をしてもクライア ントが引きずられずに済む Language Server Protocol (LSP) 概要
  38. 38. 38Copyright©2018 NTT corp. All Rights Reserved. JSON-RPC を利用したメッセージを送り合うシンプルなプロトコル • Request Message:クライアント/サーバ間のリクエスト • Response Message:Request Messageへのレスポンス • Notification Message:レスポンス不要のメッセージ LSP の仕様 Content-Length: 74 { “jsonrpc”:”2.0”, ”id”:4, ”method”:”workspace/symbol”, ”params”:{“query”:””} } Request Message の例: Header Part Content Part JSON-RPC Object 詳細は https://microsoft.github.io/language-server-protocol/specification 参照のこと
  39. 39. 39Copyright©2018 NTT corp. All Rights Reserved. 設定で Language Server とのやり取りを出力できるVSCode拡張も あるが,STS4は非対応 LSP のメッセージを覗いてみる Java Extension の場合: 拡張の設定 トレースログ
  40. 40. 40Copyright©2018 NTT corp. All Rights Reserved. LSP のメッセージを覗いてみる DEMO
  41. 41. 41Copyright©2018 NTT corp. All Rights Reserved. • VSCode では STS4 とのメッセージはTCPで送受信される • localhost内のTCPパケットをキャプチャすることでメッセージを 取得できる TCPパケットのキャプチャによるメッセージの取得 WireSharkによるパケットのキャプチャ: Loopback クライアントが45556ポート LSP のメッセージ
  42. 42. 42Copyright©2018 NTT corp. All Rights Reserved. TCPパケットのキャプチャによるメッセージの取得 DEMO
  43. 43. 43Copyright©2018 NTT corp. All Rights Reserved. 標準入出力のキャプチャによるメッセージの取得 • Eclipse では STS4 とのメッセージは標準入出力を介して送受信される • プロセスの標準入出力をキャプチャすることでメッセージを取得できる Language Server プロセスの標準入出力のキャプチャ: 標準入力(Client → Server) 標準出力(Server → Client)
  44. 44. 44Copyright©2018 NTT corp. All Rights Reserved. 標準入出力のキャプチャによるメッセージの取得 DEMO
  45. 45. 45Copyright©2018 NTT corp. All Rights Reserved. Navigation機能使用時のメッセージ Client Client “method”:”workspace/symbol” “param”:{“query”:”xxx”} Array of SymbolInformation “method”:”textDocument/documentSymbol” “param”:{“textDocument”:{”uri”:”file://...”}} Array of SymbolInformation プロジェクト内 ファイル内
  46. 46. 46Copyright©2018 NTT corp. All Rights Reserved. SymbolInformationの作成 010 010 010 ① ② 1. プロジェクトから javaファイルを探索 2. javaファイルとclasspath上のファイルからAST(抽象構文 木)を作成 3. ASTをたどりながらSymbolを探索 • 種別ごとに定義されたSymbolProviderにより SymbolInformationを取得 • @Bean / @RequestMapping / @Component … • 取得したSymbolから以下を作成 • プロジェクト全体のSymbolInformationのリスト • ファイル名からSymbolInformationのリストへのMap J ③ プロジェクトのオープン時に一覧を作成しており,即時提要可能 J
  47. 47. 47Copyright©2018 NTT corp. All Rights Reserved. 【特例】“query”:“//” Client “method”:”workspace/symbol” “params”:{“query”:”//”} Array of SymbolInformation running Spring Boot Apps JMX 要 Actuator取得したホスト,ポート番号, RequestMappingのパスからURLを組み立てる //から始まるqueryの場合,実行中のSpring Boot アプリケーションか ら JMXを用いてRequestMapping情報を取得 初回リクエスト時に多少のオーバヘッドが発生
  48. 48. 48Copyright©2018 NTT corp. All Rights Reserved. Live Application Informationの表示 Client “method” : “sts/highlight” “params” : {“doc”:…, “codeLenses”:[…]} running Spring Boot Apps JMX 要 Actuator 定期的に取得した情報を Language Server から通知 実行中のSpring Boot アプリケーションからJMXを用いて情報を取得 バックグラウンドでポーリングを続けるので,継続的に一定のリソースを消費する 開いているファイルについてのハイライトとCodeLensの情報を通知 リクエストはしない ポーリング
  49. 49. 49Copyright©2018 NTT corp. All Rights Reserved. • Serverという名がつくものはとりあえず繋いでみたく なるはず → やってみた • 手順 1. Language Server をデバッグ用のスタンドアローンモード で起動 • TCP の 5007 ポートで待受 2. TCPで初期化リクエストのメッセージを送る • 予めキャプチャしておいた正規のリクエストを利用 3. Language Server からのリクエストにレスポンスする • 一部動的な要素あり 4. Symbol取得のリクエストを送る おまけ1:Language Server に接いでみる
  50. 50. 50Copyright©2018 NTT corp. All Rights Reserved. おまけ1:Language Server に接いでみる DEMO
  51. 51. 51Copyright©2018 NTT corp. All Rights Reserved. TCPで初期化リクエストのメッセージを送る … LSPの仕様で定められた初期化リクエスト クライアントの機能の対応状況を送る Initialize Request(Client → Server) Response (Server → Client) … Initialized Notification(Client → Server)
  52. 52. 52Copyright©2018 NTT corp. All Rights Reserved. Language Server からのリクエストにレスポン スする addClasspathListener Request (Server → Client) STS4独自のリクエスト ランダム値 Response (Client → Server) … Callback Command (Client → Server) Serverから送られてきた値 Classpathのエントリを送る
  53. 53. 53Copyright©2018 NTT corp. All Rights Reserved. Symbol取得のリクエストを送る symbol Request(Client → Server) Response (Server → Client) … 正しく接続できていればリクエストに応じた結果が返ってくる
  54. 54. 54Copyright©2018 NTT corp. All Rights Reserved. Serverという名がつくものにはとりあえずクライアント を作ってみたくなるはず → 作ってみた Spring Shell と Eclipse LSP4J を利用したCLIのクライアント • 対応機能 • Symbolの取得 • プロジェクト内 • ファイル内 • 実行中のSpring Boot ApplicationのRequestMapping • Live Application Information によるハイライト おまけ2:クライアントを実装してみた
  55. 55. 55Copyright©2018 NTT corp. All Rights Reserved. おまけ2:クライアントを実装してみた DEMO
  56. 56. 56Copyright©2018 NTT corp. All Rights Reserved. Symbolの取得 プロジェクト内のSymbol取得 ファイル内のSymbol取得
  57. 57. 57Copyright©2018 NTT corp. All Rights Reserved. Symbolの取得 生データを出力して確認
  58. 58. 58Copyright©2018 NTT corp. All Rights Reserved. Symbolの取得 実行中のSpring Boot ApplicationのRequestMapping取得
  59. 59. 59Copyright©2018 NTT corp. All Rights Reserved. ハイライト Live Application Information によるハイライト CodeLens
  60. 60. 60Copyright©2018 NTT corp. All Rights Reserved. • Language Server Protocol • 一つの実装で複数のIDE/エディタに機能を提供 • 今後さらに対応が広がる可能性も • Navigation の実装・動作 • プロジェクトを開いた時点でNavigation先を解析 • 実行中のSpring BootアプリのエンドポイントはJMXで収集 • Live Application Information の実装・動作 • JMXで定期的に情報を収集 • Language Server から一方的に通知 実装編まとめ

×