Java JasperPrint在Mac上打开一个危险的托盘图标,可能会杀死Tomcat
我有一个会计web应用程序的问题,该应用程序最近通过使用Jasper报表进行打印而得到增强。作为一个会计应用程序,已决定将其部署到会计工作站,该工作站是一台Mac Book Pro笔记本电脑,具有MySQL数据库的定期备份。因此,在一台严肃的服务器上安装它是不可能的 用户拥有Java8/Tomcat8堆栈,并从命令行运行服务器。到目前为止,这个应用程序运行得很好 每次用户使用Jasper(稍后代码)打印报告时,都会打开一个托盘图标,显示Java控制面板图标 点击那个图标什么也没做,只是很烦人。我可以看到(从Finder顶部栏)窗口被称为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控制面板图标 点击那个图标什么也没做,只是很烦人。
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应用程序。客户端连接到课程的本地主机我可能会接受这个答案,只是等待用户的确认