安装cfspreadsheet扩展名后,Lucee找不到XSSFWorkbook

问题描述

尝试创建XSSFWorkbook

时收到错误消息

代码

currentCharterTemplate = 'UnusedTicketsWorkbook.xlsx';
currentFilePath = getDirectoryFromPath(getCurrentTemplatePath());
javaFile = createObject('java','java.io.File').init(currentFilePath & currentCharterTemplate);
excelFile = createObject('java','java.io.FileInputStream').init(javaFile);
xssfWorkbook = createObject('java','org.apache.poi.xssf.usermodel.XSSFWorkbook');
xssfWorkbook = createObject('java','org.apache.poi.xssf.usermodel.XSSFWorkbook').init(excelFile);

我也只尝试了下面的行,并且收到相同的错误

xssfWorkbook = createObject('java','org.apache.poi.xssf.usermodel.XSSFWorkbook');

错误

cannot load class through its string name,because no deFinition for the class with the specified name 
[org.apache.poi.xssf.usermodel.XSSFWorkbook] Could be found caused by (java.lang.classNotFoundException:org.apache.poi.xssf.usermodel.XSSFWorkbook;
java.lang.classNotFoundException:org.apache.poi.xssf.usermodel.XSSFWorkbook not found by lucee.core [46];)

我已经安装了lucee的cfspreadsheet扩展名,并重新启动了lucee和我的计算机,我已经验证cfspreadsheet-3.0.1.jar中包含C:\lucee\tomcat\lucee-server\bundles以及lucee随附的所有其他jar文件。>

如果我打开带有7-zip的罐子,可以看到其中包含poi-ooxml-3.15.jar。在该jar中,我可以浏览到C:\lucee\tomcat\lucee-server\bundles\cfspreadsheet-3.0.1.jar\poi-ooxml-3.15.jar\org\apache\poi\xssf\usermodel\XSSFWorkbook.class

错误消息中的lucee.core使我认为它无法识别扩展程序中的jar,但是找不到启用此功能的设置。

解决方法

我刚刚测试了您的代码,看来直到您至少实际点击cfspreadsheet标记一次,扩展程序的OSGI捆绑包才真正加载。运行cfspreadsheet标记后,服务器管理员中的cfspreadsheet捆绑包将显示为活动,然后createObject()可以找到该类。

// Force Lucee to activate the bundle
spreadsheet action="read" src="#expandPath( 'UnusedTicketsWorkbook.xlsx' )#" name="test";

xssfWorkbook = createObject('java','org.apache.poi.xssf.usermodel.XSSFWorkbook');

我还算了一笔账,如果您将'cfspreadsheet'作为第三个参数传递来创建对象(捆绑名称)来强制Lucee加载它。

// Explicitly reference the bundle name
xssfWorkbook = createObject('java','org.apache.poi.xssf.usermodel.XSSFWorkbook','cfspreadsheet');

值得注意的是,该扩展将POI jar重新包装到了自己设计的新捆绑包中,这就是为什么捆绑包名称为cfspreadsheet的原因。