Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JasperPrint在Mac上打开一个危险的托盘图标,可能会杀死Tomcat_Java_Tomcat_Jasper Reports_Pdf Generation - Fatal编程技术网

Java JasperPrint在Mac上打开一个危险的托盘图标,可能会杀死Tomcat

Java JasperPrint在Mac上打开一个危险的托盘图标,可能会杀死Tomcat,java,tomcat,jasper-reports,pdf-generation,Java,Tomcat,Jasper Reports,Pdf Generation,我有一个会计web应用程序的问题,该应用程序最近通过使用Jasper报表进行打印而得到增强。作为一个会计应用程序,已决定将其部署到会计工作站,该工作站是一台Mac Book Pro笔记本电脑,具有MySQL数据库的定期备份。因此,在一台严肃的服务器上安装它是不可能的 用户拥有Java8/Tomcat8堆栈,并从命令行运行服务器。到目前为止,这个应用程序运行得很好 每次用户使用Jasper(稍后代码)打印报告时,都会打开一个托盘图标,显示Java控制面板图标 点击那个图标什么也没做,只是很烦人。

我有一个会计web应用程序的问题,该应用程序最近通过使用Jasper报表进行打印而得到增强。作为一个会计应用程序,已决定将其部署到会计工作站,该工作站是一台Mac Book Pro笔记本电脑,具有MySQL数据库的定期备份。因此,在一台严肃的服务器上安装它是不可能的

用户拥有Java8/Tomcat8堆栈,并从命令行运行服务器。到目前为止,这个应用程序运行得很好

每次用户使用Jasper(稍后代码)打印报告时,都会打开一个托盘图标,显示Java控制面板图标

点击那个图标什么也没做,只是很烦人。我可以看到(从Finder顶部栏)窗口被称为
Bootstrap
。除退出外,没有可用的菜单操作。单击Exit将杀死Tomcat服务器

代码如下:

@Override
public byte[] generateReportPdf(List<?> dtos, String jasperFilename, Locale locale)
{
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    try
    {
        JasperPrint jasperPrint = createJasperPrint(dtos, jasperFilename, locale);

        JRPdfExporter exporter = new JRPdfExporter();
        SimplePdfExporterConfiguration config = new SimplePdfExporterConfiguration();
        config.setEncrypted(true);
        config.set128BitKey(true);
        config.setOwnerPassword(PSW_CRYPT_PDF);
        config.setPermissions(PdfWriter.ALLOW_PRINTING);

        exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(byteArrayOutputStream));
        exporter.setConfiguration(config);
        exporter.exportReport();
    }
    catch (Exception e)
    {
        logger.error(e.getMessage(), e);
        throw new RuntimeException("PDF error", e);
    }
    finally
    {
        try
        {
            byteArrayOutputStream.close();
        }
        catch (IOException e)
        {
            logger.error(e.getMessage(), e);
        }
    }

    return byteArrayOutputStream.toByteArray();
}

