这种情况通常是因为编译时能找到类(Classpath 中有 jar 包),但运行时 JVM 找不到该类(Runtime Classpath 中缺失 jar 包)。这就是经典的 ClassNotFoundException 或 NoClassDefFoundError。
既然您已经确认“导入了”且“编译过了”,问题大概率出在打包或运行环境配置上。请根据您的项目类型,对照以下场景排查:
场景一:Maven 项目(最常见)
如果您是用 Maven 管理的依赖,编译成功说明 pom.xml 没问题,但运行时缺失通常是因为依赖作用域(Scope) 或 打包插件 配置不当。
检查
<scope>标签
打开pom.xml,找到aliyun-sdk-oss的依赖配置:<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.17.4</version> <!-- 版本号请以实际为准 --> <!-- 重点检查这里!如果写了 provided 或 test,运行时就会报错 --> <!-- <scope>provided</scope> <-- 错误示范:这会导致打包时不包含该 jar --> <!-- <scope>test</scope> <-- 错误示范:只在测试用例中有效 --> </dependency>
解决方法:删除
<scope>标签(默认为compile),或者明确设置为<scope>compile</scope>。检查打包方式(如果是可执行 Jar)
如果您是通过java -jar target/xxx.jar运行,普通的maven-jar-plugin不会把依赖打进去。您需要使用maven-shade-plugin或spring-boot-maven-plugin。Spring Boot 项目:确保使用了
spring-boot-maven-plugin,它会自动处理依赖打包。普通 Java 项目:需要在
pom.xml中配置maven-shade-plugin将所有依赖打入一个 Fat Jar。强制更新依赖
有时候本地仓库缓存损坏,尝试强制更新:mvn clean install -U
场景二:Gradle 项目
检查依赖配置块
确保依赖添加在implementation或runtimeOnly中,而不是compileOnly。dependencies { // 正确:编译和运行时都包含 implementation 'com.aliyun.oss:aliyun-sdk-oss:3.17.4' // 错误:只在编译时有,运行时没有(类似 Maven 的 provided) // compileOnly 'com.aliyun.oss:aliyun-sdk-oss:3.17.4' }重新构建
修改后执行:./gradlew clean build
场景三:手动导入 Jar 包(非构建工具)
如果您是手动下载 .jar 文件并添加到 IDE 的 Library 中:
IDE 设置 vs 运行命令
命令行运行示例:
# 错误:只包含了您的代码 jar java -jar my-app.jar # 正确:需要显式包含 oss sdk jar 包(多个 jar 用冒号 : 或分号 ; 分隔) # Linux/Mac: java -cp "my-app.jar:lib/aliyun-sdk-oss-3.17.4.jar:lib/*" com.example.MainClass # Windows: java -cp "my-app.jar;lib\aliyun-sdk-oss-3.17.4.jar;lib\*" com.example.MainClass
在 IDEA/Eclipse 中点击“运行”按钮能跑,是因为 IDE 自动把 Library 加到了运行时 Classpath。
如果您是在命令行通过
java -cp ...运行,或者打成了一个瘦 Jar 包运行,必须手动指定依赖路径。打包问题
如果您希望java -jar my-app.jar直接运行,您必须使用工具(如jar -uf或构建工具)将aliyun-sdk-oss.jar及其所有传递依赖(如httpclient,jdom等)解压并合并到您的主 jar 包的BOOT-INF/lib(SpringBoot) 或根目录下,并正确配置MANIFEST.MF中的Class-Path。
场景四:Web 容器部署 (Tomcat/Jetty)
如果是部署在外部 Tomcat 的 WAR 包:
检查 WAR 结构
解压生成的.war文件,检查WEB-INF/lib目录下是否存在aliyun-sdk-oss-x.x.x.jar。如果不存在:说明打包插件配置错误(参考 Maven 场景)。
如果存在:可能是版本冲突。Tomat 全局 lib 或其他库引入了冲突版本的依赖。
依赖冲突
OSS SDK 依赖httpclient、commons-codec等。如果项目中其他库引入了不兼容的版本,可能导致类加载失败。排查:运行
mvn dependency:tree查看依赖树,看是否有冲突。
场景五:类名拼写或包名变更
虽然您说编译通过了,但还是要确认一下:
类名是否正确:OSS 的主类通常是
com.aliyun.oss.OSSClient(旧版) 或com.aliyun.oss.ClientBuilderConfiguration等。版本差异:阿里云 OSS SDK v3.x 和早期版本包结构略有不同。确保代码引用的类在当前引入的 jar 版本中确实存在。
✅ 快速自测步骤
查看依赖树:
在项目根目录运行mvn dependency:tree | grep oss(Maven) 或./gradlew dependencies --configuration runtimeClasspath(Gradle),确认aliyun-sdk-oss确实在列表中,且状态不是omitted for conflict。检查打包产物:
如果是 Jar/War 包,用压缩软件打开它,进入lib目录(或根目录),肉眼确认aliyun-sdk-oss*.jar是否在里面。清理重来:
执行mvn clean package -U或gradle clean build,删除旧的 target/build 目录,重新生成产物再运行。
最可能的结论:90% 的情况是因为 pom.xml 中误加了 <scope>provided</scope>,或者在命令行运行时没有将依赖 jar 包加入 -cp (Classpath) 参数中。