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

この記事は「[Visual Studio Code Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vscode)」2日目のエントリです。昨日は[@tempakyousuke](https://qiita.com/tempakyousuke)さんの「[僕の考えた最強のキーバインドチートシート（VSCode）](https://qiita.com/tempakyousuke/items/d2818e0c2cb2212f3835)」でした。

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

使っている中で**「そういえば、なんでVS CodeでJavaのデバッグとかできるんだろう？拡張機能の中ってどうなっているの？」**とふと疑問が沸いてきたので調べてみました。その中ではじめて**[LSP(Language Server Protocol)](https://microsoft.github.io/language-server-protocol/)**や**[DAP(Debug Adapter Protocol)](https://microsoft.github.io/debug-adapter-protocol/)**を知り、[Eclipse JDT Language Server](https://projects.eclipse.org/proposals/jdt-language-server)や[Eclipse LSP4J](https://projects.eclipse.org/proposals/eclipse-lsp4j)なるものがあることにたどり着きました。日本語の情報があまりなかったのでまとめてみます。

# Visual Studio Codeの拡張機能(Extensions)
VS Codeは拡張機能(Extensions)によって様々な用途に使えます。Javaの開発をする場合も拡張機能を使います。
https://marketplace.visualstudio.com/VSCode
[![2018-10-28_17h41_05.png](https://qiita-image-store.s3.amazonaws.com/0/47737/ada053fd-61c8-2806-8161-2ace9f0cd260.png)](https://marketplace.visualstudio.com/VSCode)
VSCodeの拡張機能の構成は次のページで解説されています。
https://code.visualstudio.com/docs/extensions/overview

プログラミング言語の拡張機能を作る場合に重要なのが**[Language Server](https://code.visualstudio.com/docs/extensions/example-language-server)**と**[Debug Adapter](https://code.visualstudio.com/docs/extensions/example-debuggers)**の2つで、それぞれ**[LSP(Language Server Protocol)](https://microsoft.github.io/language-server-protocol/)**と**[DAP(Debug Adapter Protocol)](https://microsoft.github.io/debug-adapter-protocol/)**として、Microsoftが中心となって仕様を定めています。


[![2018-10-28_16h00_40.png](https://qiita-image-store.s3.amazonaws.com/0/47737/5e275993-05bb-a14d-2af6-adf3637a754c.png)](https://marketplace.visualstudio.com/VSCode)

# LSP(Language Server Protocol)

[LSP](https://microsoft.github.io/language-server-protocol/)はMicrosoftが[2016年6月27日にサンフランシスコで開催されたRed Hat Summit and DevNation](https://www.redhat.com/en/about/press-releases/red-hat-codenvy-and-microsoft-collaborate-language-server-protocol)で[Red Hat](https://www.redhat.com/en)、[Codenvy](https://codenvy.com/)[^1]と[仕様を発表](https://code.visualstudio.com/blogs/2016/06/27/common-language-protocol)したものです。オートコンプリートや定義への移動、参照検索などを提供するLanguage Serverとエディタ/IDEとの間でやりとりするためのプロトコルで、JSON-RPCベースとなっています。日本語の記事としては、「[language server protocolについて (前編)](https://qiita.com/atsushieno/items/ce31df9bd88e98eec5c4)」がかなり詳しいです。

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

![2018-12-02_15h00_51.png](https://qiita-image-store.s3.amazonaws.com/0/47737/001d1c85-4220-4eff-1350-bb220df9eafc.png)
[実装は一覧](https://microsoft.github.io/language-server-protocol/implementors/servers/)でまとまっていて、Javaは現在2つ掲載されています。

![2018-10-28_15h53_45.png](https://qiita-image-store.s3.amazonaws.com/0/47737/47a0505a-9bdb-438c-b51e-420842871d36.png)

# DAP(Debug Adapter Protocol)

[DAP](https://microsoft.github.io/debug-adapter-protocol/)はデバッガの機能を抽象化したプロトコルで、DAPを利用することで次のような共通化を図ることを狙いとしています。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/47737/59cf77a7-1971-f691-9fbc-ab608013363e.png)

[実装はLSP同様に一覧](https://microsoft.github.io/debug-adapter-protocol/implementors/adapters/)でまとまっていて、Javaは現在「[Debugger for Java](https://github.com/Microsoft/vscode-java-debug)」があります。
![2018-10-28_15h54_02.png](https://qiita-image-store.s3.amazonaws.com/0/47737/62b88a2e-e850-3a82-96c5-70d779590dd3.png)

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

VSCodeでJavaの開発を行う場合、いくつかの選択肢がありますが、Microsoftが出している[Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)を使うのが最もポピュラーな方法です。
https://code.visualstudio.com/docs/java/extensions
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/47737/068917c2-9018-d89b-621c-99c09cfd6e04.png)](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)
Java Extension Packをインストールすると次の4つの拡張機能がインストールされ、LSPやDAPの実装を使う環境が整います。

- [Language Support for Java(TM) by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java)
- [Debugger for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug)
- [Java Test Runner](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-test)
- [Maven for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-maven)

一番上の「[Language Support for Java(TM) by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java)」はEclipse Foundationで開発している[Eclipse JDT Language Server](https://projects.eclipse.org/proposals/jdt-language-server)を提供するもので、次の4つのパッケージをもとに成り立っています。

- [Eclipse LSP4J](https://github.com/eclipse/lsp4j)…LSPのJava向けの実装
- [Eclipse JDT](http://www.eclipse.org/jdt/)…JDTはJava Development Toolsの略語でコード補完などの機能を提供
- [M2Eclipse](http://www.eclipse.org/m2e/)…Mavenのサポート
- [Buildship](https://github.com/eclipse/buildship)…Gradleのサポート

個人的にはEclipse FoundationがLSPを出しているのが非常に興味深いです。先日[JJUG](http://www.java-users.jp/)の[ナイトセミナーでEclipse Foundation代表のMike Milinkovichさん](https://jjug.doorkeeper.jp/events/81353)がJakarta EEの話をされたのですが、その前段でEclipseなどIDEについて話した際に「LSP知ってる人？」と聞いていたのですが（ほとんど手があがりませんでしたが…）、VSCodeの裏側に関わっていたのですね。

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

[LSP4JでLanguage Server Protocol入門](https://qiita.com/minebreaker/items/c53e4dddb0709492d362)

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

[Eclipse LSP4J](https://projects.eclipse.org/projects/technology.lsp4j/who)
![2018-12-02_15h30_59.png](https://qiita-image-store.s3.amazonaws.com/0/47737/64e0bc67-9784-57d2-f1e4-bef637acbd4a.png)

[Eclipse JDT](https://projects.eclipse.org/projects/eclipse.jdt)
![2018-12-02_15h30_50.png](https://qiita-image-store.s3.amazonaws.com/0/47737/8e54b2e9-4885-248d-ed52-cb9db28c18b5.png)

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

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