diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/JasperReportUtil.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/JasperReportUtil.java index 389b7f2..88635a3 100644 --- a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/JasperReportUtil.java +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/JasperReportUtil.java @@ -36,8 +36,9 @@ import javax.print.attribute.standard.OrientationRequested; @Component @Slf4j public class JasperReportUtil { - private static String template="template"; - private static String templatep="template/"; + private static final String template="template"; + private static final String templatep="template/"; + private static final String TEMPLATE_PATH = JasperReportUtil.getTemplatePath(); /** * 核心打印/导出方法 * @param printerName 打印机名称(可为null,null时使用默认打印机) @@ -100,6 +101,7 @@ public class JasperReportUtil { private static JasperReport loadTemplate(String templateName) throws Exception { // 模板路径:resources/templates/ String templatePath = templatep + templateName; + compileAndSave(templateName); InputStream jasperStream = JasperReportUtil.class.getClassLoader().getResourceAsStream(templatePath + ".jasper"); if (jasperStream != null) { @@ -107,7 +109,6 @@ public class JasperReportUtil { return (JasperReport) JRLoader.loadObject(jasperStream); } else { // 不存在jasper,编译jrxml - compileAndSave(templateName); InputStream jrxmlStream = JasperReportUtil.class.getClassLoader().getResourceAsStream(templatePath + ".jrxml"); if (jrxmlStream == null) { throw new JRException("模板不存在:" + templatePath + ".jrxml/.jasper"); @@ -289,29 +290,28 @@ public class JasperReportUtil { String jrxmlName = jrxmlFileName + ".jrxml"; // jrxml文件名 String jasperName = jrxmlFileName + ".jasper"; // 编译后文件名 - // 2. 获取resources/templates下的jrxml输入流 - InputStream jrxmlStream = JasperReportUtil.class - .getClassLoader() - .getResourceAsStream(templatep + jrxmlName); + if(needCompile(TEMPLATE_PATH+jrxmlName, TEMPLATE_PATH+jasperName)) { + // 2. 获取resources/templates下的jrxml输入流 + InputStream jrxmlStream = JasperReportUtil.class + .getClassLoader() + .getResourceAsStream(templatep + jrxmlName); + if (jrxmlStream == null) { + throw new Exception("未找到jrxml模板:" + templatep + jrxmlName); + } + // 3. 编译jrxml为JasperReport对象 + JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlStream); - if (jrxmlStream == null) { - throw new Exception("未找到jrxml模板:"+templatep + jrxmlName); + // 4. 确定输出目录(resources/templates的同级目录,即classes/templates) + File outputDir = getTemplateOutputDir(); + if (!outputDir.exists()) { + outputDir.mkdirs(); // 目录不存在则创建 + } + // 5. 输出jasper文件到目标目录 + File jasperFile = new File(outputDir, jasperName); + JRSaver.saveObject(jasperReport, jasperFile); // 保存编译结果 + + System.out.println("编译成功:" + jasperFile.getAbsolutePath()); } - - // 3. 编译jrxml为JasperReport对象 - JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlStream); - - // 4. 确定输出目录(resources/templates的同级目录,即classes/templates) - File outputDir = getTemplateOutputDir(); - if (!outputDir.exists()) { - outputDir.mkdirs(); // 目录不存在则创建 - } - - // 5. 输出jasper文件到目标目录 - File jasperFile = new File(outputDir, jasperName); - JRSaver.saveObject(jasperReport, jasperFile); // 保存编译结果 - - System.out.println("编译成功:" + jasperFile.getAbsolutePath()); } /** @@ -330,5 +330,57 @@ public class JasperReportUtil { // 返回templates目录的File对象 return new File(templateUrl.toURI()); } + /** + * 检查是否需要编译jrxml(jrxml修改时间晚于jasper时需要编译) + * @param jrxmlPath jrxml文件路径(如"src/main/resources/templates/barcode.jrxml") + * @param jasperPath jasper文件路径(如"src/main/resources/templates/barcode.jasper") + * @return true:需要编译;false:无需编译 + */ + public static boolean needCompile(String jrxmlPath, String jasperPath) { + // 1. 判断jasper文件是否存在:不存在则需要编译 + File jasperFile = new File(jasperPath); + if (!jasperFile.exists()) { + log.info("jasper文件不存在,需要编译{}",jasperPath); + return true; + } + // 2. 判断jrxml文件是否存在 + File jrxmlFile = new File(jrxmlPath); + if (!jrxmlFile.exists()) { + throw new IllegalArgumentException("jrxml文件不存在:" + jrxmlPath); + } + + // 3. 比较修改时间:jrxml比jasper新 → 需要编译 + long jrxmlTime = jrxmlFile.lastModified(); + long jasperTime = jasperFile.lastModified(); + boolean needCompile = jrxmlTime > jasperTime; + + if (needCompile) { + log.info("jrxml已修改(" + jrxmlTime + "),晚于jasper(" + jasperTime + "),需要编译"); + } else { + // log.info("jasper文件最新,无需编译"); + } + return needCompile; + } + /** + * 获取 resources/templates/ 目录的绝对路径 + * @return 目录路径(如 "D:/project/target/classes/templates/") + */ + public static String getTemplatePath() { + try { + // 通过类加载器获取 templates 目录的URL + URL templateUrl = JasperReportUtil.class.getClassLoader().getResource(template); + + // 如果URL为空,说明目录不存在,但仍返回理论路径 + if (templateUrl == null) { + URL resourcesUrl = JasperReportUtil.class.getClassLoader().getResource(""); + return resourcesUrl.toURI().getPath() + templatep; + } + // 返回实际路径 + return templateUrl.toURI().getPath()+"/"; + + } catch (URISyntaxException e) { + throw new RuntimeException("获取路径失败", e); + } + } } \ No newline at end of file