読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

Eclipse4.5 "Mars"の新機能一覧

Eclipse

毎年恒例のイベントがそろそろやって参ります。

おそらくメインページは http://eclipse.org/mars/ になるはずですが、この記事を書いた2015-05-29時点は404になります。

ちなみに前回の記事はこちら。

Eclipse4.4 "Luna"の新機能一覧


Marsのスプラッシュはほぼ変更がなく、右下に"MARS"と出るだけです。地味...!!


僕はM1がリリースされた時点からずっと4.5で仕事してますが、大きな問題はありません。 小さな問題はたくさんありましたがw 詳しくは過去ログをどうぞ。


Marsで特に注意すべき点としては、ジェネリクスの型解決のアルゴリズムが変わったことにより「LunaでコンパイルできるコードがMarsでコンパイルできない」「OracleJDKでコンパイルできるコードがコンパイルできない」が多発する可能性があるということでしょうか。

僕が一番苦労したのはこの点です。


最後に、毎年のことながら僕の気力ゲージの関係上、解説するのはJDTのみでございます。悪しからず。


M1の変更点

http://www.eclipse.org/eclipse/news/4.5/M1/


Improved rename & copy resource dialogs: ファイルのリネームと複製におけるダイアログUIの改善

ファイルのリネームダイアログで、予め名称部分(拡張子でない部分)が選択状態になります。

ファイルをコピペしてファイルを複製する場合、末尾に2とか3のような連番が勝手に付くようになりました。


New Ant icons: Antのアイコンが変更

AntのアイコンがPNGになりました。ベリーナイスだそうです。


New stepFilters extension point: デバッガのステップフィルタを自作できるように

デバッガのステップフィルタを自作できるようになりました。

以下の様な定義ファイルを書いて自作のStepFilterクラスを指定すれば良いらしい。 このファイルは何処に置けば良いかって?それは自分で調べるんだ…!

<extension point="org.eclipse.debug.core.stepFilters">
  <stepFilter
   class="com.example.ExampleStepFilter"
   modelIdentifier="com.example.debug.model">
  </stepFilter>
</extension>


Word wrap in the Console: コンソールビューでの行折り返し

コンソールビューのオプションに”行折り返し”が増えました。 右クリックのコンテキストメニューから選択できます。


M2の変更点

http://www.eclipse.org/eclipse/news/4.5/M2/


New debug option for resource change notifications: リソース変更検知に関するトレースが可能に

リソースファイル変更検知機能に関するトラブルの原因究明のために、イベントを都度ログに吐くオプションが追加されたようです。

このオプションをファイルで指定するか、 Eclipseのプリファレンス"General" → "Tracing"で指定せよとのこと。

org.eclipse.core.resources/debug=true
org.eclipse.core.resources/notifications=true

僕は使ったことないの機能なのでこれ以上詳しいことはわかりません。


I18n support for CSS bridge: CSSブリッジの国際化対応

CSSブリッジに関して、多言語化並びにローカライズがサポートされました。

CSSブリッジって何ぞ?と思って調べたところ、 「Eclipse3.x系のテーマを4.x系で実現するためのCSS記法」のようです。 詳しくはこちらを読んで下さい。 http://wiki.eclipse.org/Eclipse4/CSS/Bridge

どうも他言語化においてバグがあったらしく、それを解消した模様。 http://bugs.eclipse.org/bugs/show_bug.cgi?id=437902


Direct acces to structured selection of a JFace Viewer

(気にするのはプラグイン開発者のみなので省略)


Improved compiler performance: コンパイラのパフォーマンス改善

ジェネリクスを濫用したコードにおいて、体感できるほどの性能改善があったようです。

元々はこのチケットが発端になっている模様。 http://bugs.eclipse.org/bugs/show_bug.cgi?id=434326

チケットをチラ見したところ、jOOQの作者がカチコミをかけているようです。 jOOQか、、、そりゃ仕方ないな。


M3の変更点

