
NetBeans 26 がリリースされました。
追加された機能や修正はこちらをご覧ください。
https://github.com/apache/netbeans/releases/tag/26
ダウンロードは下記から
https://netbeans.apache.org/front/main/download/nb26
今回から公式によるインストーラの配布は行われなくなりました。
インストーラーが必要な方は上記ダウンロードリンクのFriends of Apache NetBeansから配布されているものを使ってください。
インストーラが不要な方はzip版をダウンロードして使ってください。
廃止になった理由は、あまりメンテナンスされていないnbi関連のモジュールを維持できなくなってきたためです。リソースも少ない中で成果物を少なくしてリリースの作業の負担を減らすのも仕方がないことだと思います。
desktopファイルを作る。
e.g. /home/<username>/.local/share/applications/Apache NetBeans-26.desktop
[Desktop Entry]
Encoding=UTF-8
Name=Apache NetBeans IDE 26
Comment=The Smarter Way to Code
Exec=/bin/sh "/home/<username>/netbeans/netbeans-26-bin/netbeans/bin/netbeans"
Icon=/home/<username>/netbeans/netbeans-26-bin/netbeans/nb/apache-netbeans.svg
Categories=Application;Development;Java;IDE
Version=1.0
Type=Application
Terminal=0

Inkscape独習ナビは、Inkscape 0.91の環境のもとで書きました。現在はInkscape 1.0.x がリリースされています。最新のバージョンではバグなどで挙動が変わってしまっている部分もあるので補足をします。
Inkscape 1.0ではp.66の「6.葉をパスに沿わせる」を実行しようとすると、書籍と同じ結果を得ることができません。
これはInkscapeのバグが原因です。既に下記に報告しています。
https://gitlab.com/inkscape/extensions/-/issues/241
書籍と同じ結果にするためには、「6.葉をパスに沿わせる」の前に下記の手順を実行してください。

以上でレッスン2の「6.葉をパスに沿わせる」の補足は終わりです。
他にも、何かお気づきの点がありましたら、インプレス宛にお問い合わせとしてメールをお送りいただくか、私のtwitterにリプいただけたら、わかる範囲でお答えいたします。

Explore from here pluginをNetBeans 12.0で使えるように修正しました。このプラグインを使うと、選択したノードからOSのファイルエクスプローラーを開くことができます。
Apache NetBeansでも使いたいという日本のNetBeansユーザーの方がいらっしゃっいましたので、オリジナルのリポジトリをクローンして修正してみました。
私も過去に使用していたのですが、ディレクトリを開こうとすると固まってしまうようになったので、使わなくなっていました。
最後に更新されてから7, 8年ぐらい経っていて、依存関係が古かったり非推奨のコードもあったりしたのでそれらを修正しています。
固まる原因はEDTで実際にディレクトリを開くコマンドを実行していたことと、それが終了するのを待っていたことです。
Linuxの環境では固まらずに開くことを確認してます。Windowsでは動作の確認していません。。。
興味のある方がいましたら使ってみてください。もし、不具合等があればお知らせください。

新しいPlugin Portal (Plugin Portal 3)でも未検証のプラグインをNetBeans から直接ダウンロードできるのか確認してみました。
基本的には過去に書いた記事と同じ方法でダウンロードできるようになります。違う部分はURLです。
NetBeans 12.0の場合は下記のURLをプラグインの設定に追加します。([Tools]ツール > [Plugins]プラグイン > [Settings]設定 > [Add]追加)名前は適当なものを入力してください。NetBeansのバージョンによってURLを変更する必要があります。(12.0の部分)
https://netbeans.apache.org/nb/plugins/12.0/catalog-experimental.xml

追加すると、Available Pluginsに未検証のプラグインも追加されているはずです。

