JasperReports

erdi

Well-Known Member
20.08.2008
265
36
35
Краснодар
#1
Пытаюсь для вывода отчетов подключить Jasper, но пока никак не выходит.
Все библиотеки, которые были в jasper положил в клиента в jvm/lib/ext(пока пытаюсь на клиенте поднять отчеты, клиент 8.5.1)
В дизайнере в параметрах Java эти библиотеки подхватываются
Создаю Java агента и вставляю код для экспорта в pdf(docx, html и т.д.) в тело агента.
Агент сохраняется все замечательно, никаких ошибок, все необходимые классы импортнулись в проект, но при выполнении агента возникает ошибка - "net.sf.jasperreports.engine.JRException: Error loading expression class - ...."
При чем этот самый код в чистом эклипсе работает на ура.
Пробовал из тела агента вызывать класс, в котором описано все взаимодействия с jasper. но результат тот же. точнее ошибка такая же.
Но, если этот класс вызывать не в агенте, а выполнить этот класс, то все нормально выгружается, значит проблема именно во взаимодействии Lotus агента и jasper. Причем, кажется проблема в доступе куда-то, но куда - я так и не нашел.

Может кто направит в нужном направлении, где поискать или что куда-нибудь прикрутить.
 

erdi

Well-Known Member
20.08.2008
265
36
35
Краснодар
#3
скорее не так понял...речь идет об обычном import в классе(например - import net.sf.jasperreports.engine.JRException). В 7-ке даже на эту запись ругалось из-за старой ява машины(1,3) в лотусе, а вот в 8.5.1 все гуд....
для наглядности приведу код
есть 2 класса:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">jasper и JavaAgent</div></div><div class="sp-body"><div class="sp-content">код класса jasper
<!--shcode--><pre><code class='java'>import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRCsvDataSource;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.util.JRLoader;

public class jasper {

private static JRCsvDataSource getDataSource() throws JRException {
String[] columnNames = new String[]{"city", "id", "name", "address", "state"};
JRCsvDataSource ds = new JRCsvDataSource(JRLoader.getLocationInputStream("c:/CsvDataSource.txt"));
ds.setRecordDelimiter("\r\n");
ds.setColumnNames(columnNames);
return ds;
}

public static void docx() throws JRException {
long start = System.currentTimeMillis();
File sourceFile = new File("c:/CsvDataSourceReport.jrprint");

JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(sourceFile);

File destFile = new File(sourceFile.getParent(), jasperPrint.getName() + ".docx");

JRDocxExporter exporter = new JRDocxExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, destFile.toString());

exporter.exportReport();

System.err.println("DOCX creation time : " + (System.currentTimeMillis() - start));
}

public static void pdf() throws JRException {
long start = System.currentTimeMillis();
//Preparing parameters
Map parameters = new HashMap();
parameters.put("ReportTitle", "Address Report");
parameters.put("DataFile", "CsvDataSource.txt - CSV data source");
Set states = new HashSet();
states.add("Active");
states.add("Trial");
parameters.put("IncludedStates", states);

String file = JasperFillManager.fillReportToFile("c:/CsvDataSourceReport.jasper", parameters, getDataSource());
JasperExportManager.exportReportToPdfFile(file, "c:/hello_report.pdf");
System.err.println("PDF creation time : " + (System.currentTimeMillis() - start));
}

public static void main(String[] args) {
try {
pdf();
docx();
System.out.println("готово");
}
catch (JRException e) {
e.printStackTrace();
}
}

}[/CODE]
код класса JavaAgent
<!--shcode--><pre><code class='java'>import lotus.domino.*;

public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
jasper.pdf();
}
catch (Exception e) {
e.printStackTrace();
}
}
}[/CODE]
если класс jasper выполнить самостоятельно, то все нормально, а если вызвать этот класс в классе JavaAgent, то ошибка :(
 
#4
Может кто направит в нужном направлении, где поискать...
искать лучше всего здесь ;-)
Первая же ссылка... А в четвертой - вообще ваш случай: JasperReports Problem Lotus Notes/Domino Agent
или что куда-нибудь прикрутить.
добавьте в файле jvm/lib/security/java.policy в секцию grant:
Код:
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getProtectionDomain";
 

