gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:11:26 32 4
gpt4 key购买 nike

我最近遇到了一个会计 Web 应用程序的问题,该应用程序最近使用 Jasper Reports 进行了打印增强。作为会计应用程序,已决定将其部署到会计工作站,这是一台 Mac Book Pro 笔记本电脑,定期备份 MySQL 数据库。因此,将它安装在正式的服务器机器上是不可能的。

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

每次用户使用 Jasper(稍后编写代码)打印报告时,托盘图标将打开,显示 Java 控制面板图标。

Java tray icon

点击那个图标没有任何作用,只是很烦人。我可以看到该窗口(来自 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);
}

问题是

为什么它只发生在 Mac 上?如何防止出现托盘图标?我们的开发人员正在运行 Windows 10 或 SUSE Linux 主机,我们的机器上没有这个问题,甚至在运行 Windows 7 的 SIT 环境中也没有。

最佳答案

JasperReports 使用 AWT 进行文本测量和图像处理等操作。当 Java 进程在图形环境中运行时(即作为登录到桌面环境 session 的用户的进程),AWT 类默认使用该环境进行图形处理。 Mac OS 将图形处理解释为进程具有某种 UI 的证据,因此将 Java 进程作为应用程序包含在任务栏中。

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

关于java - JasperPrint 在 Mac 上打开一个危险的托盘图标,可能会杀死 Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40524752/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com