
本文旨在解决在karaf等osgi容器中使用deep java library (djl)时出现的“no deep learning engine found”错误。该问题通常源于djl依赖的服务加载机制(service loader)在osgi环境下的兼容性挑战,特别是`meta-inf/services/ai.djl.engine.engineprovider`文件在打包或重新打包过程中丢失或不可访问。教程将详细分析问题根源,并提供一系列解决方案,包括正确配置依赖、验证bundle内容以及遵循djl推荐的打包实践,确保djl引擎能够被karaf应用正确识别和加载。
在使用Deep Java Library (DJL) 构建AI应用时,尤其是在Karaf这类OSGi容器环境中,开发者可能会遇到“No deep learning engine found”的错误。尽管DJL模型在Karaf外部能够正常运行,但在将其作为Karaf Bundle部署时却无法加载PyTorch等深度学习引擎。这通常指向了OSGi环境与DJL内部服务加载机制之间的冲突。
DJL通过Java的Service Loader机制来发现和加载其深度学习引擎(如PyTorch、TensorFlow等)。Service Loader依赖于JAR包内部的META-INF/services目录下的特定文件(例如,对于DJL引擎,通常是META-INF/services/ai.djl.engine.EngineProvider)。这些文件包含了引擎提供者的全限定类名,Java虚拟机在运行时通过它们来实例化相应的服务。
在Karaf这样的OSGi容器中,每个模块都被视为一个独立的Bundle,拥有自己的类加载器和可见性规则。当一个JAR包被重新打包为OSGi Bundle时,或者在Bundle部署过程中,META-INF/services目录下的文件可能会出现以下问题:
为了使DJL在Karaf中正常工作,必须确保所有必要的DJL组件及其依赖都被正确地打包为Karaf Bundle,并且Service Loader能够访问到它们。以下是通常需要包含的关键依赖及其作用:
<!-- 假设使用Maven管理Karaf Features -->
<features name="djl-application-features">
<feature name="djl-pytorch-engine">
<bundle>mvn:ai.djl:api:0.19.0</bundle>
<bundle>mvn:ai.djl.pytorch:pytorch-engine:0.19.0</bundle>
<!-- PyTorch原生CPU库,根据需要选择GPU或CPU版本 -->
<bundle>mvn:ai.djl.pytorch:pytorch-native-cpu:1.13.0</bundle>
<!-- JNA是DJL与原生库交互的关键依赖 -->
<bundle>mvn:net.java.dev.jna:jna:5.12.1</bundle>
<bundle>mvn:org.apache.commons:commons-compress:1.21</bundle>
<!-- 其他DJL可能需要的依赖,例如model-zoo等 -->
<!-- <bundle>mvn:ai.djl:model-zoo:0.19.0</bundle> -->
</feature>
</features>依赖说明:
解决“No deep learning engine found”错误的关键在于确保META-INF/services文件在Karaf Bundle中正确存在且可被Service Loader访问。
这是最直接的诊断方法。部署Bundle后,您可以通过以下步骤检查其内容:
如果该文件缺失,说明您的Bundle构建过程存在问题,需要调整构建脚本(如Maven maven-bundle-plugin配置)。
在OSGi环境中,Bundle的META-INF/MANIFEST.MF文件至关重要。确保以下几点:
DJL官方提供了一些打包示例,其中djl-demo/development/fatjar项目虽然是针对Fat Jar的,但其核心思想是确保所有必要的资源(包括META-INF/services文件)都被正确聚合到最终的发布工件中。在Karaf环境中,这意味着每个Bundle都应该独立地包含其所需的Service Loader文件,或者通过适当的Import-Package / Export-Package机制使这些服务在Bundle之间可见。
构建工具配置建议(以Maven为例): 如果您使用Maven的maven-bundle-plugin来创建OSGi Bundle,请确保其配置允许包含META-INF/services目录。通常,默认配置会包含,但如果自定义了资源过滤,可能会意外移除。
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>5.1.8</version> <!-- 使用最新版本 -->
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Export-Package>
<!-- 导出你的应用需要的包 -->
</Export-Package>
<Import-Package>
<!-- 导入DJL以及其他依赖的包 -->
ai.djl.*,
net.java.dev.jna.*,
org.apache.commons.compress.*,
org.slf4j.*,
* <!-- 或者更具体的导入 -->
</Import-Package>
<!-- 确保META-INF/services被包含 -->
<_include>-osgi.jar</_include>
</instructions>
</configuration>
</plugin>在某些情况下,Karaf的类加载器委派策略可能会影响Service Loader的发现。确保DJL相关的Bundle没有被配置为隔离度过高,或者尝试将DJL核心API和引擎Bundle设置为共享依赖,以便所有Bundle都能访问。
在Karaf等OSGi容器中集成DJL并解决“No deep learning engine found”错误,核心在于理解Java Service Loader机制以及OSGi的Bundle隔离特性。关键步骤包括:
通过以上步骤,可以有效地诊断并解决DJL引擎在Karaf应用中无法加载的问题,确保AI功能在OSGi环境下的稳定运行。
以上就是解决Karaf应用中DJL“未找到深度学习引擎”错误的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号