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能够访问到它们。以下是通常需要包含的关键依赖及其作用:

<!-- 假设使用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>

依赖说明:

  • 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 Web Designer
AI Web Designer

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

<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>

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

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

apache是什么意思
apache是什么意思

Apache是Apache HTTP Server的简称,是一个开源的Web服务器软件。是目前全球使用最广泛的Web服务器软件之一,由Apache软件基金会开发和维护,Apache具有稳定、安全和高性能的特点,得益于其成熟的开发和广泛的应用实践,被广泛用于托管网站、搭建Web应用程序、构建Web服务和代理等场景。本专题为大家提供了Apache相关的各种文章、以及下载和课程,希望对各位有所帮助。

421

2023.08.23

apache启动失败
apache启动失败

Apache启动失败可能有多种原因。需要检查日志文件、检查配置文件等等。想了解更多apache启动的相关内容,可以阅读本专题下面的文章。

939

2024.01.16

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

177

2026.02.04

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

27

2025.12.22

Python 深度学习框架与TensorFlow入门
Python 深度学习框架与TensorFlow入门

本专题深入讲解 Python 在深度学习与人工智能领域的应用,包括使用 TensorFlow 搭建神经网络模型、卷积神经网络(CNN)、循环神经网络(RNN)、数据预处理、模型优化与训练技巧。通过实战项目(如图像识别与文本生成),帮助学习者掌握 如何使用 TensorFlow 开发高效的深度学习模型,并将其应用于实际的 AI 问题中。

188

2026.01.07

TensorFlow2深度学习模型实战与优化
TensorFlow2深度学习模型实战与优化

本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

29

2026.02.10

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

469

2024.05.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 81.9万人学习

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

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