0

0

解决Java中ONNX Runtime导入失败问题:理解与配置类路径

花韻仙語

花韻仙語

发布时间:2025-09-25 13:34:20

|

950人浏览过

|

来源于php中文网

原创

解决Java中ONNX Runtime导入失败问题:理解与配置类路径

本教程旨在解决Java开发中导入ONNX Runtime时遇到的“包不存在”错误,即使已通过Maven添加依赖。文章将深入探讨Java类路径(Classpath)的核心概念,并提供在编译和运行时正确配置类路径的详细指导,确保ONNX模型能够在Java环境中顺利进行推理。

1. 问题描述:ONNX Runtime导入失败

java项目中集成onnx runtime以进行模型推理时,开发者常会遇到一个普遍的问题:尽管已在pom.xml中正确添加了onnx runtime的maven依赖,但在尝试编译或运行java代码时,仍然收到“包不存在”(package does not exist)的错误。

例如,以下是一个典型的Maven依赖配置:



    4.0.0

    org.example
    test_first
    1.0-SNAPSHOT

    
        11
        11
        UTF-8
    

    
        
            com.microsoft.onnxruntime
            onnxruntime
            1.13.1
        
    

尽管Maven已将onnxruntime-1.13.1.jar下载到本地仓库,并在IDE中显示为外部库,但当直接使用javac命令编译包含ONNX Runtime导入语句的Java文件时,例如:

package org.example;

import ai.onnxruntime.OrtEnvironment; // 错误可能出现在这里
// import ai.onnxruntime.OrtSession.Result.*; // 或者这里

public class Main {
    public static void main(String[] args) {
        // ...
    }
}

编译命令:

javac src/main/java/org/example/Main.java

可能导致如下错误:

立即学习Java免费学习笔记(深入)”;

src/main/java/org/example/Main.java:3: error: package ai.onnxruntime.OrtSession.Result does not exist
import ai.onnxruntime.OrtSession.Result.*;
^
1 error

这个错误表明Java编译器无法找到ai.onnxruntime包下的类,即使Maven已经处理了依赖。

2. 核心概念:Java类路径(Classpath)

要理解上述问题,关键在于掌握Java的类路径(Classpath)概念。

  • 类路径的作用: Java虚拟机(JVM)和Java编译器(javac)在查找类和包时,需要知道去哪里寻找对应的.class文件或JAR文件。这个搜索路径集合就是类路径。
  • Maven与类路径: Maven是一个项目管理工具,它负责下载项目依赖的JAR包,并将它们放置在本地Maven仓库(通常是~/.m2/repository)中。当使用Maven的构建命令(如mvn compile或mvn package)时,Maven会自动配置好类路径,以便编译器和打包工具能够找到所有依赖。
  • 直接使用javac和java: 然而,当您脱离Maven的上下文,直接使用javac命令编译源代码,或者使用java命令运行编译后的.class文件时,Java编译器和JVM并不知道Maven所管理的依赖位置。此时,您需要手动告诉它们去哪里寻找所需的JAR包,这就是通过java或javac命令的-cp(或-classpath)参数来完成的。

3. 解决方案:正确配置类路径

解决“包不存在”错误的核心在于确保在编译和运行时,Java能够访问到ONNX Runtime的JAR包。

3.1 方法一:直接通过java -cp命令指定类路径(适用于单文件执行)

对于简单的Java文件,尤其是在Java 11及更高版本中,您可以使用JEP 330(单文件源代码程序启动)特性,结合-cp参数直接运行Java源代码,而无需先手动编译。

黑点工具
黑点工具

在线工具导航网站,免费使用无需注册,快速使用无门槛。

下载

