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

Java, Programming

Module resolution no Java 9 e JavaFX num “módulo sem nome”

– Lembra daquela história de módulo sem nome do Java 9?
O módulo criado automaticamente pelo Java 9 ao executar um JAR não modularizado?

– Isso. Um “módulo sem nome” depende do módulo java.se, que tem como dependências os módulos java.logging, java.sql, java.rmi e mais uma penca, né?
Mas não puxa o módulo java.se.ee, que teria o JAXB no módulo javax.xml.bind e o JAX-WS no java.xml.ws e mais alguns…

– Exato. Conversamos sobre isso daquela outra vez quando deu o NoClassDefFoundError de JAXBException, né?
Isso mesmo!

– O que você acha que aconteceria com esse código?

import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.stage.Stage;

public class OlaMundo extends Application {
  public static void main(String[] args) {
    launch(args);
  }

  @Override
  public void start(Stage stage) throws Exception {
    Alert alerta = new Alert(AlertType.INFORMATION, "Funcionou?", ButtonType.OK);
    alerta.setHeaderText("Janelinha do JavaFX");
    alerta.setResizable(true);
    alerta.showAndWait();
  }
}

Usa o JavaFX, né? Tem declaração de módulo?

Continue lendo

Deployment, Java

Sofrência com Java 9: cadê meu JAXB?

Cara, cadê meu JAXB?
– Hein?

Pô, cara, tava empolgadão aqui com o JDK 9. Atualizei e tal. Aí tentei subir uma aplicação no Tomcat e outra no Jetty e recebi isso na cara:

org.springframework.beans.factory.BeanCreationException: 
  Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/spring-context.xml]: 
  Invocation of init method failed; 
    nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1589)
	...
Caused by: 
  java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
  at org.hibernate.boot.spi.XmlMappingBinderAccess.(XmlMappingBinderAccess.java:43)

– Tô ligado. O famoso NoClassDefFoundError de JAXBException no Java 9.

Não subiu por causa do JAXB? Ué, aquela biblioteca de serialização Java/XML? Mas eu nem uso nos meus projetos…
– Você não usa, mas alguma dependência pode usar. O Hibernate, no caso.

E o JAXB não vem nas libs padrão do JRE?
– Vem, inclusive no JRE 9.

Uai… Por que o erro, então?
– É que o JAXB tá nas libs padrão, mas não fica disponível… Aí, o Hibernate vai usar e: BAM!

Continue lendo