[英]Java program running on build but not in a fat jar
我有一個使用 Jasper Reports API 生成 PDF 的 Java 應用程序。 它構建得很好,但我必須通過 Netbeans/iReport 插件添加一些字體,以便在導出 PDF 時顯示它們。 在干凈和構建它很好,一切正常。
但是當我構建一個胖 jar(通過 build.xml 中的一些 package-for-store 行)時,報告將不會運行。 通過終端運行,我收到此錯誤(對不起,文本牆):
Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError
at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:124)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:89)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:104)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:62)
at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:649)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:971)
at ie.orderofmalta.OMFinancialsForm.yTDReportBtnActionPerformed(OMFinancialsForm.java:283)
at ie.orderofmalta.OMFinancialsForm.access$700(OMFinancialsForm.java:30)
at ie.orderofmalta.OMFinancialsForm$8.actionPerformed(OMFinancialsForm.java:163)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Caused by: net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Input stream not found at : fonts/fontsfamily1406301744789.xml
at net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:188)
at net.sf.jasperreports.engine.fonts.FontExtensionsRegistry.getExtensions(FontExtensionsRegistry.java:56)
at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:110)
at net.sf.jasperreports.engine.util.JRStyledTextParser.<clinit>(JRStyledTextParser.java:83)
... 50 more
Caused by: net.sf.jasperreports.engine.JRException: Input stream not found at : fonts/fontsfamily1406301744789.xml
at net.sf.jasperreports.repo.RepositoryUtil.getInputStreamFromLocation(RepositoryUtil.java:159)
at net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:183)
... 53 more
當我添加字體時,我將它們添加到一個 jar 中,然后將其添加到類路徑中。 通過“找不到輸入流”錯誤,我猜這與這些字體有關。 但是在正常的清理和構建過程中一切正常,但我不明白為什么胖罐不起作用。
有任何想法嗎?
我被同樣的問題困了兩天,我找不到任何幫助我的東西。 我希望這可以幫助任何面臨同樣問題的人。
這是我解決問題的方法。
首先,我正在使用的工具
所以,首先我修改了文件jasperreports_extension.properties內的JasperReports-6.0.3.jar和包括以下行
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml
因為當我建設我的jar文件某種原因出現了從JasperReports的-6.0.3.jar文件jasperreports_extension.properties和一個內部的JasperReports的字體-6.0.3.jar,最后一個將被覆蓋之間的沖突。
現在要包含我的字體(Arial Unicode MS),我編輯了文件/net/sf/jasperreports/fonts/fonts.xml並插入了以下代碼:
<fontFamily name="Arial Unicode MS">
<normal>net/sf/jasperreports/fonts/ArialUnicodeMS/ARIALUNI.TTF</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
</exportFonts>
</fontFamily>
在此之后,我將我的字體包含在 jasperreports-fonts-6.0.3.jar 中。
現在這很重要,當您創建 jar 文件時,請確保在 jasperreports-6.0.3.jar 之前提取 jasperreports-fonts-6.0.3.jar。
這是我的 build.xml
<target name="-post-jar">
<jar jarfile="dist2/Reports.jar">
<zipfileset src="${dist.jar}" excludes="META-INF/*;*.jar;*.txt;*.html" />
<zipfileset src="lib/jetty-all-9.0.3.v20130506.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/lib/jasperreports-javaflow-6.0.3.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/jasperreports-fonts-6.0.3.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/jasperreports-6.0.3.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/mysql-connector-java-5.1.34-bin.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/commons-javaflow-20060411.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/servlet-api-2.4.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/javax.servlet-3.0.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/commons-logging-1.1.1.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/commons-collections-3.2.1.jar" excludes="META-INF/*;*.txt;*.html" />
<zipfileset src="lib/ant-1.7.1.jar" excludes="META-INF/*" />
<zipfileset src="lib/groovy-all-2.0.1.jar" excludes="META-INF/*" />
<zipfileset src="lib/commons-digester-2.1.jar" excludes="META-INF/*" />
<zipfileset src="lib/itextpdf-5.5.0.jar" excludes="META-INF/*" />
<zipfileset src="lib/itext-pdfa-5.5.0.jar" excludes="META-INF/*" />
<zipfileset src="lib/apache-commons-lang.jar" excludes="META-INF/*" />
<zipfileset src="lib/com.lowagie.text-2.1.7.jar" excludes="META-INF/*" />
<zipfileset src="lib/commons-beanutils-1.9.0.jar" excludes="META-INF/*" />
<manifest>
<attribute name="Main-Class" value="Jetty"/>
</manifest>
</jar>
</target>
有什么解決這對我來說是要追加的內容jasperreports_extension.properties
文件中包含jasperreports-6.xxjar
到我的自定義jasperreports_extension.properties
。
問題是在創建胖 jar 時,jar 中的屬性文件被覆蓋了。 顯然 JasperReports 在運行時合並了兩個文件。 由於缺少原始內容,因此會導致這種略有誤導性的錯誤。
Caused by: net.sf.jasperreports.engine.JRException: Input stream not found at : fonts/fontsfamily1406301744789.xml at
net.sf.jasperreports.repo.RepositoryUtil.getInputStreamFromLocation(RepositoryUtil.java:159) at
net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:183)
... 53 more
您需要為您想在此處執行的任何操作提供適當的輸入流。 如果資源在 jar 文件中,您必須編寫特殊代碼來處理它。 FileInputStreams 將不起作用。
@eoinDub:從 fat jar 的類目錄加載報告本身時,我遇到了類似的問題。 所以我使用了“... getResourceAsStream ()”。 我做了這樣的事情(見下面的代碼)。 [實際上我使用了編譯的 *.jasper - 我不記得未編譯的 *.jrxml 是否也有效。]
JasperReport report = null;
InputStream is = MyClass.class.getClassLoader().getResourceAsStream(reportName);
if (FilenameUtils.isExtension(reportName, "jrxml")) {
JasperDesign jd = JRXmlLoader.load(is);
report = JasperCompileManager.compileReport(jd);
} else {
report = (JasperReport) JRLoader.loadObject(is);
}
JRCsvDataSource ds;
try {
ds = new JRCsvDataSource(csvName, csvEncoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return;
}
ds.setUseFirstRowAsHeader(true);
ds.setFieldDelimiter(csvDelimiter.charAt(0));
JasperPrint jprint = JasperFillManager.fillReport(report, reportParams, ds);
try {
JasperExportManager.exportReportToPdfFile(jprint, outPDF);
} catch (Exception e) {
e.printStackTrace();
}
我被同樣的問題困住了。 在我的項目中,我使用 Maven,我注意到在生成 fat .jar 的最后,它拋出了一條消息
jasperreports_extension.properties already added, skipping
在網上看到的關於這個問題的資料中,我了解到這個文件在幾個庫中重復出現,例如:jasperreports 和 jasperfonts; 這會導致它們之間發生沖突,而 Maven 會忽略它們。 所以我所做的是將我的自定義jasperreports_extension.properties
文件放在第一個 Maven 依賴文件中,以便此文件設置首先使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.