Desarrollo Plugin de NetBeans: lecciones aprendidas al modernizarlos

El repo maven original ya no existe

El repositrio de maven para desarrollar plugins con maven ha cambiado, eso significa que algunas dependencias para versiones muy viejas de tus plugins ya no existen. El nuevo repositorio a usar por mientras es el de Jaroslav Tulach, esperemos que en algún momento todas las dependencias estén en maven central. Debido a ello podemos obtener errores como este:

Failed to execute goal on project DebuggerUtils: Could not resolve dependencies for project de.markiewb.netbeans.plugins:DebuggerUtils:nbm:1.0.0: Failed to collect dependencies at org.netbeans.api:org-netbeans-api-annotations-common:jar:RELEASE81: Failed to read artifact descriptor for org.netbeans.api:org-netbeans-api-annotations-common:jar:RELEASE81: Could not transfer artifact org.netbeans.api:org-netbeans-api-annotations-common:pom:RELEASE81 from/to Maven Central (https://repo1.maven.org/maven2/): Transfer failed for https://repo1.maven.org/maven2/org/netbeans/api/org-netbeans-api-annotations-common/RELEASE81/org-netbeans-api-annotations-common-RELEASE81.pom: Unknown host repo1.maven.org -> [Help 1]

Y la solución para poder otra vez desarrollar Plugins de NetBeans será agregar el siguiente repositorio

<repositories>
        <repository>
            <id>netbeans</id>
            <name>NetBeans</name>
            <url>https://netbeans.apidesign.org/maven2/</url>
        </repository>
</repositories>

Clases privadas referenciadas en el módulo

Aprendí que a partir de Apache NetBeans 11 algunas clases se han vuelto solo para uso interno, por ejemplo en mi caso:

private classes referenced in module: [org.netbeans.modules.editor.lib2.highlighting.HighlightingManager]

En este caso significa para el desarrollo Plugin de NetBeans en que la clase que se encargaba de la administración del resaltado con color del texto seleccionado en el editor de NetBeans ya no se puede usar fuera y por lo tanto se debe reescribir la solución usando el API de lexer y trabajando tóken por tóken.

Falta el candado de lectura al acceder a la jerarquía de tokens

El empezar a trabajar con los tokens provistos por el API de lexer me encontré con un mensaje de alerta que decía:

missing read-lock when accessing tokenhierarchy

esto significa que si el texto se modifica por ejemplo con un borrado antes de que acabemos de leerlo en el editor (en el caso de NetBeans se usa un JEditor de Swing), este se podría corromper y los resultados que esperamos también.

Para solventar este problema solo puse la sentencia entre dos sentencias para poner y quitar un candado respectivamente, en caso de que la instancia fuera un tipo de documento que soporte el bloqueo de lectura de la siguiente manera

if (document instanceof AbstractDocument) {
    ((AbstractDocument) document).readLock();
}
final TokenHierarchy<Document> documentHierarchy = TokenHierarchy.get(document);

final TokenSequence<?> ts = documentHierarchy.tokenSequence();
if (document instanceof AbstractDocument) {
    ((AbstractDocument) document).readUnlock();
}

Módulo XML JAXB PAI de netbeans

En mi caso me topé con el error:

[INFO] Private classes referenced in transitive module: [com.sun.activation.registries.MimeTypeFile, com.sun.activation.registries.LogSupport, com.sun.activation.registries.MailcapFile]
[ERROR] Project depends on packages not accessible at runtime in transitive module org.netbeans.api:org-netbeans-modules-xml-jaxb-api:jar:RELEASE111 which will not be accessible at runtime.

Esto no se soluciona agregando explícitamente la dependencia transitiva, en este caso particular hay que añadir el jar de activation, en mi caso con maven se hace así:

<dependency>
   <groupId>javax.activation</groupId>
   <artifactId>activation</artifactId>
   <version>1.1.1</version>
</dependency>

Depedida

Espero estas pequeñas cosas te sirvan para el momento en que desarrolles tu propio plugin para NetBeans. En este artículo periodicamente agregaré nuevos hallazgos para facilitar tu incursión para tu Desarrollo de Plugin de NetBeans.

javapro.org