http://www.eclipse.org/eclipse/news/4.5/M3/


UI responsiveness monitoring: UIが固まったことを検知する

デカいプロジェクトをいくつも開いていると、Eclipseは頻繁に固まるようになります。 理由は色々ですが一番多いのはメモリ不足です。

それはさておき、UIが固まった時にエラーログを、スレッドダンプ付きで吐けるようになりました。 どのプラグインが悪さしているのか調べるのに役立つでしょう。 ただしスレッドダンプは重い処理なので、検知の間隔を1秒未満にするのはオススメできないとのこと。

あと、バグレポートするときには大いに役立ててくれ!と書いてあります。


Perspective menu entries grouped:

パースペクティブに関連するメニューがグルーピングされました。


'Terminate/Disconnect All' in Console View: コンテキストメニューから"終了/切断"が出来るように

タイトルそのまんま。


Ant 1.9.4

タイトルそn(略)


The DateTime widget now uses GtkSpinButton on UNIX/Linux platforms: GTK環境で日付のスピンボタンの見た目が変更

タイトr(略)

GTK+2

GTK+3


New monitoring events added in place of SWT.Sleep and SWT.Wakeup

(気にするのはプラグイン開発者のみなので省略)


Dropped support for GTK+2 versions older than 2.18

(気にするのは(略))


Changed type of TranslationService.LOCALE

(気にするのは(略))


Add inferred lambda parameter types: ラムダ式の引数型を推論できるるように

然るべき位置でクイックアシスト(Ctrl+1)を押せば補完されます。使うかどうかは別として。


Convert method reference to lambda and back: メソッド参照とラムダ式を行ったり来たり

クイックアシストで行ったり来たり。

メソッド参照→ラムダ式

ラムダ式メソッド参照


Add watchpoint for final variables: 非定数final変数にウォッチ式を設定できるように

一方で、定数はコンパイル時にインライン展開されるので無理。


M4の変更点

http://www.eclipse.org/eclipse/news/4.5/M4/


New 'inherit' value for CSS properties: CSSのプロパティで'inherit'が使えるように

通常のCSSと同じく、inheritを指定できるようです。


Apply Patch... wizard more resilient: パッチ適用するウィザードがマトモに動くように

git format-patchで作ったパッチを当てるのがたまに失敗するという問題が解消されたようです。


Job groups API

(気にするのは(略))


Assigning stdin to a file: 標準入力をファイルから流し込む

標準入力を扱うプログラムをJavaで書く機会は滅多にないと思いますが、もしその時が来たら重宝しそうです。 っていうかこの機能が無いとつらい。


Automatic scroll lock in Console view: コンソールの自動スクロールロック

まず最初に言いますが、これ、かなり便利です。

要するに、コンソールの一番下を表示していない場合はスクロールロックがかかるようになります。

『少し前のログを見ているのに、コンソールに変化があったら勝手に一番下へスクロールされる』という、 あのイライラから開放されるわけです。

もちろん、手動で一番下までスクロールすればスクロールロックは自動解除されます。


Console output limit: コンソールの最大文字数の上限が事実上撤廃

コンソールのバッファサイズは上限100万文字だったのですが、撤廃されました。


Added API to set tooltip for MenuItem

(気にするのは(略))


Improved flow analysis for loops: ループにおけるフロー解析の改善

はい出ました。毎年おなじみのnull解析ネタです。

今回は、ループ内におけるnull解析の精度を、"判定誤り(false positive)"を減らすことで向上できたとのこと。


メソッドtest1の例

Luna以前では、③の位置で"潜在的ヌルポ(potential null pointer)"であると怒られます。

Marsからは、『②の位置で代入があるのでoはnullで無いかもしれない→潜在的ヌルポでは無い』ということが理解できるようになりました。


メソッドtest2の例

Luna以前では、③のnullチェックは冗長である(nullで確定である)と誤検知されます。 実際は非null値の代入があり得るのですが、上手く解釈できません。

