Java
VSCode
VisualStudioCode
LSP
LSP4J

なぜVisual Studio CodeでJavaの開発ができるのか?

この記事は「Visual Studio Code Advent Calendar 2018」2日目のエントリです。昨日は@tempakyousukeさんの「僕の考えた最強のキーバインドチートシート(VSCode)」でした。

最近、Javaを書くときはVisual Studio Code(以降、VS Code)をIDEとして利用しています。一番の理由は軽量という点で、機能的にはまだまだEclipse、IntelliJ IDEA、NetBeansに届かない部分がありますが、最低限の機能は備えています。また、Visual Studio IntelliCodeがJavaに対応するなど、新しい機能開発も盛んで、今後が期待できます。

使っている中で「そういえば、なんでVS CodeでJavaのデバッグとかできるんだろう?拡張機能の中ってどうなっているの?」とふと疑問が沸いてきたので調べてみました。その中ではじめてLSP(Language Server Protocol)DAP(Debug Adapter Protocol)を知り、Eclipse JDT Language ServerEclipse LSP4Jなるものがあることにたどり着きました。日本語の情報があまりなかったのでまとめてみます。

Visual Studio Codeの拡張機能(Extensions)

VS Codeは拡張機能(Extensions)によって様々な用途に使えます。Javaの開発をする場合も拡張機能を使います。
https://marketplace.visualstudio.com/VSCode
2018-10-28_17h41_05.png
VSCodeの拡張機能の構成は次のページで解説されています。
https://code.visualstudio.com/docs/extensions/overview

プログラミング言語の拡張機能を作る場合に重要なのがLanguage ServerDebug Adapterの2つで、それぞれLSP(Language Server Protocol)DAP(Debug Adapter Protocol)として、Microsoftが中心となって仕様を定めています。

2018-10-28_16h00_40.png

LSP(Language Server Protocol)

LSPはMicrosoftが2016年6月27日にサンフランシスコで開催されたRed Hat Summit and DevNationRed HatCodenvy1仕様を発表したものです。オートコンプリートや定義への移動、参照検索などを提供するLanguage Serverとエディタ/IDEとの間でやりとりするためのプロトコルで、JSON-RPCベースとなっています。日本語の記事としては、「language server protocolについて (前編)」がかなり詳しいです。

2018-12-02_15h00_51.png
実装は一覧でまとまっていて、Javaは現在2つ掲載されています。

2018-10-28_15h53_45.png

DAP(Debug Adapter Protocol)

DAPはデバッガの機能を抽象化したプロトコルで、DAPを利用することで次のような共通化を図ることを狙いとしています。
図1.png

実装はLSP同様に一覧でまとまっていて、Javaは現在「Debugger for Java」があります。
2018-10-28_15h54_02.png

Java Extension PackでEclipse JDT Language ServerやDebugger for Javaが入る

VSCodeでJavaの開発を行う場合、いくつかの選択肢がありますが、Microsoftが出しているJava Extension Packを使うのが最もポピュラーな方法です。
https://code.visualstudio.com/docs/java/extensions
image.png
Java Extension Packをインストールすると次の4つの拡張機能がインストールされ、LSPやDAPの実装を使う環境が整います。

一番上の「Language Support for Java(TM) by Red Hat」はEclipse Foundationで開発しているEclipse JDT Language Serverを提供するもので、次の4つのパッケージをもとに成り立っています。

個人的にはEclipse FoundationがLSPを出しているのが非常に興味深いです。先日JJUGナイトセミナーでEclipse Foundation代表のMike MilinkovichさんがJakarta EEの話をされたのですが、その前段でEclipseなどIDEについて話した際に「LSP知ってる人?」と聞いていたのですが(ほとんど手があがりませんでしたが…)、VSCodeの裏側に関わっていたのですね。

今回のアドベントカレンダーに向けてLSP4Jを少し触ってみようと思ったのですが、時間が足りず…。以下の記事でとても詳しく書かれていたので、興味ある方は是非お試しください。

LSP4JでLanguage Server Protocol入門

EclipseページでLSP4JとJDTのActive Member Companiesをみるとそれぞれ次のようになっていました。

Eclipse LSP4J
2018-12-02_15h30_59.png

Eclipse JDT
2018-12-02_15h30_50.png

どちらもTypeFoxが入っていて、LSP4JのProject Lead2名(Miro Spönemann,Sven Efftinge)もTypeFoxの人でした。どんな会社なんだろうと調べたら、IDEなどの開発ツール等に力を入れている企業で、GitHubOnline IDE Gitpodを出している会社なのですね。サイトをみてたらEclipse Theiaというのがあって、かなり良さそうだなと思ったのですが意外と日本語情報が少ない…この辺りも調べてみたいです。

最後少し脱線してしまいましたが、VSCodeでJava開発がなぜできるのか?について調べてみました。


  1. 2017年5月にCodenvyはRed Hatによって買収され、そのRed Hatは今年IBMに買収されたので、現在はIBM配下…?