没有为 'sql' 语言注册的查询执行器工厂



关于错误的问题:net.sf.jasperreports.engine.JRRuntimeException:没有为"sql"语言注册查询执行器工厂

我的问题是:每当我试图从开发环境中运行JasperReports时,我都可以生成报告。但当我运行jar文件时,会出现错误。

是否有设置环境变量net.sf.jasperreports.query.executer.factory.sql的变通方法?我试着使用Jasper 6.19.1和6.20.0,但问题是一样的。

该问题与位于jasperreports jar根目录中的default.jsapperreports.properties文件中的此变量有关。

我正在使用IntelliJ Ide和渐变

我创建了一个程序来展示这个问题。只有两个文件。

Main.java

package br.com.mawan.mawanReport;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
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.JasperReport;
import net.sf.jasperreports.view.JasperViewer;
public class Main {
private static final String url = "jdbc:mysql://localhost:3306/wavecounter";
private static final String driver = "com.mysql.cj.jdbc.Driver";
private static final String login = "root";
private static final String pwd = "";
public Main() {}
public void print(String path ) throws JRException, SQLException, ClassNotFoundException {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, login, pwd);
JasperReport report = JasperCompileManager.compileReport( path );
JasperPrint reportFill = JasperFillManager.fillReport( report , null, conn );
JasperViewer.viewReport( reportFill , true );
conn.close();
}
public static void main(String[] args) {
try {
new br.com.mawan.mawanReport.Main().print( "C:\wavecounter\reports\Teste.jrxml" );
} catch (Exception e) {
e.printStackTrace();
}
}
}

build.gradle

plugins {
id 'java'
}
group 'br.com.mawan'
version '1.0.0'
repositories {
mavenCentral()
jcenter()
}
dependencies {
implementation("org.apache.poi:poi:5.2.2")
implementation("com.lowagie:itext:2.1.7")
implementation("org.olap4j:olap4j:1.2.0")
implementation("net.sf.jasperreports:jasperreports:5.6.1")
implementation("net.sf.jasperreports:jasperreports-fonts:5.6.1")
implementation("xerces:xercesImpl:2.10.0")
implementation("mysql:mysql-connector-java:8.0.29")
}
jar {
manifest { attributes "Main-Class": "br.com.mawan.mawanReport.Main" }
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
}

为了解决这个问题,我创建了一个连接两个文件的文件,并将其放在资源中,名称为new.jaspereports_extension.properties.

在jar标签中,我在exclude命令中插入了文件名。之后,插入一个命令,将new.jasperreports_extension.properties重命名为jasperrereports_extension.properties.

jar {
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA','jasperreports_extension.properties'
manifest { attributes "Main-Class": "br.com.mawan.mawanReport.Main" }
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
rename('new.jasperreports_extension.properties', "jasperreports_extension.properties")
}

在那之后,一切都奏效了。

我想表扬爸爸67。

最新更新