Marsではこのような誤検知はありません。


メソッドtest3の例

Luna以前では、③の位置で『o必ずnullです』と誤検知されます。 非null値の代入がnullの代入に挟まれており、どうも上手く解釈できないようです。

Marsからは、このようなケースは『onullかもしれない』と正しく検知し、警告できるようになります。


解析のモデル

上記の有向グラフが新しいフロー解析の概念を表しています。

例えば、①の状態に至る遷移は

  • ① = [0] → a
  • ① = ① → b → c → d → e

(注: [0]は初期状態を表す)

の二つあり、現在の状態が①だった場合に③に至るには

  • ③ = ① → b → c

なので、③の状態に至る遷移は

  • ③ = ([0] → a) → b → c
  • ③ = (① → b → c → d → e) → b → c

のどちらか。言い換えると

  • ③ = ([0] → a | (① → b → c → d → e)) → b → c

であるということになります。

こんな感じの解析を、コンパイラの性能低下を最小限に抑えるために、ASTのトラバーサルだけで実現したそうです。


Re-run parameterized JUnit tests: パラメータ化したテスト単位での再実行

パラメータ化したテスト単位での再実行が可能になりました。地味に便利。


Unused exception parameters: 未使用の例外パラメータを検知

try {
    ...
} catch (Exception e) {
    ...
}

のようなコードで、eを使わないということは例外を握りつぶしているわけなのでダメコードなのですが、警告を出せるようになりました。

まあ、FindBugs等を導入していれば既にチェックしているはずの項目なんですが、Eclipseで公式サポートされたということです。


Extension point for third-party formatters: 自作のコードフォーマッタを使えるように

画像の通り。すげぇフォーマッターが追加された例。


M5の変更点

http://www.eclipse.org/eclipse/news/4.5/M5/


Perspective Customization: パースペクティブのカスタマイズ

3年ぶりにパースペクティブのカスタマイズ機能が復活しました。以下の画像を参照。


Nested/Hierarchical view of projects: プロジェクトの階層表示

プロジェクトエクスプローラで、プロジェクトの階層表示が出来るようになりました。

モジュール単位で複数プロジェクトに分割しているようなケースではディレクトリをネストするのが自然な構成ですが、Eclipse上でも同じ見た目を得られるようになります。

こちらから設定を変更すると…

こうなります。


Workspace location in preferences: 設定画面でワークスペースの場所を表示

ワークスペースに関する設定画面で、現在のワークスペースの場所を表示するようになりました。

ついでに、-showLocation起動オプションを使わなくてもウィンドウタイトルに表示できるようになりました。


New CSS properties for the Section title bar: セクションタイトル部分にCSSを適用可能

セクションタイトル部分にCSSが適用できるようになりました。

セクションタイトルとは、以下の画像における"All Extensions"とか"Extension Details"の部分です。

CSSで以下のように指定すると、

こんな感じになります。グラデーションが無くなってスッキリ。


Support for multiple style sheet rules for the same selector: 同一のセレクタに対して複数ルールを適用可能

HTMLでは一般的ですが、同一セレクタに対して複数のルールを適用するとオーバーライドされるようになりました。

以前はこんな感じだったのが、

こうなりました。タイトルが見やすくなってます。


Improved look for Forms based editors in the dark theme: ダークテーマにおけるフォームの見た目を改善

上述の「セクションタイトル部分にCSSを適用可能」のおかげて見た目が改善したようです。


Provisional EHelpService service

(気にするのは(略))


Improved reporting of UI freeze and potential deadlocks: UIのフリーズ及び潜在的デッドロックのレポートを改善

UIが固まった時のエラーログが改善されたというお話のようです。プラグイン開発者向けの話ですね。


Message registory

(気にするのは(略))


Text search speedup: 全文検索の速度改善

並列処理化が進み、全文検索の速度が3倍~4倍になったそうです。 (※マシンのコア数による)


