首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java程序在构建时运行,而不是在fat jar中运行

Java程序在构建时运行,而不是在fat jar中运行
EN

Stack Overflow用户
提问于 2014-07-26 01:21:32
回答 5查看 3.4K关注 0票数 4

我有一个java应用程序,它使用Jasper报告API来生成PDF。它构建得很好,但我必须通过Netbeans/iReport插件添加一些字体,以便在导出PDF时显示它们。在clean and build上,一切都很好。

但是,当我构建一个fat jar时(通过build.xml中的几行存储包),报告将不会运行。通过终端运行时,我得到这个错误(对于文本墙,很抱歉):

代码语言:javascript
复制
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中,然后将其添加到类路径中。根据“未找到输入流”的错误,我猜测这与这些字体有关。但是在正常的清理和构建过程中,一切都工作得很好,但是我不能理解为什么这个胖罐子不能工作。

有什么想法吗?

EDIT:与此Font Extension for barcode in report非常相似

EN

回答 5

Stack Overflow用户

发布于 2015-02-11 13:24:59

我被同样的问题困扰了两天,我找不到任何东西来帮助我。我希望这对任何面临同样问题的人都有所帮助。

下面是我是如何解决这个问题的。

首先,我使用的工具

用于创建my reports 6.0.3

  • Jasperreport Library 6.0.3

  • Arial Unicode MS的

  • Jaspersoft Studio,字体为embedded

  • Netbeans 8.0.2

因此,首先我在jasperreports-6.0.3.jar中修改了文件jasperreports_extension.properties,并添加了以下几行

代码语言:javascript
复制
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 fonts-6.0.3.jar中的文件字体之间存在冲突,最后一个文件将被覆盖。

现在为了包含我的字体(Arial Unicode MS),我编辑了文件/net/sf/jasperreports/fonts/fonts.xml并插入了以下代码:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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>
票数 7
EN

Stack Overflow用户

发布于 2015-04-12 04:29:19

为我解决这个问题的方法是将jasperreports-6.x.x.jar中包含的jasperreports_extension.properties文件的内容附加到我的自定义jasperreports_extension.properties中。

问题是在创建fat jar时,jar中的属性文件被覆盖了。显然,JasperReports会在运行时合并这两个文件。由于缺少原始内容,因此会导致这个稍微误导性的错误。

票数 2
EN

Stack Overflow用户

发布于 2014-07-26 01:25:01

代码语言:javascript
复制
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将无法工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24961180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档