步骤:

  1. 确定ONNX Runtime JAR包的完整路径: 这个JAR包通常位于您的本地Maven仓库中。例如,对于ONNX Runtime 1.13.1版本,路径可能类似于:

    • Windows: C:\Users\YourUsername\.m2\repository\com\microsoft\onnxruntime\onnxruntime\1.13.1\onnxruntime-1.13.1.jar
    • macOS/Linux: /Users/YourUsername/.m2/repository/com/microsoft/onnxruntime/onnxruntime/1.13.1/onnxruntime-1.13.1.jar 请将YourUsername替换为您的实际用户名。
  2. 使用java -cp命令运行: 假设您的Java代码文件是src/main/java/org/example/Main.java,并且其中包含以下内容:

    package org.example;
    
    import ai.onnxruntime.OrtEnvironment;
    import ai.onnxruntime.OrtSession;
    import ai.onnxruntime.OrtException;
    
    public class Main {
        public static void main(String[] args) {
            try {
                // 验证ONNX Runtime是否成功导入和初始化
                OrtEnvironment env = OrtEnvironment.getEnvironment();
                System.out.println("ONNX Runtime环境初始化成功!版本: " + env.getAPIVersion());
                // 可以在这里加载并运行ONNX模型
                // OrtSession session = env.createSession("path/to/your/model.onnx");
                // ...
            } catch (OrtException e) {
                System.err.println("ONNX Runtime初始化失败: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }

    您可以使用以下命令直接运行它(请替换为您的实际JAR包路径):

    • Windows示例:
      java -cp "C:\Users\XXXX\.m2\repository\com\microsoft\onnxruntime\onnxruntime\1.13.1\onnxruntime-1.13.1.jar" src\main\java\org\example\Main.java
    • macOS/Linux示例:
      java -cp "/Users/XXXX/.m2/repository/com/microsoft/onnxruntime/onnxruntime/1.13.1/onnxruntime-1.13.1.jar" src/main/java/org/example/Main.java

      注意: 如果您的Java版本低于11,或者您希望先编译再运行,您需要分别在javac和java命令中使用-cp参数。 编译:

      javac -cp "/Users/XXXX/.m2/repository/com/microsoft/onnxruntime/onnxruntime/1.13.1/onnxruntime-1.13.1.jar" src/main/java/org/example/Main.java

      运行(假设编译后的Main.class在当前目录或其子目录中,且org.example包结构正确):

      java -cp "/Users/XXXX/.m2/repository/com/microsoft/onnxruntime/onnxruntime/1.13.1/onnxruntime-1.13.1.jar;." org.example.Main
      # 或者对于Linux/macOS
      java -cp "/Users/XXXX/.m2/repository/com/microsoft/onnxruntime/onnxruntime/1.13.1/onnxruntime-1.13.1.jar:." org.example.Main

      这里的:或;是路径分隔符,.表示当前目录,用于查找Main.class文件。

3.2 方法二:利用Maven管理项目(推荐)

对于任何非简单的、结构化的Java项目,强烈推荐使用Maven来管理构建、依赖和运行。Maven会自动处理类路径问题,避免手动指定复杂的JAR包路径。

  • 编译: 使用mvn compile命令。Maven会自动查找pom.xml中声明的所有依赖,并在编译时将其添加到类路径。
  • 打包: 使用mvn package命令。这将生成一个JAR包,通常会包含您的代码和Maven管理的依赖(如果是“fat jar”或“uber jar”),或者生成一个包含依赖的lib目录。
  • 运行:
    • 如果打包生成的是一个包含所有依赖的“可执行JAR包”(例如,通过Maven Shade Plugin或Spring Boot Maven Plugin),可以直接使用java -jar your-project.jar运行。
    • 如果打包生成的是一个普通的JAR包和独立的lib目录,您可以使用java -cp "lib/*:your-project.jar" YourMainClass(Linux/macOS)或java -cp "lib/*;your-project.jar" YourMainClass(Windows)来运行。
    • 您也可以使用Maven的exec:java插件直接运行主类:
      
          
              
                  org.codehaus.mojo
                  exec-maven-plugin
                  3.0.0
                  
                      org.example.Main
                  
              
          
      

      然后运行:mvn exec:java

4. 注意事项

  • 路径分隔符: 在Windows系统上,类路径中的多个路径使用分号(;)分隔;在Linux/macOS系统上,使用冒号(:)分隔。
  • JAR包完整路径: 确保您提供的JAR包路径是完整的,指向.jar文件本身,而不是其所在的目录。
  • Java版本: Java 11引入的JEP 330使得可以直接运行单文件源代码,这在测试简单代码时非常方便。如果使用旧版本Java,则必须先编译(javac -cp ...),再运行(java -cp ...)。
  • 通配符: 在Java 6及更高版本中,可以在类路径中使用通配符*来包含指定目录下所有的JAR文件。例如,java -cp "path/to/jars/*" YourMainClass。这对于包含多个依赖JAR的lib目录非常有用。

5. 总结

在Java项目中导入ONNX Runtime并遇到“包不存在”错误,通常不是因为Maven依赖配置有误,而是因为在脱离Maven构建工具直接使用javac或java命令时,没有正确地将ONNX Runtime的JAR包添加到Java的类路径中。通过理解类路径的工作原理,并利用-cp参数手动指定JAR包路径,或者更推荐地,通过Maven的构建和运行机制,可以有效地解决这类问题,确保ONNX模型在Java环境中的顺利集成和推理。

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

热门下载

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

精品课程

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

共48课时 | 7.9万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

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

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