Liferay 7.4 GA107添加依赖时持续出现导入包未解析问题求助
根本原因
你遇到的问题核心在于IronPDF的JAR不是OSGi兼容的Bundle。Liferay基于OSGi框架运行,模块间依赖需遵循OSGi规范:当模块用implementation声明依赖时,OSGi容器会尝试从已安装的Bundle中查找com.ironsoftware.ironpdf包,但IronPDF的普通JAR不包含OSGi所需的MANIFEST.MF头信息(如Bundle-SymbolicName、Export-Package),导致容器无法识别和解析该包。
解决方案
1. 将依赖嵌入到模块中
如果没有OSGi版本的IronPDF,最直接的方法是把依赖JAR嵌入到你的模块里,让模块自行携带该依赖。修改build.gradle中的依赖声明,用compileInclude替代implementation:
dependencies { compileOnly group: "com.liferay.portal", name: "release.portal.api" cssBuilder group: "com.liferay", name: "com.liferay.css.builder", version: "3.1.0" compileInclude group: 'com.ironsoftware', name: 'ironpdf', version: '2024.1.1' }
compileInclude会将依赖JAR打包到模块的WEB-INF/lib目录下,同时Liferay的Gradle插件会自动调整模块的MANIFEST.MF,避免OSGi容器尝试从外部导入这些包。
2. 处理传递依赖(如果需要)
IronPDF可能包含其他非OSGi兼容的传递依赖,可按以下步骤处理:
- 执行
gradlew dependencies查看IronPDF的依赖树 - 对所有需要的传递依赖,同样使用
compileInclude声明,确保它们也被嵌入到模块中
3. 清理并重新构建部署
执行以下命令清理旧构建产物,重新构建并部署模块:
gradlew clean build deploy
确保Liferay服务器已重启或模块被正确更新。
4. 可选:将依赖转为OSGi Bundle
若不想嵌入依赖,可使用bnd工具将IronPDF的JAR转换为OSGi Bundle,添加必要的MANIFEST.MF头信息后,将转换后的Bundle部署到Liferay的OSGi容器(如放入deploy目录)。之后模块即可继续用implementation声明依赖,因为容器中已存在对应的Bundle。
内容的提问来源于stack exchange,提问作者Sumair Ahmed

