项目结构:
战争包含:
罐:
Servlet创建一个实例并调用方法generate()
:
@Override
public void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
A a = new a();
a.generate();
}
然后,A.class 中的方法generate
包含以下行:
InputStream is = this.getClass().getResourceAsStream("/reports/foo.jrxml");
InputStream isSubReport = this.getClass().getResourceAsStream("/reports/foo_subreport.jrxml");
JasperDesign jasperDesign = JRXmlLoader.load(isSubReport);
所以,当我从jar项目运行这个方法时,一切都还可以。
然而,当我从war中调用此方法时,将此jar作为依赖项 - 我在线上获得异常
JasperDesign jasperDesign = JRXmlLoader.load(isSubReport);
从jar调用方法的正确方法是什么,它将读取它的资源并使其工作?
更新:
仍无解决方案
如果我把servlet放在与报告相同的战争中 - InputStream工作正常,但如果我通过war和jar拆分它们 - 不起作用。
冻结
在JasperDesign jasperDesign = JRXmlLoader.load(isSubReport);
并且我有一个例外,如果没有深度调试(没有调试没有异常,白屏),这是令人惊讶的甚至没有看到:
Method threw 'net.sf.jasperreports.engine.JRRuntimeException' exception. Cannot evaluate net.sf.jasperreports.engine.JRRuntimeException.toString()
这个例子出现在这里(这是来自jasper-reports lib的类):
public JasperDesign loadXML(InputSource is) throws JRException {
try {
this.digester.push(this);
this.digester.parse(is);
} catch (SAXException var7) {
throw new JRException(var7);
} catch (IOException var8) {
throw new JRException(var8);
} finally {
this.digester.clear(); // this method works fine
}
//this line can not be reached (somewhere appears exception)
if(this.errors.size() > 0) { ...
并且甚至可以清楚地表达某些内容 - " messageKey"和" detailMessage"例外:
util.message.provider.not.found
答案 0 :(得分:0)
将jar文件添加到web-inf / lib文件夹并导入JasperDesign包。
答案 1 :(得分:0)
如果输入流是问题,那么试试这个
ConfigException Xor Conn
答案 2 :(得分:0)
我通过搜索类似的问题找到了答案。
您应该构建没有任何依赖关系的jar。
不应将它们放入jar中,而应将它们添加到战争中。
构建jar并将其作为依赖战争
与jar的依赖关系构建战争
完成