Transparent background for Control: UI部品の背景透過

こんな感じのことができるようになったようです。


SWT Tools

(気にするのは(略))


M6の変更点

http://www.eclipse.org/eclipse/news/4.5/M6/


Mac OSX distribution now an Application Bundle: OSX向けディストリビューションのアプリケーションバンドル化

M6から、OSX向けEclipse SDKディストリビューションが"directory format"ではなく"Mac App"に準拠した構成になったとのこと。 Mac Appについてはこちらを参照。

http://trac.lcsr.jhu.edu/cisst/wiki/MacAppBundles

構成が大きく変わったので、アップデーターを利用したM5からM6へのアップデートは不可になりました。

アップデーターでアップデートしてしまいEclipseが起動しなくなった場合、こちらの手順で回復を行った後にまっさらのパッケージをインストールし直す必要があるようです。


Default max heap size increased to 1024MB: ヒープのデフォルトサイズが1024Mに

ヒープメモリのデフォルトが以下のように増量されました。

  • -Xms: 40M → 256M
  • -Xmx: 512M → 1024M


Close Tabs to the Left/Right: 「右の/左の」タブを全て閉じる

以下の画像の通り。昨今のタブブラウザでは標準搭載されているアレです。


Print button hidden by default: 印刷ボタンよさらば

印刷ボタンって必要ですか? 大昔ならソースをプリントアウトしてレビューとかやってたのかもしれませんが。

というわけで、印刷ボタンが削除されました。

必要な場合はツールバーのカスタマイズで有効にします。


"Visible tabs shown on overflow" behavior decoupled from appearance theme:タブのオーバーフロー表示がテーマと無関係に

タブを開きすぎて表示スペースに空きがない場合、いくつかのタブを優先表示するというロジックがEclipse4.2で導入されたわけですが、これはクラシックテーマ以外でのみ利用可能でした。

Marsではこの制約がなくなります。

この振る舞い、デフォルトは「左から優先して表示する」ですが、上記画像のように「最後に開いたタブを優先表示する(MRU)」という指定もできるようになります。


New API: AbstractSelectionDialog

(気にするのは(略))


CSS support for new COLOR-TRANSPARENT constant

(気にするのは(略))


APIs for hight-DPI monitor support: HiDPIのサポート

画像のHiDPIサポートが追加されました。

現状では、HiDPI環境でEclipseを使うと、以下のURL先でいうところの"EXAMPLES OF POOR HIGH-DPI BEHAVIOR"みたいになります。

http://www.hanselman.com/blog/LivingAHighDPIDesktopLifestyleCanBePainful.aspx

要するに、画像サイズとフォントサイズがアンバランスになって気持ち悪い外見になります。

全体として上手く動くようにするには各プラグインレベルでの対応が必要なので、HiDPI環境下でまともに使えるようになるのは当面先だと思います。


API to choose security context in Browser#evaluate()

(気にするのは(略))


Shortcut for Skip All Breakpoints: 全てのブレークポイントをスキップ

一時的に全ブレークポイントをまとめて無効化できるようになりました。

これは個別のブレークポイントの有効・無効に優先して適用されます。


ECJ requires 1.7 Java runtime: ECJはJava7以上が必要

いまだJava6で頑張っている現場もあるのではと思いますが、残念ながらMarsはJava7以上が必要です。


External annotations: Null解析用アノテーションをJarの外部から指定

Null解析アノテーションはまだ一般的ではないので、外部ライブラリを使ったコードを書くと、Null解析は不完全になります。

要するに、外部ライブラリはNull解析アノテーションが付いていないので、そこで解析が止まってしまうということです。

それじゃ困るということで、外部Jarに対して後付でNullアノテーションを付与できるようになりました。 通常の外部ライブラリどころか、JREのJarにも付けられるようです。

では後付のNull解析をどのような書式で指定すればよいかという話ですが、次に説明する"Annotate command"を使うか、 こんなクラスを書いてJarにパッケージングすれば良いっぽい。

