0

0

解决Karaf应用中DJL“未找到深度学习引擎”错误

花韻仙語

花韻仙語

发布时间:2025-10-29 13:09:37

|

302人浏览过

|

来源于php中文网

原创

解决Karaf应用中DJL“未找到深度学习引擎”错误

本文旨在解决在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应用正确识别和加载。

DJL在Karaf应用中“未找到深度学习引擎”错误解析与解决方案

在使用Deep Java Library (DJL) 构建AI应用时,尤其是在Karaf这类OSGi容器环境中,开发者可能会遇到“No deep learning engine found”的错误。尽管DJL模型在Karaf外部能够正常运行,但在将其作为Karaf Bundle部署时却无法加载PyTorch等深度学习引擎。这通常指向了OSGi环境与DJL内部服务加载机制之间的冲突。

1. 问题根源分析:Service Loader与OSGi环境

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目录下的文件可能会出现以下问题:

  • 文件丢失: 在Bundle构建过程中,打包工具可能没有正确地将META-INF/services目录及其内容包含到最终的Bundle JAR中。
  • 可见性问题: 即使文件存在,由于OSGi的类加载器隔离机制,Service Loader可能无法从正确的Bundle或其依赖的Bundle中找到这些服务提供者文件。
  • 依赖冲突: DJL引擎及其原生库(如pytorch-native-cpu)可能与Karaf环境中的其他库版本产生冲突。

2. 核心依赖与正确配置

为了使DJL在Karaf中正常工作,必须确保所有必要的DJL组件及其依赖都被正确地打包为Karaf Bundle,并且Service Loader能够访问到它们。以下是通常需要包含的关键依赖及其作用:



    
        mvn:ai.djl:api:0.19.0
        mvn:ai.djl.pytorch:pytorch-engine:0.19.0
        
        mvn:ai.djl.pytorch:pytorch-native-cpu:1.13.0
        
        mvn:net.java.dev.jna:jna:5.12.1
        mvn:org.apache.commons:commons-compress:1.21
        
        
    

依赖说明:

  • ai.djl:api: DJL的核心API,所有DJL应用的基础。
  • ai.djl.pytorch:pytorch-engine: PyTorch深度学习引擎的DJL实现。
  • ai.djl.pytorch:pytorch-native-cpu: PyTorch引擎所需的底层原生库(CPU版本)。请务必根据目标部署环境选择正确的原生库(CPU/GPU)。
  • net.java.dev.jna:jna: Java Native Access,DJL用于与原生库(如PyTorch原生库)进行交互的工具。
  • org.apache.commons:commons-compress: DJL在处理模型文件(通常是压缩格式)时可能需要此库。

3. 解决方案与最佳实践

解决“No deep learning engine found”错误的关键在于确保META-INF/services文件在Karaf Bundle中正确存在且可被Service Loader访问。

3.1 验证Bundle内容

这是最直接的诊断方法。部署Bundle后,您可以通过以下步骤检查其内容:

海螺视频
海螺视频

海螺AI推出的AI视频生成工具,可以生成高质量的视频内容。

下载
  1. 检查Bundle JAR包: 使用解压工具(如WinRAR, 7-Zip或命令行jar tvf your-bundle.jar)打开您部署到Karaf的DJL相关Bundle JAR文件。
  2. 定位META-INF/services: 确保ai.djl.pytorch:pytorch-engine这个Bundle中包含META-INF/services/ai.djl.engine.EngineProvider文件。这个文件应该包含ai.djl.pytorch.engine.PyTorchEngineProvider这一行。
  3. 检查其他DJL Bundle: 对于其他DJL相关的Bundle(如api或model-zoo),也应检查它们是否包含各自的服务提供者文件。

如果该文件缺失,说明您的Bundle构建过程存在问题,需要调整构建脚本(如Maven maven-bundle-plugin配置)。

3.2 OSGi Bundle的Manifest配置

在OSGi环境中,Bundle的META-INF/MANIFEST.MF文件至关重要。确保以下几点:

  • Import-Package: 您的应用Bundle需要正确导入DJL引擎Bundle导出的包,以及JNA、Commons Compress等依赖的包。
  • Export-Package: 如果您创建了一个包含DJL引擎的聚合Bundle,请确保它正确导出了DJL引擎相关的包,以便其他Bundle可以使用。
  • Service-Component: 对于更复杂的OSGi服务,可以考虑使用OSGi Declarative Services (DS) 来管理和暴露DJL引擎服务,但这通常不是Service Loader问题的直接解决方案。

3.3 参考DJL的打包示例

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目录。通常,默认配置会包含,但如果自定义了资源过滤,可能会意外移除。


    org.apache.felix
    maven-bundle-plugin
    5.1.8 
    true
    
        
            ${project.artifactId}
            ${project.version}
            
                
            
            
                
                ai.djl.*,
                net.java.dev.jna.*,
                org.apache.commons.compress.*,
                org.slf4j.*,
                * 
            
            
            <_include>-osgi.jar
        
    

3.4 Karaf的Classloader委派

在某些情况下,Karaf的类加载器委派策略可能会影响Service Loader的发现。确保DJL相关的Bundle没有被配置为隔离度过高,或者尝试将DJL核心API和引擎Bundle设置为共享依赖,以便所有Bundle都能访问。

4. 总结

在Karaf等OSGi容器中集成DJL并解决“No deep learning engine found”错误,核心在于理解Java Service Loader机制以及OSGi的Bundle隔离特性。关键步骤包括:

  1. 确认所有DJL相关依赖(API、引擎、原生库、JNA等)都作为Karaf Bundle正确部署。
  2. 验证ai.djl.pytorch:pytorch-engine Bundle中META-INF/services/ai.djl.engine.EngineProvider文件的存在和内容。
  3. 检查OSGi Bundle的MANIFEST.MF文件,确保Import-Package和Export-Package配置正确。
  4. 在Bundle构建过程中,确保Service Loader所需的META-INF/services资源没有被意外排除。

通过以上步骤,可以有效地诊断并解决DJL引擎在Karaf应用中无法加载的问题,确保AI功能在OSGi环境下的稳定运行。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

868

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

745

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

741

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

420

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

447

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16948

2023.08.03

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.9万人学习

C# 教程
C# 教程

共94课时 | 7.6万人学习

Java 教程
Java 教程

共578课时 | 51.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号