erdi

Well-Known Member
20.08.2008
265
36
35
Краснодар
#6
спасибо, сработало
в гугл идти по названию ошибки это правило хорошего тона, само-самой разумеющиеся....
и ссылку я эту видел, но там меня смутил последний не отвеченный вопрос о том что "Как вы ее решили в конце концов?", посчитал что решение неокончательное
 

vitte

Well-Known Member
17.11.2011
57
0
#7
Пробую использовать JasperReports. Клиент LN v. 7.0.3. Если использовать последние версии JasperReports LN выдает ошибку при компиляции: class file has wrong version 49.0 should be 48.0.
Не ругается на версии JasperReports <= 3.7.1.
Существует ли возможность использовать в LN 7.0.3 JasperReports последних версий?
Подскажите где можно смотреть/почитать?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#8

vitte

Well-Known Member
17.11.2011
57
0
#9
Понятно (. Спасибо. Переписывать, это конечно врядли, я явой недели 2 занимаюсь. Буду пытаться 3.7.1 использовать. Пока тоже не получается , на фонты ругается, зараза.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#10
если там используется FOP (я не помню) - то фонты надопрописывать в его (ФОПа) конфиге...
я здесь код выкладывал, для ФОПа, в нём это есть, возможно что в jasperreports есть надстройка, но я не знаю о ней
для ФОПа делал так:<!--shcode--><pre><code class='java'> ByteArrayInputStream iscfg = new ByteArrayInputStream(sUserConfig.getBytes());
DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
Configuration cfg = cfgBuilder.build(new InputSource(iscfg));
fopFactory.setUserConfig(cfg);[/CODE]
где sUserConfig - стринг определённый в классе, по сути содержит хмл
вот так я "брал" из вайна (в линухах), т.е. основное - font-base:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">xml-код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='xml'><fop version='1.0'>
<font-base>/home/mike/.wine/drive_c/windows/</font-base>
<default-page-settings height="11in" width="8.26in"/>
<renderers>
<renderer mime='application/pdf'>
<fonts>
<!-- TTF fonts -->
<!-- Arial -->
<font kerning='yes' embed-url='Fonts/arial.ttf'>
<font-triplet name='Arial' style='normal' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/arialbd.ttf'>
<font-triplet name='Arial' style='normal' weight='bold'/>
</font>
<font kerning='yes' embed-url='Fonts/ariali.ttf'>
<font-triplet name='Arial' style='italic' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/arialbi.ttf'>
<font-triplet name='Arial' style='italic' weight='bold'/>
</font>
<font kerning='yes' embed-url='Fonts/times.ttf'>
<font-triplet name='TimesNewRoman' style='normal' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/timesbd.ttf'>
<font-triplet name='TimesNewRoman' style='normal' weight='bold'/>
</font>
<font kerning='yes' embed-url='Fonts/timesi.ttf'>
<font-triplet name='TimesNewRoman' style='italic' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/timesbi.ttf'>
<font-triplet name='TimesNewRoman' style='italic' weight='bold'/>
</font>
<font kerning='yes' embed-url='Fonts/cour.ttf'>
<font-triplet name='Courier' style='normal' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/courbd.ttf'>
<font-triplet name='Courier' style='normal' weight='bold'/>
</font>
<font kerning='yes' embed-url='Fonts/couri.ttf'>
<font-triplet name='Courier' style='italic' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/courbi.ttf'>
<font-triplet name='Courier' style='italic' weight='bold'/>
</font>
<font kerning='yes' embed-url='Fonts/verdana.ttf'>
<font-triplet name='Verdana' style='normal' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/verdanab.ttf'>
<font-triplet name='Verdana' style='normal' weight='bold'/>
</font>
<font kerning='yes' embed-url='Fonts/verdanai.ttf'>
<font-triplet name='Verdana' style='italic' weight='normal'/>
</font>
<font kerning='yes' embed-url='Fonts/verdanaz.ttf'>
<font-triplet name='Verdana' style='italic' weight='bold'/>
</font>
</fonts>
</renderer>
</renderers>
</fop>[/CODE]
 

vitte

Well-Known Member
17.11.2011
57
0
#11
нет у меня другая ошибка вылазит:
<...Running com.ixtlansoft.myjasper.JasperExampleTest
янв 11, 2012 1:32:10 PM net.sf.jasperreports.extensions.DefaultExtensionsRegistry loadRegistries
SEVERE: Error instantiating extensions registry for fonts
net.sf.jasperreports.engine.JRRuntimeException: Could not load class net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
at net.sf.jasperreports.engine.util.ClassUtils.instantiateClass(ClassUtils.java:64)
at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.instantiateRegistry(De
faultExtensionsRegistry.java:198).....>
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#12
куда положили либы? если не в jvm/lib/ext (это такой каталог не диске, где установлена нотусня) - могут быть разные траблы
 

vitte

Well-Known Member
17.11.2011
57
0
#13
да это даже ещё не лотус.. простой пример запустить не могу в нетбтне
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#14
странно апример-то откудова - сами сочиняли или готовый из сорцов взяли?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#16
turumbay рассказывает про более актуальную версию...
и не факт, что строки:
jasperreports_extension.properties:
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engin
e.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ireport=irfonts.xml
будут дейстоввать в ранней - надо смореть классы (могут иметь др. архитектуру)
исходя из сообщения (ою ошибке) - именно этот класс и не находит
 
#17
нет у меня другая ошибка вылазит:
<...Running com.ixtlansoft.myjasper.JasperExampleTest
янв 11, 2012 1:32:10 PM net.sf.jasperreports.extensions.DefaultExtensionsRegistry loadRegistries
SEVERE: Error instantiating extensions registry for fonts
net.sf.jasperreports.engine.JRRuntimeException: Could not load class net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
at net.sf.jasperreports.engine.util.ClassUtils.instantiateClass(ClassUtils.java:64)
at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.instantiateRegistry(De
faultExtensionsRegistry.java:198).....>
http://www.jarvana.com/jarvana/view/net/sf....java?format=ok
Попробуйте создать собственный класс по образу и подобию и подключить в jasperreports_extension.properties вместо родного.
Как-то оно взлетало и в семерке, но кода под рукой нету, а на память не скажу. Но версию пришлось понижать - это факт. Возможно, как раз до 3.7.
Я, помница, брал соответствующую версию ireport и смотрел проект, который она генерит. На основании этого клеил под R7.
Вечером попробую найти, отпишусь...

P.S. с джаспером( и прочими, использующими Apache Common Logging ) есть еще один хитрый нюанс: если будете включать либы в агента - получите утечку памяти. Для решения проблемы нужно отпустить класслоадер:
Код:
 ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
LogFactory.release(contextClassLoader);
Подробнее тут
 

vitte

Well-Known Member
17.11.2011
57
0
#18
включил в проект 3 класса по образу и подобию:
FontExtensionsRegistry
SimpleFontExtensionHelper
SimpleFontExtensionsRegistryFactory
подключил их, и вроде нормально создался jar, но под java 7. При построении под под java 4
выдает <!--QuoteBegin-ошибку+-->
<table border="0" cellpadding="0" cellspacing="0" align="center" width="98%"> [tr] <td class="vbquote"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="75" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="50px"> [tr] <td class="vbquote" width="28" valign="top">
</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quote-bg.gif'); background-position: center;" valign="middle"><span class="vbquote">Цитата:</span></td> <td class="vbquote" valign="top">
</td> [/tr] </table> </td> <td class="vbquote" align="left" style="background-image: url('style_images/ckr/quotes/quot-lr-bg.gif')" valign="bottom"></td><td class="vbquote" width="0" align="left" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="200"> [tr] <td class="vbquote" valign="top">
</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quot-bye-bg.gif')" align="left" valign="middle" nowrap="nowrap"><span class="vbquote">(ошибку)</span></td> <td class="vbquote" valign="top">
</td> [/tr] </table> </td><td class="vbquote" width="100%" align="right" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="100%"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" style="background-image: url('style_images/ckr/quotes/quot-top-bg.gif')" width="100%" valign="middle"></td> <td class="vbquote" align="left" valign="top">
</td> [/tr] </table> </td> [/tr] </table> </td> [/tr] </table> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-left.gif')"></td> <td class="vbquotemain" width="100%" valign="top"></td> <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-right.gif')"></td> [/tr] [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quot-left-bg.gif')"></td> <td class="vbquotemain" width="100%" valign="top"><!--QuoteEBegin-->cd D:\temp\myJasper\myJasper; "JAVA_HOME=C:\\Program Files\\Java\\j2sdk1.4.2_16" "\"C:\\Program Files\\NetBeans 7.0.1\\java\\maven\\bin\\mvn.bat\"" clean install
java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli (Unsupported major.minor version 49.0)<!--QuoteEnd--></td> [/tr] [tr] [/tr] </table> </td> [/tr] </table>
<!--QuoteEEnd--><div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">остальной стек-трейс</div></div><div class="sp-body"><div class="sp-content">
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.ja
va:386)
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstSt
rategy.java:42)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.getMainClass(Launcher.java:145
)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:2
67)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java
:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Exception in thread "main"
сейчас ищу способы как это препятствие обойти (
 
#19
Вечером попробую найти, отпишусь...
Вариант 1:(как было у меня) тупо понизить версию jasperreports до 3.0.0
В 3.0.0 нету font extension и достаточно положить файл шрифта в classpath.

Вариант 2: (более толковый, но слегка шаманский) найден по мотивам этого поста.
чтобы в R7 взлетел jasper 3.7.1, можно выполнить следующий танец
- добавить в проект классы из 3.7.2: FontExtensionRegistry, SimpleFontExtensionHelper и SimpleFontExtensionsRegistryFactory из пакета net/sf/jasperreports/engine/fonts/
- поправить код класса SimpleFontExtensionHelper ( в семерке используется слегка древняя реализация org.w3c.dom.* )
далее, по известной схеме.

В аттачах - два проекта, под первый и второй вариант соответственно.

В первом проекте, заодно продемонстрирована возможность тестирования мавеновского проекта прямо в нотусовой jvm.
Для этого в pom.xml в настройках maven-surefire-plugin нужно указать путь к лотусовой java.exe ( у меня: c:\lotus\notes\jvm\bin\java.exe )
Дать в папке проекта команду mvn clean test. В результате должен появится заветный preved.pdf
Также в проекте настроен assembly-plugin - для сборки готового jar-ника ( подробности смотри в статье на постеросе )

Если есть установленный эклипс (лучше 3.7, там поддержка мавена "из коробки") - то достаточно импортировать проект, заменить в build path проекта дефолтную jvm на лотусовую и запустить тесты.
Именно так делался второй проект, поэтому там нет возни с секцией build вообще...
 

Вложения

#20
выдает ошибку:

cd D:\temp\myJasper\myJasper; "JAVA_HOME=C:\\Program Files\\Java\\j2sdk1.4.2_16" "\"C:\\Program Files\\NetBeans 7.0.1\\java\\maven\\bin\\mvn.bat\"" clean install
java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli (Unsupported major.minor version 49.0)
сам мавен требует версии java не ниже 1.5.
при этом в качестве "рабочей"(той, под которой будет компилироваться или тестироваться) можно указать любую jvm.
Т.о. обычно делается так: JAVA_HOME - указывает на нормальную jdk. ( рекомендуется последняя, т.е. на текущий момент 1.7-u2 ). Это ваша девелоперская jdk, в которой работает maven, eclipse и пр.

В настройках проекта указывается нужная(проекту) версия компилятора:
<properties>
...
<maven.compiler.source>1.4</maven.compiler.source>
<maven.compiler.target>1.4</maven.compiler.target>
</properties>

При желании, можно запустить компиляцию и/или тесты в jvm, отличной от JAVA_HOME. Описание конфигурации в предыдущем посте.