簡體   English   中英

Java 程序在構建時運行,但不在胖 jar 中

[英]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 中,然后將其添加到類路徑中。 通過“找不到輸入流”錯誤,我猜這與這些字體有關。 但是在正常的清理和構建過程中一切正常,但我不明白為什么胖罐不起作用。

有任何想法嗎?

編輯:與報告中條形碼的字體擴展非常相似

我被同樣的問題困了兩天,我找不到任何幫助我的東西。 我希望這可以幫助任何面臨同樣問題的人。

這是我解決問題的方法。

首先,我正在使用的工具

  • Jaspersoft Studio 創建我的報告 6.0.3
  • Jasperreport 庫 6.0.3
  • Arial Unicode MS,嵌入字體
  • Netbeans 8.0.2

所以,首先我修改了文件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM