Incluir un módulo de plataforma en el sistema de Plug Ins
Para poder incluir un módulo de plataforma en el sistema de Plug Ins hay que realizar lo siguiente:
Añadir nombre del módulo a la enumeración
En la interfaz com.minsait.onesait.platform.plugin.Module del proyecto onesaitplatform-plugin-interfaces añadir el nuevo módulo al Enum:
package com.minsait.onesait.platform.plugin;
public enum Module {
ALL, BPM_ENGINE, CONTROLPANEL, API_MANAGER, DASHBOARD_ENGINE
}
POM XML
Tener la dependencia onesaitplatform-commons
<dependency>
<groupId>com.minsait.onesait.platform</groupId>
<artifactId>onesaitplatform-commons</artifactId>
<version>${project.version}</version>
</dependency>Añadir la siguiente configuración del plugin de maven de Spring Boot
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.minsait.onesait.platform.DashboardEngineBootstrapApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
<layout>JAR</layout>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
La propiedad <mainClass> es el nombre completo de la clase principal de la aplicación que comentaremos en la siguiente sección.
Crear clase principal para Bootstrap
Para que funcione la carga de plugins dinámica, es necesario crear una clase principal nueva para la aplicación.
Por ejemplo, para el dashboard engine, tenemos la aplicación principal
package com.minsait.onesait.platform;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.minsait.onesait")
public class DashboardEngineApplication {
public static void main(String[] args) {
SpringApplication.run(DashboardEngineApplication.class, args);
}
}Crearemos en el mismo paquete la clase “DashboardEngineBootstrapApplication“, esta nueva clase principal es la que se encargará de cargar los plugins y de iniciar la aplicación Spring Boot mediante el loader PropertiesLauncher de Spring Boot:
package com.minsait.onesait.platform;
import org.springframework.boot.loader.PropertiesLauncher;
import com.minsait.onesait.platform.commons.plugins.PluginsManager;
import com.minsait.onesait.platform.plugin.Module;
public class DashboardEngineBootstrapApplication {
public static void main(String[] args) throws Exception {
PluginsManager.loadPlugins(Module.DASHBOARD_ENGINE);
PropertiesLauncher.main(args);
}
}El nombre de esta clase es el que se pondrá en el pom.xml tal y como se indica en la sección anterior
Fichero loader.properties
El siguiente paso será crear un fichero llamado “loader.properties” en src/main/resources, con el siguiente contenido:
loader.path=file:/application/plugins/
loader.main=com.minsait.onesait.platform.DashboardEngineApplicationAquí si pondremos el nombre completo de la clase principal que contiene la anotación @SpringBootApplication
Dockerfile y docker-entrypoint.sh
Por último, tendremos que tener lo siguiente en el Dockerfile:
# logs folder
RUN mkdir -p /var/log/platform-logs && \
mkdir /application && \
mkdir /application/plugins
Y eliminar si existen estas líneas:
RUN unzip /app.jar &&\
rm /app.jar
En el docker-entrypoint deberemos tener lo siguiente:
#!/bin/bash
echo "Finding Plugins"
if [ -z "$PLUGIN_URI" ]
then
echo "No plugins specified"
else
echo "Downloading Plugins..."
IFS=';' read -ra plugins <<< "$PLUGIN_URI"
for plugin in "${plugins[@]}"
do
echo "Plugin found on '$plugin'"
wget -P /application/plugins/ $plugin
done
fi
java $JAVA_OPTS -Dspring.application.json=$ONESAIT_PROPERTIES -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker -jar /app.jar
exit 0
A destacar el directorio de plugins /application/plugins/ que se deja para retrocompatibilidad (sistema de carga de plugins antiguo); por otro lado la aplicación se ejecuta con un -jar /app.jar