
在java项目中集成onnx runtime以进行模型推理时,开发者常会遇到一个普遍的问题:尽管已在pom.xml中正确添加了onnx runtime的maven依赖,但在尝试编译或运行java代码时,仍然收到“包不存在”(package does not exist)的错误。
例如,以下是一个典型的Maven依赖配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>test_first</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.microsoft.onnxruntime</groupId>
<artifactId>onnxruntime</artifactId>
<version>1.13.1</version>
</dependency>
</dependencies>
</project>尽管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已经处理了依赖。
要理解上述问题,关键在于掌握Java的类路径(Classpath)概念。
解决“包不存在”错误的核心在于确保在编译和运行时,Java能够访问到ONNX Runtime的JAR包。
对于简单的Java文件,尤其是在Java 11及更高版本中,您可以使用JEP 330(单文件源代码程序启动)特性,结合-cp参数直接运行Java源代码,而无需先手动编译。
步骤:
确定ONNX Runtime JAR包的完整路径: 这个JAR包通常位于您的本地Maven仓库中。例如,对于ONNX Runtime 1.13.1版本,路径可能类似于:
使用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包路径):
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
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文件。
对于任何非简单的、结构化的Java项目,强烈推荐使用Maven来管理构建、依赖和运行。Maven会自动处理类路径问题,避免手动指定复杂的JAR包路径。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<mainClass>org.example.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>然后运行:mvn exec:java
在Java项目中导入ONNX Runtime并遇到“包不存在”错误,通常不是因为Maven依赖配置有误,而是因为在脱离Maven构建工具直接使用javac或java命令时,没有正确地将ONNX Runtime的JAR包添加到Java的类路径中。通过理解类路径的工作原理,并利用-cp参数手动指定JAR包路径,或者更推荐地,通过Maven的构建和运行机制,可以有效地解决这类问题,确保ONNX模型在Java环境中的顺利集成和推理。
以上就是解决Java中ONNX Runtime导入失败问题:理解与配置类路径的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号