Tengo un desarrollo de una aplicación PHP que genera reportes compilado en JasperReports. La forma en que lo hace es generando una instrucción que será ejecutada por medio de la función exec de PHP.
Código PHP:
$cmdline = 'java -Djava.awt.headless=true -Djava.io.tmpdir=/opt/lampp/htdocs/crm2/cache/ -classpath "custom/ZuckerReports2/resources/:custom/ZuckerReports2/resources/areas_negocio.jasper_files/:modules/zr2_Report/jasper/zuckerreports-1.0.jar:modules/zr2_Report/jasper/commons-beanutils-1.8.0.jar:modules/zr2_Report/jasper/batik-anim.jar:modules/zr2_Report/jasper/bcel-5.2.jar:modules/zr2_Report/jasper/barcode4j-2.0.jar:modules/zr2_Report/jasper/ant-1.7.1.jar:modules/zr2_Report/jasper/jasperreports-5.1.0.jar:modules/zr2_Report/jasper/jasperreports-javaflow-4.0.0.jar:modules/zr2_Report/jasper/batik-css.jar:modules/zr2_Report/jasper/servlet.jar:modules/zr2_Report/jasper/commons-digester-1.7.jar:modules/zr2_Report/jasper/batik-awt-util.jar:modules/zr2_Report/jasper/antlr-2.7.5.jar:modules/zr2_Report/jasper/xml-apis-ext.jar:modules/zr2_Report/jasper/poi-3.6.jar:modules/zr2_Report/jasper/iText-2.1.7.jar:modules/zr2_Report/jasper/jxl-2.6.10.jar:modules/zr2_Report/jasper/commons-logging-1.0.4.jar:modules/zr2_Report/jasper/batik-gvt.jar:modules/zr2_Report/jasper/spring-beans-2.5.5.jar:modules/zr2_Report/jasper/mysql-connector-java-3.1.11-bin.jar:modules/zr2_Report/jasper/batik-parser.jar:modules/zr2_Report/jasper/batik-util.jar:modules/zr2_Report/jasper/hibernate3.jar:modules/zr2_Report/jasper/groovy-all-1.7.5.jar:modules/zr2_Report/jasper/barbecue-1.5-beta1.jar:modules/zr2_Report/jasper/jcommon-1.0.15.jar:modules/zr2_Report/jasper/log4j-1.2.15.jar:modules/zr2_Report/jasper/saaj-api-1.3.jar:modules/zr2_Report/jasper/jpa.jar:modules/zr2_Report/jasper/jfreechart-1.0.12.jar:modules/zr2_Report/jasper/spring-core-2.5.5.jar:modules/zr2_Report/jasper/mondrian-3.1.1.12687.jar:modules/zr2_Report/jasper/hsqldb-1.8.0-10.jar:modules/zr2_Report/jasper/jasperreports-applet-4.0.0.jar:modules/zr2_Report/jasper/batik-script.jar:modules/zr2_Report/jasper/serializer.jar:modules/zr2_Report/jasper/commons-collections-2.1.1.jar:modules/zr2_Report/jasper/batik-svggen.jar:modules/zr2_Report/jasper/batik-dom.jar:modules/zr2_Report/jasper/rhino-1.7R1.jar:modules/zr2_Report/jasper/batik-ext.jar:modules/zr2_Report/jasper/xml-apis.jar:modules/zr2_Report/jasper/batik-bridge.jar:modules/zr2_Report/jasper/xercesImpl-2.7.0.jar:modules/zr2_Report/jasper/batik-svg-dom.jar:modules/zr2_Report/jasper/jasperreports-fonts-4.0.0.jar:modules/zr2_Report/jasper/jdt-compiler-3.1.1.jar:modules/zr2_Report/jasper/xalan-2.7.1.jar:modules/zr2_Report/jasper/png-encoder-1.5.jar:modules/zr2_Report/jasper/bsh-2.0b4.jar:modules/zr2_Report/jasper/batik-xml.jar:modules/zr2_Report/jasper/jaxen-1.1.1.jar:modules/zr2_Report/jasper/commons-javaflow-20060411.jar" at.go_mobile.zuckerreports.JasperBatchMain custom/ZuckerReports2/temp/ef6b9f27-ebd6-39b0-f3cd-51e06c6247d5/cmd.properties 2>&1 ';
exec($cmdline, $output, $return_var);
var_dump($output, $return_var);
Código:
Sin embargo, cuando ejecuto la línea "java -Djava.awt.headless=true -Djava.io.tmpdir=/opt/lampp/htdocs/crm2/cache/ -classpath "custom/Zucker...." en la terminal de linux el reporte se genera PERFECTO.Exception in thread "main" java.lang.ExceptionInInitializerError at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:121) at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:88) at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:103) at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:61) at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153) at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:170) at at.go_mobile.zuckerreports.JasperBatchMain.main(JasperBatchMain.java:126) Caused by: net.sf.jasperreports.engine.JRRuntimeException: java.io.IOException: Problem reading font data. at net.sf.jasperreports.engine.fonts.SimpleFontFace.(SimpleFontFace.java:108) at net.sf.jasperreports.engine.fonts.SimpleFontFace.(SimpleFontFace.java:128) at net.sf.jasperreports.engine.fonts.SimpleFontFace.getInstance(SimpleFontFace.java:67) at net.sf.jasperreports.engine.fonts.SimpleFontFamily.setNormal(SimpleFontFamily.java:99) at net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFamily(SimpleFontExtensionHelper.java:261) at net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFamilies(SimpleFontExtensionHelper.java:232) at net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:193) at net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:162) 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.(JRStyledTextParser.java:83) ... 8 more Caused by: java.io.IOException: Problem reading font data. at java.awt.Font.createFont0(Font.java:999) at java.awt.Font.createFont(Font.java:876) at net.sf.jasperreports.engine.fonts.SimpleFontFace.(SimpleFontFace.java:100) ... 18 more
Haciendo investigaciones parece ser un problema de permisos sobre la carpeta temporal que usa java. Sin embargo con el comando -Djava.io.tmpdir=/opt/lampp/htdocs/crm2/cache/ aseguro que la carpeta es escribible.
Lo que sí pude notar es que cuando ejecuto el código PHP antes mencionado se genera un archivo temporal en esta carpeta. Pero la genera con permisos 600 y como propietario el usuario configurado para el Apache.
Cuando lo ejecuto por terminal los archivos generados allí (que por cierto son mucho más) están asignados al usuario root (porque es el usuario con el que estoy logueado supongo) y con los mismos permisos.
Estoy asumiendo que es un problema de permisos, sin embargo no estoy 100%, agradecería cualquier ayuda para desentrañar este inconveniente.
Gracias de antemano.
Saludos.