import java.util.Map;

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;


public interface MyMap<K,V> extends Map<K,V> {
    @Override
    public @Nullable V get(@Nullable Object key);

    @Override
    public @Nullable V replace(K key, @NonNull V value);

    @Override
    public boolean replace(@NonNull K key, V oldValue, @NonNull V newValue);

    @Override
    public boolean containsValue(@NonNull Object value);

    @Override
    public @Nullable V put(K key, @NonNull V value);
}

詳しくはこの辺を参照。


Annotate command: 外部ライブラリへのNullアノテーションをもっと簡単に

前述の"External Annotation"では、外部ライブラリに対して後付でNull解析を指定する方法について書きましたが、正直、手順が面倒です。

そこで、もっとサクッとできないのか?というズボラな皆さんにピッタリの機能も用意がありました。

外部ライブラリのクラスファイルを開いて、その場でNullアノテーションを付けることが出来ます。前述のように、いちいち別途ファイルを用意する必要がありません。

このように、java.util.Map.get(Object)に対して後付のNullアノテーションを指定すると…

先ほどの指定がNull解析として考慮されるようになります。

但しこの機能を使うには、

が必要です。


M7の変更点

http://www.eclipse.org/eclipse/news/4.5/M7/


Improved "Open With..." dialog: "エディタを選択して開く"の機能強化

エディタを選択して開く時のダイアログが機能強化されたようです。

  • エディタをフィルタ可能
  • いわゆる「このファイルは、以後はこのエディタで開く」の記憶ができるように


"Open Resource" dialog can now filter duplicate resources: "リソースを開く"ダイアログで重複エントリを除去

同一名称のファイルが複数存在する際、フィルタすることで現在のコンテキストに最も関係の深い一つだけを表示できるようになりました。

フィルタ前

フィルタ後


e4 tools integrated into Eclipse platform

(気にするのは(略))


XPath expressions for parent element ID in Model Fragments

(気にするのは(略))


Icons are displayed in model editor and model spy

(気にするのは(略))


Better CSS support for Forms-based editors: フォーム部品のCSSサポートがさらに強化

どこがどう強化されたのかはわかりませんが、こんな外見をCSSで指定できるとのことです。


Heap Monitor can be styled, dark theme uses that: ヒープモニタの見た目を変更できるように

ステータスバー右下に表示されるヒープモニターの見た目をCSSで指定できるようになりました。

ちなみに、要素名はHeapStatusです。そのまんま。

#org-eclipse-ui-trim-status HeapStatus {
  color: lightgray;
}


New icon set in JDT: ダークテーマ専用のアイコンセット

ダークテーマ専用のアイコンセットが追加されました。(左が以前で右が新アイコン)


Show skipped tests only in JUnit view: JUnitでスキップしたテストだけを表示できるように

タイトル通り。


Add and remove parentheses around lambda parameter: ラムダ式引数の括弧を追加・削除するクイックアシスト

タイトル通り。


New Java editor templates: Javaのコードテンプレートが追加

3つのコードテンプレートが追加されました。

  • try_finally
  • finally
  • lock


More precise flow analysis: フロー解析の改善

コードの静的解析機能が更に強化されたようです。

  • オートボクシングされた値は常に非nullであると解釈するように
  • コンパイラ側で生成されるメソッドのうち、いくつかは常に非nullであると解釈するように
    • 例: 列挙型のvalueOf
  • リソースリーク解析に関する改善


Render all annotations in Javadoc hovers

Javadocのホバー表示ですべてのアノテーションを表示するようになりました。

何のために追加された機能かというと、前述の外部アノテーション(External Annotaion)で付与したものをJavadocホバーで表示するためのものだそうです。

M6までは表示できていなかったということなんでしょう。多分。


RC1以降の変更点

http://www.eclipse.org/eclipse/news/4.5/RC1/

(特筆すべき機能追加は無し)