Primeiro detalhe: atenção aos jars:
Usei commons-collections-3.2.2.jar (deve ser versão 3x por causa do ReferenceMap)
Usei itext-2.1.7.js4.jar - necessariamente esta versão!
Usei jasperreports-6.7.0.jar - a mais atualizado para esta data.
Usei mysql-connector-java-8.0.11.jar - correspondente à minha versão do mySQL
Tive problema com timeZone, então a minha string de conexão tive que colocar assim
jdbc:mysql://localhost:3307/financas?useTimezone=true&serverTimezone=UTC&useSSL=false", "root", "minha_senha" ...
Outro detalhe: tive problemas com o JREExplorer, está deprecated nesta data. Então fiz alterações conforme código abaixo, e funcionou tudo corretamente! ...
package br.com.caelum.financas.relatorio;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.io.File;
import br.com.caelum.financas.ConnectionFactory;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
public class TesteGeraRelatorio {
public static void main(String[] args) throws SQLException, JRException, FileNotFoundException {
// Testando se o arquivo compilado existe. Ele é necessário para se criar o PDF.
File tmp = new File("financas.jasper");
if (!tmp.exists()) { // Arquivo não existe ainda. Relatório não foi compilado.
JasperCompileManager.compileReportToFile("financas.jrxml"); // Compilando antes.
}
// Criando conexão com o banco de dados.
Connection conexao = new ConnectionFactory().getConnection();
// Criando o HashMap de parâmetros.
Map<String, Object> params = new HashMap<String, Object>();
// Gerando o relatório.
JasperPrint jPrint = JasperFillManager.fillReport("financas.jasper", params, conexao);
conexao.close(); // Não precisaremos mais da conexão.
// Criando objeto que gerencia a exportação
JRPdfExporter exporter = new JRPdfExporter();
// Setando as configurações de entrada e saída no objeto que gerencia a exportação
exporter.setExporterInput(new SimpleExporterInput(jPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("financas.pdf"));
// Gravando o PDF.
exporter.exportReport();
}
}