- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近遇到了一个会计 Web 应用程序的问题,该应用程序最近使用 Jasper Reports 进行了打印增强。作为会计应用程序,已决定将其部署到会计工作站,这是一台 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);
}
为什么它只发生在 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/
编辑:澄清一下,我明白为什么这段代码不起作用,我并不是要修复它,而是想了解如果这段代码可以在没有语义错误的情况下编译会有什么危险。 我发现下面的代码会导致静态语义错误。我知道这是因为 std::lis
我想知道 C# 枚举以及重复值会发生什么。我创建了以下小程序来测试: namespace ConsoleTest { enum TestEnum { FirstElem
正如我在另一个 SO 问题中指出的那样,我遇到了 this article .当我通过 MSVC7.1 编译 boost 1.40 时出现了这个问题,并且弹出了几个 C4251 警告。 现在,在阅读上
我有以下弹出窗口代码(客户端请求)。它使用 eval ,我知道这是危险的。有没有办法重写下面的脚本,使其不使用 (eval)? /* exported popup_default , popup_he
NTFS 文件可以有对象 ID。可以使用 FSCTL_SET_OBJECT_ID 设置这些 ID .然而,msdn article说: Modifying an object identifier c
我一直在学习命令行参数解析。关于这个已经有很长的线索了,我不想在这里挑起一个: Using getopts in bash shell script to get long and short com
这个问题在这里已经有了答案: How to configure ContextMenu buttons for delete and disabled in SwiftUI? (4 个回答) 4 个月
为什么在 linux 的中断处理程序中禁止 printk 或 (I/O)。?在什么情况下中断处理程序中的 I/O 会导致 linux 系统中的死锁? 最佳答案 关于 printk(),它是侵入性的。例
不是 Invoking virtual function and pure-virtual function from a constructor 的重复项: 以前的问题与 C++ 03 相关,而不是
我正在使用 lateinit 属性以避免使用 ?运算符(operator)。我有很多 View 属性是第一次在 getViews() 函数中分配的。如果该功能不存在,我的应用程序将与来自 Kotlin
我最近在使用 fputs 时遇到了问题:当使用 fputs 在文本文件中打印一些字符串时,我碰巧得到了除 A-Z、a-z、0-9 之外的其他字符(不属于字符串的字符) .我绝对确保所有字符串都以空字符
在仅包含字节数组的结构上使用 #pragma pack(1) 是否危险/有风险?例如。这个: #pragma pack(1) struct RpcMessage { uint8_t proto
我是一名优秀的程序员,十分优秀!