lunes, 18 de julio de 2022

Error al ejecutar jar "no main manifest attribute"

Error al ejecutar jar "no main manifest attribute"

Hola.

Obtengo el siguiente error al intentar ejecutar un jar desde consola con el comando java -jar

La opción -jar sólo funciona con archivos JAR ejecutables por lo que estos deben tener un manifest con el atributo Main-Class especificado. 

En mi caso es un jar que no contiene un manifest dentro por lo que es necesario especificar los paquetes de la aplicación

Ejecutar jar "no main manifest attribute"

Les dejo aquí la siguiente secuencia de comandos que ejecute para ejecutar el jar y para buscar la estructura de paquetes de la aplicación:

jangel-MBP13:target jhernand$ java -jar myFirstApp-1.0-SNAPSHOT.jar

no main manifest attribute, in myFirstApp-1.0-SNAPSHOT.jar

jangel-MBP13:target jhernand$ 

jangel-MBP13:target jhernand$ java -cp myFirstApp-1.0-SNAPSHOT.jar MyGroup.MyFirstApp

Error: Could not find or load main class MyGroup.MyFirstApp

Caused by: java.lang.ClassNotFoundException: MyGroup.MyFirstApp

jangel-MBP13:target jhernand$ ls ../src/main/

java

jangel-MBP13:target jhernand$ ls ../src/main/java/

MyGroup

jangel-MBP13:target jhernand$ ls ../src/main/java/MyGroup/

App.java

jangel-MBP13:target jhernand$ java -cp myFirstApp-1.0-SNAPSHOT.jar MyGroup.App

Holaaaa mundoooo!

jangel-MBP13:target jhernand$ 


La aplicación es un simple Hola Mundo usado como ejemplo.

Referencias:

https://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute

Espero les sirva.

jueves, 14 de julio de 2022