private JasperPrint createJasperPrint(List<?> dtos, String jasperFilename, Locale locale) throws JRException
{
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream inputStream = classLoader.getResourceAsStream(JASPER_REPORT_FOLDER + jasperFilename + ".jrxml");
    JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
    //JasperReport jasperReport = (JasperReport) JRLoader.loadObject(classLoader.getResource(JASPER_REPORT_FOLDER + jasperFilename + ".jasper"));

    // set mas pages and timeout
    jasperReport.setProperty(MaxPagesGovernor.PROPERTY_MAX_PAGES_ENABLED, "true");
    jasperReport.setProperty(MaxPagesGovernor.PROPERTY_MAX_PAGES, "50");
    jasperReport.setProperty(TimeoutGovernor.PROPERTY_TIMEOUT_ENABLED, "true");
    jasperReport.setProperty(TimeoutGovernor.PROPERTY_TIMEOUT, "60000");
    jasperReport.setProperty("net.sf.jasperreports.default.font.name", "DejaVu Sans");
    jasperReport.setProperty("net.sf.jasperreports.default.pdf.embedded", "true");
    jasperReport.setProperty("net.sf.jasperreports.default", "DejaVu Sans");

    JRBeanCollectionDataSource jrDataSource = new JRBeanCollectionDataSource(dtos, false);

    HashMap<String, Object> parameters = new HashMap<>();
    parameters.put(JRParameter.REPORT_LOCALE, locale);
    return JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
}
@覆盖
公共字节[]generateReportPdf(列表DTO、字符串jasperFilename、区域设置)
{
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
尝试
{
JasperPrint JasperPrint=createJasperPrint(dtos、jasperFilename、locale);
JRPdfExporter exporter=新的JRPdfExporter();
SimplePDExporterConfiguration配置=新建SimplePDExporterConfiguration();
config.setEncrypted(true);
config.set128位键(true);
config.setOwnerPassword(PSW_CRYPT_PDF);
config.setPermissions(PdfWriter.ALLOW_PRINTING);
exporter.setExporterInput(新的SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(新的SimpleOutputStreamExportRoutPut(byteArrayOutputStream));
exporter.setConfiguration(配置);
出口商。出口报告();
}
捕获(例外e)
{
logger.error(e.getMessage(),e);
抛出新的运行时异常(“PDF错误”,e);
}
最后
{
尝试
{
byteArrayOutputStream.close();
}
捕获(IOE异常)
{
logger.error(e.getMessage(),e);
}
}
返回byteArrayOutputStream.toByteArray();
}
私有JasperPrint createJasperPrint(列表DTO、字符串jasperFilename、区域设置)引发异常
{
ClassLoader ClassLoader=Thread.currentThread().getContextClassLoader();
InputStream InputStream=classLoader.getResourceAsStream(JASPER_REPORT_FOLDER+jasperFilename+“.jrxml”);
JasperDesign JasperDesign=JRXmlLoader.load(inputStream);
JasperReport-JasperReport=JasperCompileManager.compileReport(jasperDesign);
//JasperReport JasperReport=(JasperReport)JRLoader.loadObject(classLoader.getResource(JASPER_REPORT_FOLDER+jasperFilename+“.JASPER”);
//设置mas页面和超时
jasperReport.setProperty(MaxPagesGovernor.PROPERTY_MAX_PAGES_ENABLED,“true”);
jasperReport.setProperty(MaxPagesGovernor.PROPERTY_MAX_PAGES,“50”);
jasperReport.setProperty(TimeoutGovernor.PROPERTY_TIMEOUT_ENABLED,“true”);
jasperReport.setProperty(TimeoutGovernor.PROPERTY_TIMEOUT,“60000”);
setProperty(“net.sf.jasperreports.default.font.name”,“DejaVu Sans”);
setProperty(“net.sf.jasperreports.default.pdf.embedded”,“true”);
setProperty(“net.sf.jasperreports.default”、“DejaVu Sans”);
JRBeanCollectionDataSource JRDasource=新的JRBeanCollectionDataSource(dtos,false);
HashMap参数=新的HashMap();
parameters.put(jrparmeter.REPORT\u LOCALE,LOCALE);
返回JasperFillManager.fillReport(jasperReport、参数、jrDataSource);
}
问题是 为什么它只发生在Mac上?如何防止托盘图标出现?
我们开发人员正在运行Windows 10或SUSE Linux主机,我们的机器上没有这个问题,甚至在运行Windows 7的SIT环境中也没有。JasperReports使用AWT进行文本测量和图像处理。当Java进程在图形环境中运行时(即作为登录到桌面环境会话的用户的进程),默认情况下AWT类使用该环境进行图形处理。Mac OS将图形处理解释为进程具有某种UI的证据,因此将Java进程作为应用程序包含在任务栏中


如果不希望发生这种情况,可以通过在Tomcat中的Java选项中添加
-Djava.AWT.headless=true
来强制Java进程进入无头AWT模式。这将导致AWT使用无头图形环境实现,而不是桌面环境。

代码放在哪里(servlet,applet)?servlet。它是一个Ajax web应用程序。客户端连接到课程的本地主机我可能会接受这个答案,只是等待用户的确认