Arquitetura, Java, Programming

Menos Classpath Hell com módulos do Java 9

Digamos que você tem um código que, por reflexão, usa a classe Resolucao12 para chamar o método designacao:

package br.gov.anvisa;

import java.lang.reflect.Method;

public class Main {
  public static void main(String[] args) throws Exception {
    Class classe = Class.forName("br.gov.anvisa.resolucoes.Resolucao12");
    Object objeto = classe.newInstance();
    Method metodo = classe.getMethod("designacao");
    System.out.println(metodo.invoke(objeto));
  }
}

Não há dependência em compile time a essa classe Resolucao12. Precisamos dela apenas em runtime. Continue lendo

Anúncios
Arquitetura, Java, Programming

Como usar JARs não modularizados em um módulo do Java 9?

Você resolveu usar Java 9 no seu projeto e criou um módulo:

module br.com.alexandreaquiles.projeto {
}

Por padrão, todo módulo “puxa” o java.base, que disponibiliza pacotes como java.lang, java.math, java.util e java.io.

Vamos dizer que seu código usa o JDBC. Pra poder ter acesso a interfaces como Connection e PreparedStatement, você precisa dizer que usa o módulo java.sql:

module br.com.alexandreaquiles.projeto {
    requires java.sql;
}

JARs não modularizados

Agora, digamos que o seu projeto usa a biblioteca commonmark, responsável por renderizar arquivos Markdown.

Os desenvolvedores dessa biblioteca não criaram um module-info.java. Ou seja, o JAR do commonmark não está modularizado.

O que preciso colocar no requires pra usar classes dessa biblioteca no meu código?

Continue lendo

Arquitetura, Java

Fila de Mensagens Mortas

O que acontece quando há uma exceção em um recebedor registrado em uma fila?

Por exemplo:

@MessageDriven(activationConfig = {
  @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/FILA"),
  @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class RecebedorMDB implements MessageListener {
  public void onMessage(Message msg) {
    throw new RuntimeException("Erro!");
  }
}

A classe acima é um Message Driven Bean (MDB) registrado em FILA que lança uma exceção não checada ao receber uma mensagem.

Se verificarmos a fila, a mensagem foi consumida. Só que aconteceu um erro!

Continue lendo