[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.

Resolver [ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.

Hola.

Estoy obteniendo el siguiente error al ejecutar el goal docker:build con Maven en mi aplicación de TIBCO BusinessWorks Container Edition.

[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.
[ERROR] Target option 1.5 is no longer supported. Use 1.6 or later.


Este error se debe a la configuración que tengo del plugin maven-compiler-plugin

Tengo la siguiente versión de maven (3.8.5) y jdk (11) instalados en mi máquina:

jangel-MBP13:tmpjmsplugin jhernand$ mvn -version

Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)

Maven home: /usr/local/Cellar/maven/3.8.5/libexec

Java version: 11.0.14, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-11.0.14.jdk/Contents/Home

Default locale: en_US, platform encoding: UTF-8

OS name: "mac os x", version: "10.15.7", arch: "x86_64", family: "mac"

jangel-MBP13:tmpjmsplugin jhernand$ 


maven java javac version

Al parecer el error se debe a que desde la version 3.8.0 el valor default del maven-compiler-plugin cambio de 1.5 a 1.6

Solución


Para corregirlo hay que modificar las propiedades de target y source del plugin maven-compiler-plugin en el archivo pom.xml de la aplicación. 

Estoy utilizando la versión de JRE que se tengo instalado. Para saber la versión ejecuto:

/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version

jangel-MBP13:tmpjmsplugin jhernand$ /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version

java version "1.8.0_331"

Java(TM) SE Runtime Environment (build 1.8.0_331-b09)

Java HotSpot(TM) 64-Bit Server VM (build 25.331-b09, mixed mode)

jangel-MBP13:tmpjmsplugin jhernand$ javac -version

javac 11.0.14

jangel-MBP13:tmpjmsplugin jhernand$


La siguiente configuración el archivo pom.xml funcionó para mi.

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>

Con este cambio el error debe quedar corregido y se puede volver a intentar el goal.

Referencias:


Espero les sirva.

miércoles, 13 de julio de 2022

Desplegar Aplicación TIBCO BusinessWorks Container Edition en Docker con Azure Artifacts

Cómo desplegar Aplicación TIBCO BusinessWorks Container Edition en Docker con Azure Artifacts

Hola.

En este post voy a describir cómo desplegar una aplicación REST con TIBCO BusinessWorks Container Edition usando Docker container con Azure Artifacts.

Mi aplicación es un servicio REST que recibe un request y publica un mensaje a una queue de EMS con la información recibida. 

En este caso requiero que las librerías de TIBCO EMS se encuentren en el repositorio y que sean descargadas al momento de construir la aplicación e incluidas en la imagen de Docker generada. Con esto al iniciar mi contenedor estas dependencias son resueltas y la aplicación se ejecute correctamente. 

Conexión a Azure Artifacts

Lo primero que tienen que tener configurado en el proyecto es una conexión a un Feed Artifact de Azure.

En la sección de Azure Artifacts, seleccionar el feed deseado y la opción Connect to Feed para ver la información de conexión al Feed desde nuestro proyecto. En esta sección se encuentra toda la información referente a la configuración de la conexión del Feed al proyecto.

1.- Editar el archivo settings.xml (Este se encuentra en la instalación de Maven: /opt/apache-maven-3.5.0/conf o también en el user home ${user.home}/.m2, se puede crear si no existe). Agregar el elemento de server siguiente: 

<servers>
.
.
<server>
<id>MiFeed</id>
<username>miusuario</username>
<password>[PERSONAL_ACCESS_TOKEN]</password>
</server>
</servers>

El Personal Access Token se genera desde ahi mismo siguiendo las instrucciones para generarlo con Packaging read & write scopes.

2.- Colocar los elementos: repositories y repository dentro del archivo POM de la aplicación. Los datos de conexión de estos elementos están disponibles en Azure Artifacts > Connect to Feed. Algo similar a lo siguiente

<project>
.
.
<repositories>
<repository>
<id>MiFeed</id>
<url>https://pkgs.dev.azure.com/micompany/miservicio/_packaging/MiFeed/maven/v1</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</project>


Hasta este punto tenemos conexión al Artifact Feed de Azure desde nuestro proyecto de TIBCO BusinessWorks Container Edition.

Subir plugins al feed con mvn deploy:deploy-file

Para subir los archivos hacia el repositorio se utiliza la instrucción de Maven deploy-file. En el caso particular de las librerías de EMS, es necesario primero empaquetar las librerías de la siguiente manera

1.- Copiar las carpetas desde /opt/tibco/ems/8.6/components/shared/1.0.0/plugins hacia una carpeta temporal con la siguiente estructura: runtime/plugins

2.- Crear un archivo zip de la carpeta runtime y asignarle un nombre descriptivo para las librerías como en la siguiente imagen: TIB_bwpluginjms_8.6.0_bwce-runtime.zip

Este nombre se usará en la instrucción deploy-file

*Podría ser también un archivo con extensión .jar

La estructura de directorios y archivo zip final deben verse como en la siguiente imagen.

EMS libraries runtime plugins

3.- Para subir el archivo zip antes generado con las librerías de EMS se utiliza la siguiente instrucción desde la carpeta donde se encuentra el archivo:
Los nombres de groupId, artifactId y versión dependen del paquete que se suba así como de la organización de nombres de archivos que se requiera.

mvn deploy:deploy-file -Dpackaging="zip" -DrepositoryId="MiFeed" -Durl="https://pkgs.dev.azure.com/micompany/miservicio/_packaging/MiFeed/maven/v1" -DgroupId="com.tibco.jms" -DartifactId="plugin" -Dversion="8.6.0.004" -Dfile="TIB_bwpluginjms_8.6.0_bwce-runtime.zip"

Agregar dependencias al proyecto en el POM application


Después de subir las librerías al repositorio o Feed ya pueden ser referenciadas desde un proyecto de BWCE. Para lograr esto, dentro del archivo POM de la aplicación es necesario agregar las dependencias que se encuentran en el repositorio externo.

1.- Ir a la URL del repositorio y seleccionar el Artifact deseado.
2.- En la pestaña Overview > Get this Package > Maven
Seleccionar el fragmento de XML para agregar al archivo POM de la aplicación. Algo similar a lo siguiente:

<dependency>
<groupId>com.tibco.jms</groupId>
<artifactId>plugin</artifactId>
<version>8.6.0.004</version>
<type>zip</type>
</dependency>


3.- Ir al proyecto de BWCE y pegar el fragmento XML en el POM de la aplicación (ej. MiProyecto.application/pom.xml). Agregar el elemento type como zip porque en este caso las librerías fueron subidas en ese formato. El valor por default es jar

<project>
.
.
<dependencies>
<dependency>
<groupId>com.tibco.jms</groupId>
<artifactId>plugin</artifactId>
<version>8.6.0.004</version>
<type>zip</type>
</dependency>
</dependencies>
</project>

Al momento de incluirlo en el archivo, y estar configurada la conexión a Azure Artifacts - Feed, la dependencia es descargada automáticamente en el folder local ${user.home}/.m2/repository con lo que se vuelve disponible para el proyecto.

Agregar dependencias en Docker image build


Con las dependencias incluidas en el proyecto, es necesario referenciarlas en el build de la imagen Docker que se genera al ejecutar el goal docker:build

Para esto hay que modificar el archivo POM de la aplicación (ej. MiProyecto.application/pom.xml) agregando el elemento de assembly como en el ejemplo siguiente:


<image>
.
.
<assemblies>
<assembly>
<basedir>/</basedir>
<descriptorRef>artifact</descriptorRef>
</assembly>
<assembly>
<name>plugins</name>
<descriptorRef>dependencies</descriptorRef>
<targetDir>/resources/addons/plugins</targetDir>
</assembly>
</assemblies>
</image> 

Esta configuración va a producir la siguiente estructura de directorios y Dockerfile. 

target-build-dockerfile

Posteriormente la imagen de Docker será construida incluyendo las dependencias del repositorio y las colocará en la ruta del contenedor especificada en el elemento XML assembly/targetDir. En este caso: /resources/addons/plugins

En el caso de las librerías EMS es necesario colocarlas en el folder plugins (/resources/addons/plugins) con el formato comprimido pues de ahí son tomadas y copiadas al momento de desplegar la aplicación en el contenedor.

Desplegar aplicación BWCE desde Business Studio


Con todos los cambios de arriba realizados y probada la conexión al repositorio de Artifacts de Azure desde el proyecto de BWCE, realizar el despliegue utilizando los siguientes goals de Maven:

docker:build

clean package initialize com.tibco.plugins:bw6-maven-plugin:bwfabric8json docker:build

docker:start

initialize docker:start -Ddocker.property.file=docker-dev.properties

Con todo esto hecho ya deben poder ver su contenedor iniciado con las dependencias de EMS resueltas exitosamente.

Les dejo un video de cómo desplegar Aplicación TIBCO BusinessWorks Container Edition en Docker con Azure Artifact.


Espero les sirva.

lunes, 11 de julio de 2022

Unable to read data from the transport connection: net_io_connectionclosed

Resolver Unable to read data from the transport connection: net_io_connectionclosed


Hola.

Estoy obteniendo el siguiente error al hacer envíos de correo electrónico utilizando ASP.NET. Estoy utilizando el Framework 4.0 

El error completo es el siguiente:

20220704 12:30:32 : Application Mail Error: System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed.

   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)

   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)

   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)

   at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response)

   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)

   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   --- End of inner exception stack trace ---

   at System.Net.Mail.SmtpClient.Send(MailMessage message)

   at Models.Funciones.enviarEmailRegistroActivacion(SegmentoModel _model) in C:\www\www.misitio.com\Models\Funciones.cs:line 166