NetBeans 12.0 LTSがリリースされました。
NetBeans 11.0からリリースサイクルが少し変更されて、マイナーバージョンが0(xx.0)のものはLTSとしてリリースされるようになりました。その他のマイナーバージョンのものは次のLTSに向けた新機能が追加されるFeatureリリースです。リリースは四半期ごとに行われます。
また、LTSがリリースされる前にはNetCATによるテストが行われています。
追加された機能はこちらです。https://netbeans.apache.org/download/nb120/index.html
ダウンロードはこちらから。https://netbeans.apache.org/download/nb120/nb120.html
NetBeans 12.0からはプラグインポータル(PP)のアップデートセンター(UC)が変更になっています。
プラグインポータルの変更に関してはこちらを参照ください。
https://junichi11.com/netbeans/netbeans-new-plugin-portal
もし、新しいPP(https://netbeans-vm.apache.org/pluginportal/)に使いたいプラグインがなければ、古いPP(http://plugins.netbeans.org/PluginPortal/)から手動でダウンロードしてインストールすることもできます。ただし、12.0で動くかどうかはわかりません。
PPに直接アップロードできなくなって、登録するのをやめたプラグイン開発者の方もいますが、NetBeansから直接ダウンロードして使いたいプラグインがあれば、なんとか登録をお願いするほかないです。(nbmがGitHubのreleases等にアップロードされていれば、手動でダウンロード&インストールすることは可能です。)
私のプラグインも今登録中です。もし、不足するものがあればお知らせください。
バグ等がある場合は、NetBeansのJIRAに登録をお願いします。NetBeans Issues

NetBeans の Plugin Portal (http://plugins.netbeans.org/PluginPortal/) のApacheのサーバーへの移行について書きます。
今のPlugin Poral (http://plugins.netbeans.org/PluginPortal/) は 現在バージョン2としてまだOracleのサーバーにあります。しかしながら、NetBeans自体は、既にApacheに移行しているので、すごく近い将来にはなくなります。
なぜ、今のPlugin Portal をApacheのサーバーに移行してないのかというと、各プラグインのライセンスの問題があるからです。(たとえば、GPLのプラグインはApacheのサーバーには置くことはできません。)そのため、今のPlugin Portalを単純にそのままApacheのサーバーに移せばいいというわけにはいかないのです。
閉鎖されると、もうIDEから直接ダウンロードできなくなってしまうの?と思われるかもしれません。しかし、既にApacheのサーバーにはバージョン3として新しいPlugin Poratal (https://plugins.netbeans.apache.org/) があります。今のPP2が閉鎖された後は、こちらのアップデートセンターを使うように変更されるはずです。
プラグインのユーザーは、主にダウンロードするために使うと思いますので、違いを気にする必要はなさそうです。
2と3の違いは以下の通りです。
3はスクラッチからつくられていて、見た目も2と異なります。
ログイン方法は、外部認証です。GitHubかGoogleのアカウントを使うようになりました。
プラグイン開発者は、登録方法が今までと異なるので注意が必要です。Apacheのサーバーには、Apache License, Version 2と互換性のあるものしか置けないので、今までのようにPPに直接アップロードして管理することはできなくなってしまいました。(たとえば、GPL系のライセンスのプラグインをアップロードできません。)その代わりとして、開発者がMaven Centralにアップロードしたものを使うようになります。
以下はプラグイン開発者のための情報です。
今のPPが閉鎖された場合は、当然ながらアップデートセンターも利用できなくなります。閉鎖後にまだ古いバージョンのNetBeansを使いたい場合は、個人のサーバーにバックアップされているcatalogを使うように変更してください。
もちろん、いままでのように、GitHub等に公開されているnbmを手動でダウンロードしてきたものも今まで通りインストールすることができます。
まだ、新しいPlugin Portalにはあまりプラグインがありませんが、プラグイン開発者がMaven Centralにアップロードして、新しいPlugin Portalに登録してくれるのを待つしかありません。
今後のPlugin Portalのついては、以上です。

NetBeans 11.1がリリースされました。今回はApacheのトップレベルプロジェクトになってから最初のリリースです。また、インストーラーも利用可能になりました。
新機能とダウンロードについては下記を参照してください。主にJavaの機能の改善が行われています。インストーラーのリンクもそこにあります。
4月から新しいリリースサイクルのもと開発が行われています。詳細は下記を参照してください。
四半期ごとに新しいバージョンがリリース(major.0, 1, 2, 3: e.g. 11.0, 11.1, 11.2, 11,3)されます。ただし、マイナーバージョンが1,2,3のリリースは、次のメジャーバージョンのための機能追加のリリースです。これらのリリースはNetCATによるテストが行われません。安定性にかける部分があるかもしれませんが、これによって、バグの修正や新機能の追加が早くなります。
翻訳のファイルは既にOracleからApacheに寄贈されているのですが、残念ながら、ライセンスの変更等の作業があまり進んでいません。
非公式での提供になりますが、日本語化用のnbmを公開しました。使用に関しては自己責任になりますが、日本語化したい方は、下記のリンクからnbmをダウンロードしてインストールしてみてください。もし、動作がおかしくなるようであればアンインストールしてください。
注:OracleのときのNetBeansの翻訳ファイルなので、Apacheで新規に開発された部分の翻訳はありません。
次のバージョンのNetBeans 11.2では、PHP 7.4をサポートします。既にmainリポジトリにマージ済みなので、開発版で試すことが出来ます。

NetBeansのプラグインの作り方を簡単に紹介します。
NetBeansのプラグインはmoduleという単位でNetBeans本体に追加できます。NetBeans本体もプラグインと同じmoduleが集まって構成されています。
moduleのプロジェクトの作成方法は2通りあります。違いはビルドツールで、1つはAnt、もう1つはmavenです。NetBeans本体はAntプロジェクトでつくらていますが、モダンなツールはmavenです。どちらでつくっても動作は同じですが、外部のライブラリなどを使って開発したい場合は、mavenのプロジェクトを使ったほうが管理が楽だと思います。
[File]メニューの[New Project…] をクリックして、New Project ウィザードを開きます。Categories: Java with Ant > NetBeans Modules、Projects: Moduleを選択して、[Next]ボタンを押します。

プロジェクト名を入力して、[Next]ボタンを押します。

Code Name BaseとModule Display Nameを入力して[Finish]ボタンを押すと、プロジェクトが作成されます。

Antプロジェクトの時と同様に、New Project ウィザイードを開き、Categories: Java with Maven、Projects: NetBeans Moduleを選択して、[Next]ボタンを押します。



必要な情報を入力して、[Finish]ボタンを押すとプロジェクトが作成されます。これらの情報はあとからpom.xmlファイルを修正して変更できます。NetBeans Version:はRELEASE82までしか選択できないので、pom.xmlでRELEASE110に変更しましょう。(バグ報告しました:https://issues.apache.org/jira/browse/NETBEANS-2628)
以下、Antプロジェクトを使って説明しています。
NetBeansにはplugin(module)用のコードのテンプレートが用意されています。用意されているものに関してはウィザードに従って値を入力していくと、コードが自動で生成されます。ここでは、例としてActionを追加する方法を紹介します。
エディタで選択された文字列をHTML Entity Numberに変換するアクションを追加してみましょう。
ファイルを追加したいパッケージを選択して、[File]メニューの[New File]をクリックします。New Fileダイアログが表示されるので、Categories: Module Development のFile Types: Actionを選択して[Next]をクリックします。

特定の条件でアクションを実行するようにもできますが、ここでは常に有効なアクションでつくってみましょう。Always Enabled を選択して[Next]をクリックします。

次にアクションをどこに追加するのかを設定します。以下のように設定して[Next]をクリックします。ここでは[Edit]メニューの一番最初にアクションを追加します。

最後にクラス名や表示されるアクション名を入力してFinishをクリックすると、ファイルが生成されます。ここでは、以下のように設定します。アイコンを表示したければ、16×16で制作してBrowseボタンから追加してください。

このような感じでファイルがつくられて、コードが生成されます。

実際に書いていかなければいけない部分は actionPerformed()の中身です。アクションが実行されたときにここが呼びだされます。
最初に、コンポーネントを取得し、エディタの文字列を取得します。ここでは最後にフォーカスされたエディタのコンポーネントを取得して、文字列を変換することにします。
コンポーネントを取得するために下記のメソッド(EditorRegistry.lastFocusedComponent())を呼び出します。
public void actionPerformed(ActionEvent e) {
EditorRegistry.lastFocusedComponent();
}
このままでは、赤のアンダーラインが表示されて、エラーになります。moduleの依存関係を追加する必要があります。追加する方法は次の3つです。
プロジェクトのノードを右クリックしてPropertiesをクリックします。

Project Propertiesダイアログが表示されます。Librariesを選択してModule DependenciesのAddボタンをクリックします。

Add Module Dependenciesダイアログが表示されます。 Filterのテキストフィールドにテキストを入力すると、関係するmoduleの一覧が表示されるので必要なものを追加します。ここではEditorRegistryと入力して、Editor Library 2を追加します。これでエラーがなくなるはずです。もしエラーが出ている場合は、import文が不足していないか確認してください。不足している場合は[Ctrl] + [Shift] + [I]で追加されます。

エディタのライン番号のところにバルブのアイコンが表示されている場合は、ヒントの機能を利用できます。[Alt] + [Enter] もしくはバルブのアイコンをクリックします。Search Module Dependency for **** を選択([Enter]/クリック)するとProject Propertiesから追加したときと同じAdd Module Dependencyダイアログが表示されるので、そこでmoduleを選択して追加できます。

プロジェクトツリーのLibrariesを右クリックして、Add Module Dependency… をクリックしても同様に追加できます。

コードの続きを書いていきます。Html Entity Numberに変換するメソッドを追加します。ここでは、アルファベット等を変換しない等の処理は入れずに、単純に全部の文字を変換するメソッドにしています。つまり、全て”&#nnnn;” の形式に変換します。
static String convertToHtmlEntityNumbers(String string) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i &amp;amp;lt; string.length(); i++) {
sb.append(String.format("&amp;amp;amp;#%d;", Character.codePointAt(string, i)));
}
return sb.toString();
}
actionPerfomed()の残りも書きます。選択されたテキストを取得して、変換して、documentに挿入するようにします。
補足:メソッド呼び出しの結果を変数に代入したい場合は、[Alt] + [Enter] でヒントを表示して、[Assign Return Value To New Variable]を選択すると、変数に代入するコードを追加してくれます。

@Override
public void actionPerformed(ActionEvent e) {
JTextComponent editor = EditorRegistry.lastFocusedComponent();
if (editor == null) {
return;
}
String selectedText = editor.getSelectedText();
if (selectedText == null) {
return;
}
// convert selected text
String convertedText = convertToHtmlEntityNumbers(selectedText);
int selectionStart = editor.getSelectionStart();
int selectionEnd = editor.getSelectionEnd();
int length = selectionEnd - selectionStart;
Document document = editor.getDocument();
try {
// remove and insert converted text
document.remove(selectionStart, length);
document.insertString(selectionStart, convertedText, null);
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
補足ですが、documentの文字列を削除して変換された文字列を挿入している部分は、NetBeansの履歴では削除と挿入として残ります。つまり「戻る」を実行したときに一旦、削除後の状態に戻り、さらに「戻る」を実行すると元の状態に戻ることになります。ドキュメントの複数の操作を1つの履歴として扱いたい場合は、NbDocument(https://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/text/NbDocument.html)のrunAtomicUser()もしくはrunAtomic()メソッドを使います。
全体のコードは以下のようになります。
package com.junichi11.my.netbeans.plugin;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import org.netbeans.api.editor.EditorRegistry;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle.Messages;
@ActionID(
category = "Edit",
id = "com.junichi11.my.netbeans.plugin.ConvertToHtmlEntityNumberAction"
)
@ActionRegistration(
displayName = "#CTL_ConvertToHtmlEntityNumberAction"
)
@ActionReference(path = "Menu/Edit", position = 100)
@Messages("CTL_ConvertToHtmlEntityNumberAction=Convert To Html Entity Number")
public final class ConvertToHtmlEntityNumberAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JTextComponent editor = EditorRegistry.lastFocusedComponent();
if (editor == null) {
return;
}
String selectedText = editor.getSelectedText();
if (selectedText == null) {
return;
}
// convert selected text
String convertedText = convertToHtmlEntityNumbers(selectedText);
int selectionStart = editor.getSelectionStart();
int selectionEnd = editor.getSelectionEnd();
int length = selectionEnd - selectionStart;
Document document = editor.getDocument();
try {
// remove and insert converted text
document.remove(selectionStart, length);
document.insertString(selectionStart, convertedText, null);
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
static String convertToHtmlEntityNumbers(String string) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i &amp;amp;lt; string.length(); i++) {
sb.append(String.format("&amp;amp;amp;#%d;", Character.codePointAt(string, i)));
}
return sb.toString();
}
}
コードを書き終えたら、実行してみましょう。実行する方法は下記のようにいくつかあります。好きなところから実行してください。
実行するともう1つNetBeansが初期設定の状態で起動します。この起動したNetBeansの中でプラグインが有効になっています。作ったアクションは、最初に[Edit]メニューに登録したので、そこに[Convert To Html Entity Number]があるはずです。

実際にテキストを選択して、アクションを実行してみます。


ユーザーディレクトリ(オプションなどの設定があるディレクトリ)は、本体とは別に各プラグインごとにつくられます(build/testuserdir)。プロジェクトのコンテキストメニューから[Clean]を実行するとこれらは初期化されます。
うまく動かなかったりする場合は、デバッグしてみましょう。
デバッグする方法も実行するときと同様で、下記の場所からデバッグを開始できます。
ブレークポイントはライン番号をクリックすると有効/無効の切り替えができます。
プラグインを配布・インストールするには、拡張子がnbmのファイルが必要です。
プラグインはnbmファイルを生成して、それをインストールすることで有効になります。プロジェクトを右クリックして、[Create NBM]を実行してください。問題がなければ、Output ウィンドウでBUILD SUCCESSFULが表示されます。nbmファイルはbuildディレクトリ内につくられます。


インストールは、[Tools]メニューの[Plugins]から行います。[Tools]メニューの[Plugins]をクリックすると、Pluginsダイアログが表示されます。[Downloaded]タブの[Add Plugins…]ボタンを押して、生成したnbmファイルを選択します。他のプラグインをダウンロードしてきたときも同様です。

[Install]ボタンを押すと、ライセンスの確認等があるので、[I accept the terms in all of the license agreements.]にチェックを入れて[Install]を押して、途中の警告も[Continue]すれば、インストールできます。


ライセンスファイルを追加していないと上のような表示になるので、正しいライセンスファイルを追加しておきましょう。(下のプロジェクトの設定を参照)

プラグインを配布する方法は下記のようにいくつかあります。
Plugin Portalに登録するには、最初にアカウントを作成して、nbmファイルをアップロードします。
NetBeans 本体のPluginsダイアログのAvailable Pluginsに表示されているプラグインは、Plugin Portalに登録されているものですが、登録したものすべてが表示されるわけではありません。
Available Plugins の一覧に表示されるようにするためには、nbmファイルに署名する(sign)必要があります。署名の方法についてはこちら (https://netbeans.apache.org/wiki/DevFaqSignNbm.asciidoc) を参照してください。
git等でバージョン管理している場合は、nbproject/private ディレクトリをignoreするようにしてください。(mavenプロジェクトの場合はkeystoreファイルがignoreされるようにしてください。)
たとえば、https://github.com/junichi11/netbeans-rainbow-braces/releases のようにgitでバージョンのタグをつくって、そこにnbmファイルをアップロードします。
これに関しては省略しますが、特定のURLをNetBeansに登録してもらって、ダウンロードしてもらうこともできます。
ユニットテストも追加しておきましょう。(JUnitに関する詳細はおぐぐりください)このままだとactionPerformed()メソッドは、JTextComponentをテスト時に取得できないので、スタブをつくってテストできるように、ConvertToHtmlEntityNumberActionクラスのfinal修飾子を削除して、getComponent()メソッドを導入します。以下のコードの部分をメソッドにします。
(※このコードの場合だと上に書いたようにしなくても、actionPerformed(ActionEvent event, JTextComponent component) メソッドを作って、それをactionPerformed(ActionEvent event)から呼び出すようにして、その追加したメソッドをテストすればよさそうです。)
JTextComponent editor = EditorRegistry.lastFocusedComponent();
選択範囲のコードをメソッドにしたい場合は、範囲を選択した状態で、[Alt] + [Enter] でヒントを表示して、メソッドを導入できます。ポップアップウィンドウの項目で[Introduce Method…] (これはNetBeansのリファクタリングの機能です)というのを選択します。

Introduce Method ダイアログが表示されます。NameとAccessを適切に設定してOkボタンを押すと、メソッドが追加されます。


冗長であれば必要に応じて、メソッドの中身を修正します。
テストファイルは、[Tools]メニューの[Create/Update Tests]から作れます。

Create/Update Tests ダイアログが表示されます。必要に応じて変更して(Method Bodyなどいらなければチェックをはずします)OKボタンをクリックすると、テストファイルが作成されます。

コードを書かなければいけないのは、test****()メソッドのbodyです。各メソッドのテストを書きます。ここでは testActionPerformed() のコードを書いていきましょう。
最初にConvertToHtmlEntityNumberActionを継承したテスト用のクラスをConvertToHtmlEntityNumberActionStub を作ります。
private static final class ConvertToHtmlEntityNumberActionStub extends ConvertToHtmlEntityNumberAction {
}

getComponent()メソッドをオーバーライドしてテストのデータを変更できるようにしましょう。
メソッドをオーバーライドするにはInsert Code([Alt] + [INS])の機能を使う方法もありますが、1つだけオーバーライドしたい場合は、コード補完からオーバーライドする方法が速いです。クラス内でコード補完のポップアップウィンドウを表示します([Ctrl] + [Space])。項目の中からgetComponent() – overrideを選択すると、メソッドが挿入されます。


以下のようにテストを追加してみました。未実装のテストメソッドや足りないテストケースは追加してみてください。
package com.junichi11.my.netbeans.plugin;
import javax.swing.JEditorPane;
import javax.swing.text.JTextComponent;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class ConvertToHtmlEntityNumberActionTest {
public ConvertToHtmlEntityNumberActionTest() {
}
@Test
public void testConverToHtmlEntityNumbers() {
// TODO add
}
@Test
public void testActionPerformed() {
testActionPerformed("@ほげほげテスト", "@ほげほげテスト", 0, 0);
testActionPerformed("@ほげほげテスト", "&#64;ほげほげテスト", 0, 1);
// TODO add more tests
}
private void testActionPerformed(final String original, final String expectedResults, final int selectionStart, final int selectionEnd) {
ConvertToHtmlEntityNumberAction action = new ConvertToHtmlEntityNumberActionStub(original);
JTextComponent component = action.getComponent();
component.setSelectionStart(selectionStart);
component.setSelectionEnd(selectionEnd);
action.actionPerformed(null);
assertEquals(expectedResults, component.getText());
}
private static final class ConvertToHtmlEntityNumberActionStub extends ConvertToHtmlEntityNumberAction {
private final JTextComponent editor;
public ConvertToHtmlEntityNumberActionStub(String text) {
this.editor = text != null ? new JEditorPane("text/plain", text) : null;
}
@Override
JTextComponent getComponent() {
return editor;
}
}
}
テストもプロジェクトの実行の時と同様に実行する方法はいくつかあります。
ファイル([Test File])だったり、パッケージ([Test Package])だったり、プロジェクト([Test])だったり、選択中のノードによってテストの対象が変わります。
プロジェクトのコンテキストメニューから[Test]を実行してみましょう。テストが成功すればグリーンの表示結果になります。

失敗した場合は、進捗バーがレッドになります。テストが間違ってなければ、実装を修正しましょう。

別のディレクトリにテストデータを用意しておいて、それらを使ってテストするときなどは、テストクラスにNbTestCase(エラーがでたら依存関係の修正)を継承させて使うと便利だと思います。コンストラクタに引数があるので注意。
例外が発生する場合は、処理を正常に終了させ、どこで問題が起きたのかLoggerを追加してログを残しましょう。特定のクラス用のLoggerは、Insert Code([Alt] + [INS])の機能でコードを生成できます。クラス内でInsert Code([Alt] + [INS]) を実行して[Logger…] を選択します。

キャレット位置にコードが生成されます。

ここでは Exceptions.printStackTrace(ex); の部分をLoggerに置き換えてみましょう。よりよいメッセージがあれば、メッセージ部分を変更してください。
try {
// remove and insert converted text
document.remove(selectionStart, length);
document.insertString(selectionStart, convertedText, null);
} catch (BadLocationException ex) {
// Exceptions.printStackTrace(ex);
LOG.log(Level.WARNING, "Incorrect offset: " + ex.offsetRequested(), ex);
}
プロジェクトのPropertiesでJavaのバージョンやプラグインのバージョン等を設定できます。moduleの依存関係を追加したときと同様に、プロジェクトのコンテキストメニューで[Properties]を選択します。通常必要と思われる部分だけ紹介します。以下AntのプロジェクトのProject Propertiesのダイアログです。
Mavenのプロジェクトを作った場合は、Antの場合とProject Propertiesの項目が異なる部分があります。

Source Level はJavaのバージョンです。これはヒント等に使用されます。例えば、Java 8からラムダ式を使用できますが、Source Levelを1.7にしておくと、ラムダ式を使っている箇所ではエラー表示されます。また、Source Levelを1.8にしておくと、ラムダ式が使える箇所では、ラムダ式に変更できるよと提案のヒントが表示されます。使いたいJavaのバージョンの文法でエラーになる場合は、ここの設定を確認してみてください。

基本的には、プラグインをインストールする時等に、プラグインの情報として表示されます。

プラグインのバージョンを変更したい場合は、Specification Version を変更してください。プラグインを修正して、新しいバージョンを配布するときは、忘れずにバージョンを変更しましょう。たとえ中身が違っていても、バージョンの情報が同じなら、すでにそのバージョンはインストールされているものとみなされ、プラグインを更新するために、一度インストール済みのプラグインを削除しなければなりません。

プロジェクト内にライセンスファイルを作って、適切なライセンスを設定しましょう。(例えば、https://github.com/junichi11/netbeans-rainbow-braces を参照)Home Pageには、ソースコードのリポジトリのアドレス等を設定するといいかと思います。
ライセンスヘッダーの設定をしていない場合、新規にファイルを作成すると、ファイルの先頭に下記のコメントが追加されます。
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
ファイルはテンプレートを使用して作成されています。どのライセンスを使用するか設定しておくと、このコメントの部分に適切なライセンスヘッダーが挿入されるようになります。
Mavenのプロジェクトの場合はProject Propertiesにライセンスヘッダーを設定できるカテゴリーがあるのですが、Antのプロジェクトにはそれがありません。
その場合は、nbproject/project.propertiesファイルを編集します。

project.propertiesファイルを開いて、project.license=[license name] を追加してください。例えば、Apache License, Version 2.0を使用したい場合は下記のように書きます。
project.license=apache20
この[license name]の部分は、デフォルトのライセンスのテンプレートのファイル名で決まります。既存のテンプレートのファイル名は license-[license name].txt の形式になっています。この[license name]をproject.licenseに使用できます。ファイル名は、[Tools]メニューの[Templates]からTemplate Managerダイアログを開いて、Licensesの特定のライセンスを右クリックして、Propertiesから確認できます。

project.propertiesファイルを開いて、project.licensePath=[path to the license template file]を追加してください。例えば下記のように書きます。
project.licensePath=./nbproject/licenseheader.txt
英語ですが下記のチュートリアル動画やWikiが参考になると思います。わからないことや質問があれば、メーリングリストやSlackで聞いてみてください。また、あれはどうやって取得するんだろうと思うことがあれば、NetBeans本体のコードをありそうなメソッド名などでgrepしてみるのも1つの方法です。例えば、getFileObjectなど。
これを読んで実際に実行してみる人はいないかもしれませんが、もしいましたら、次のような機能の追加・改善が考えられるので、それらを実装してみるのも練習になると思います。
長々と書いて、クソコードだったりする部分もあるかもしれませんが、もし何かありましたらご指摘いただけると助かります。
NetBeansとプラグインの作成に興味をもってくれた人がいれば幸いです。
予定より1ヶ月と少し遅れてしまいましたが、NetBeans10.0がリリースされました。
ダウンロードや追加された機能の詳細は下記のアナウンスを確認してください。
リリースが遅れた原因は、ライセンスの問題等があったためです。
NetBeans 9.0 では、JavaSE関連の機能のみでしたが、NetBeans 10.0では、JavaScript, Groovy, PHPの機能がデフォルトで追加されました。
インストーラーはまだ寄贈されていなかったので、起動は直接、起動ファイルを実行する必要があります。現在、インストーラーも寄贈済みなので、うまく行けば、次回のリリースからインストーラーを提供できるかもしれません。
今回、私は主にPHPの新機能の追加やバグの修正、ライセンスの変更を行いました。NetBeans8.2以降、Apacheへの寄贈に時間がかかってしまい、最新のPHPのバージョンに対応できていませんでした。PHP7.3のリリースより少し遅れてしまいましたが、なんとか最新のPHPのバージョンへの最低限のサポートは追加できたかなと思います。
それから、日本語のsignature ファイルもNetBeans 10用に更新しています。新しいジェネレーターで生成したので、以前よりも多くの補完が効くようになってると思います。ジェネレーターはTomas(OracleのNetBeansのときのPHPの機能の開発者の1人)がスクラッチからつくってくれて、私はバグの修正や未実装部分の追加などを手伝いました。PHPマニュアルから生成しているので、ライセンスは CC-BY-3.0です。このライセンス以外で公開されている同様のファイルもありますが、もしかするとそれらは正しくないライセンスかもしれません。
なにか問題やリクエストなどがありましたら、JIRAへ登録をお願いします。私にできそうなものであれば取り組みます。英語で報告が難しければ、slackやtwitterでもかまいません。(実際にslackのコメントからPHPのヒントの改善やエディターのタブのソートを実装しました。)
次回のリリースは、ライセンスの変更が終わっていれば Jakarta EE/Java EE の機能の追加です。(Java関係のモジュールはGPL系のライセンスが含まれていることがあるので、時間がかかりがちです。)C/C++はソースコードもまだなので、もう少し時間がかかりそうです。
Apache NetBeans のGitHubのリポジトリで2ndDonation ブランチが masterブランチにマージされました。2ndDonationブランチには、JavaEE、JavaScript、Groovy、PHPなどの機能が含まれていました。まだ、リライセンスの作業があり、9.0もでたばかりなので、すぐにはこれらを含めたものをリリースできません。そこで、自分でNetBeans をビルドして使う方法を紹介します。
$ git clone [email protected]:apache/incubator-netbeans.git
$ cd incubator-netbeans $ ant -Dcluster.config=full
または使いたいものだけ。 例えば、PHPの場合は、(Or Only features which you want to use. e.g. in the case of PHP,)
$ ant -Dcluster.config=php
起動用のファイルはnbbuild/netbeans/bin にあるのでそれを実行します。(You can find the start-up files in the nbbuild/netbeans/bin directory. So just run it.)
試しに起動するだけなら、下記を実行します。(If you just would like to try to run it, run the following command.)
$ ant tryme
これでPHP等の機能も使えるようになっているはずです。(PHP, JavaEE e.t.c. features should be available.)



まだ翻訳部分のコードが寄贈されていないため、日本語化はできません。
もうすぐ翻訳の部分のコードの寄贈も行われる予定です。
もし何か問題を見つけた場合は、https://issues.apache.org/jira/projects/NETBEANS/issues に報告をお願いします。(If you find issues, please report them to https://issues.apache.org/jira/projects/NETBEANS/issues .)