Flink程序本地正常服务器运行失败:org.netlib.blas.Dgemm类缺失
java.lang.NoClassDefFoundError: org/netlib/blas/Dgemm 我之前在基于Breeze做Flink机器学习任务时也碰到过一模一样的问题!本地IDE跑完全正常,一上传到服务器就炸,核心原因就是打包时没有把Breeze依赖的netlib相关类包含到最终的Jar包里——本地IDE会自动加载所有依赖,但服务器上运行的是你打包后的独立Jar,缺失了这些关键类。
先看你贴的报错核心:
java.lang.NoClassDefFoundError: org/netlib/blas/Dgemm
Caused by: java.lang.ClassNotFoundException: org.netlib.blas.Dgemm
这个类属于netlib-java库,是Breeze线性代数计算的底层依赖。下面是具体的解决步骤:
1. 调整Maven/Gradle依赖配置
确保你的构建工具把netlib相关依赖标记为compile(而非provided),这样打包时会把它们包含进去。以Maven为例,在pom.xml里添加或确认以下依赖:
<!-- Breeze核心依赖 --> <dependency> <groupId>org.scalanlp</groupId> <artifactId>breeze_2.11</artifactId> <!-- 注意对应你的Scala版本 --> <version>1.0</version> </dependency> <!-- netlib-java核心包 --> <dependency> <groupId>com.github.fommil.netlib</groupId> <artifactId>core</artifactId> <version>1.1.2</version> </dependency> <!-- 如果服务器环境没有native库,可以用纯Java实现替代 --> <dependency> <groupId>com.github.fommil.netlib</groupId> <artifactId>all</artifactId> <version>1.1.2</version> <type>pom</type> </dependency>
如果用Gradle,对应配置类似,确保这些依赖的scope是implementation。
2. 正确配置打包插件
如果你用Maven的maven-shade-plugin打包,要确保它把所有第三方依赖(包括netlib)都合并到Jar里。关键配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.zte.flink.test</mainClass> <!-- 你的主类 --> </transformer> <!-- 处理ServiceLoader文件,避免netlib的实现类丢失 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <!-- 排除Flink的provided依赖,避免冲突 --> <excludeGroupIds>org.apache.flink</excludeGroupIds> </configuration> </execution> </executions> </plugin> </plugins> </build>
这里要注意:Flink自身的依赖(比如flink-java、flink-streaming-scala)要设为provided,因为服务器上的Flink集群已经包含这些库,避免重复打包导致冲突。
3. 验证打包结果
打包完成后,解压生成的Jar包,检查org/netlib/blas路径下是否存在Dgemm.class。如果有,说明依赖已经正确包含;如果没有,回头检查依赖配置和打包插件的设置。
额外提示
如果服务器环境支持native库,netlib会自动用性能更好的native实现;如果不支持,添加的all依赖会提供纯Java的 fallback 实现,确保程序能正常运行。
内容的提问来源于stack exchange,提问作者Xu Du