La razón es que Microsoft ha dejado de dar soporte para TLS1.0 y TLS1.1 para los endpoints default de SMTP. En mi caso smtp.office365.com

El problema es que las definiciones de SecurityProtocolType.Tls11 y SecurityProtocolType.Tls12 no están definidas en en el Framework 4.0 por lo que se tienen que especificar con una representación numérica de estos valores.

Abajo dejo el bloque de código con la linea de código que agregué para hacer funcionar el envío de correos. 

ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

net_io_connectionclosed

Solución.


La configuration de envío que estoy usando es similar a la siguiente en donde he agregado el atributo enableSsl="true" a mi configuración smtp. Si no lo hiciera desde ahí se tiene que agregar en el código mismo.

<system.net>
  <mailSettings>
      <smtp from="noreply@noreply.net">
    <network host="smtp.office365.com" password="mipassword" port="587" userName="micuenta@misitio.com" enableSsl="true" />
      </smtp>
   </mailSettings>
</system.net>

Estoy usando el siguiente código para realizar el envío de correo electrónico, en negritas lo que he agregado:

public static void enviarEmailRegistroActivacion(RegistrarUsuarioSegmentoModel _model)
{
var bodyMail="";
MailAddress a = new MailAddress(_model.EMAIL);
MailAddress de = new MailAddress(p_FromMail);
MailMessage message = new MailMessage(de, a);

if (p_bcc_email.Length > 0)
{
MailAddress bcc = new MailAddress(p_bcc_email);
message.Bcc.Add(bcc);
}

message.IsBodyHtml = true;
message.Subject = "Activación de cuenta para ingreso";

bodyMail = "<p>Hola " + _model.NOMBRE + ".</p>";
bodyMail += "Recibimos sus datos correctamente.<br/>";
bodyMail += "<p>Atentamente,</p>";

message.Body = bodyMail;
// Use the application or machine configuration to get the
// host, port, and credentials.
//Allow TLS 1.0, 1.1 and 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

SmtpClient client = new SmtpClient();
//client.EnableSsl=true;
try
{
client.Send(message);
}
catch (Exception ex)
{
Funciones.GrabaArchivo(ArchivoLog, "Application Mail Error: " + ex.ToString(), true);
}
}        

Si no se agrega la propiedad EnableSsl, obtengo el siguiente error:
 

20220704 13:01:17 : Application Mail Error: System.Net.Mail.SmtpException: Error in processing. The server response was: 5.7.3 STARTTLS is required to send mail [MN2PR15CA0060.namprd15.prod.outlook.com]

   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)

   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)

   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)

   at System.Net.Mail.SmtpClient.Send(MailMessage message)


Con estos cambios, volver a generar el proyecto e intentar el envío de correo nuevamente.
La recomendación para resolver este problema es moverse a un Framework más actual para evitar este escenario de error.

Referencias:


Espero les sirva.