簡體   English   中英

Jasper Reports作為Java應用程序的一部分

[英]Jasper Reports as part of Java aplication

我使用的Java應用程序允許您添加用Java編寫的擴展。 我希望在擴展中運行JasperReports查看器。 作為測試,我有以下代碼:

package com.moneydance.modules.features.jasperreports;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JFrame;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.swing.JRViewer;

public class MyJasperReport extends JFrame{
    JasperReport report;
    public MyJasperReport(Main main)  throws JRException, IOException{
      String sourceFileName = "c://users/miker/workspace/JasperReports-6.7.0/test" + 
         "/jasper_report_template.jasper";
    Map<String,Object> parameters = new HashMap<>();
   JasperReport report =(JasperReport)JRLoader.loadObjectFromFile(sourceFileName);
   JRDataSource dataSource = new JREmptyDataSource();
   JasperPrint jasperPrint = null;
   JRViewer viewer = null;
   try {
       jasperPrint = JasperFillManager.fillReport(report, parameters,dataSource);
   }
   catch (JRException e) {
       e.printStackTrace();
   }
   if (jasperPrint != null) {
        viewer = new JRViewer(jasperPrint);
        if (viewer !=null) {
            getContentPane().add(viewer);
        }
    }
}

}

這將失敗,並在行上出現空指針異常:

        btnSave.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/sf/jasperreports/view/images/save.GIF")));

在類JRViewerToolBar中

如果我通過Eclipse在調試中運行它,那么它將起作用。 如果我在代碼中包括JRViewer和JRViewerToolBar類,並更改代碼以使用以下代碼段:

    public Image getIcon(String action) {
    try {
        loader = getClass().getClassLoader();
        java.io.InputStream in = 
                loader.getResourceAsStream(action);
        if (in != null) {
            ByteArrayOutputStream bout = new ByteArrayOutputStream(1000);
            byte buf[] = new byte[256];
            int n = 0;
            while((n=in.read(buf, 0, buf.length))>=0)
                bout.write(buf, 0, n);
            return Toolkit.getDefaultToolkit().createImage(bout.toByteArray());
        }
    } catch (Throwable e) { }
    return null;
}

如果動作是“ /net/sf/jasperreports/view/images/save.GIF”,它也可以工作。

確定資源路徑顯然是一個問題。 我懷疑我正在使用的應用程序使用其自己的類加載器加載我的擴展程序。

問題是:是否有一種加載JasperReports類的方式,以便它們表現出來? 另外,我所看到的只是擴展程序中具有JasperReports的修改版本,這將引入錯誤並成為維護的噩夢。

編輯

這不是文件解析器問題的重復項。 這是關於用於從應用程序中加載Jasper類的類加載器。

問題是Moneydance的CLASS-PATH(正在擴展的應用程序)。 該路徑包含Moneydance的罐子和擴展本身,因為ClassLoader已經擴展。 方法getResourceAsStream已被覆蓋,但是方法getResource尚未覆蓋,因此getResource找不到Jasper資源。 我想出的解決方案是加載包含JasperReports代碼的可執行jar(使用Spring Boot),並在該jar中構建接口。

我使用自定義類加載器加載包含Jasper類的后台任務。 我可以攔截getResources方法並在jar中找到資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM