Maven构建WAR包时如何排除nd4j-native-platform下非linux-x86_64的jar包
Maven 部署包冗余优化方案
场景背景
项目引入nd4j-native-platform依赖后,由于该依赖是全平台聚合组件,内置了Windows、Linux、macOS、Android等多操作系统、多CPU架构对应的原生jar包。开发环节在Windows/macOS环境完成,最终部署目标是x86_64架构的Linux服务器,目前生成的.war包中非目标平台的jar包占比超过400MB,需要过滤所有分类器不属于linux-x86_64的冗余jar包,压缩部署包体积。
现有配置的问题根源
- 依赖写法错误:当前pom中给
nd4j-native-platform添加<classifier>linux-x86_64</classifier>的逻辑不成立——nd4j-native-platform本身是聚合包,不存在带linux-x86_64分类器的对应artifact,这个分类器配置会被Maven忽略,最终还是会把全平台的原生jar全部作为传递依赖引入项目。 - WAR插件排除规则不生效:之前硬编码的
packagingExcludes路径存在版本号不匹配(如配置的openblas版本为0.3.9-1-1.5.3,实际传递的jar版本为0.3.9-1.5.3)、重复条目的问题(如openblas-0.3.9-1-1.5.3-windows-x86.jar连续写了两次),加上硬编码路径无法适配版本变动,自然无法匹配到需要排除的jar包。同时硬编码排除是在所有依赖已经拷贝到WEB-INF/lib目录后才执行的,无法从根源上减少依赖解析阶段的冗余内容。
可落地的配置步骤
1. 从依赖解析阶段过滤冗余原生包
修改pom中的nd4j依赖配置,直接排除所有传递引入的多平台原生jar,再单独引入目标平台的对应组件,从根源上挡住冗余包进入项目:
<!-- 引入nd4j原生平台聚合包,排除所有传递进来的多平台原生依赖 --> <dependency> <groupId>org.nd4j</groupId> <artifactId>nd4j-native-platform</artifactId> <version>1.0.0-beta7</version> <exclusions> <!-- 排除所有传递引入的nd4j原生jar --> <exclusion> <groupId>org.nd4j</groupId> <artifactId>nd4j-native</artifactId> </exclusion> <!-- 排除所有传递引入的openblas原生jar --> <exclusion> <groupId>org.bytedeco</groupId> <artifactId>openblas</artifactId> </exclusion> </exclusions> </dependency> <!-- 单独引入目标平台的nd4j原生包 --> <dependency> <groupId>org.nd4j</groupId> <artifactId>nd4j-native</artifactId> <version>1.0.0-beta7</version> <classifier>linux-x86_64</classifier> </dependency> <!-- 单独引入目标平台的openblas原生包 --> <dependency> <groupId>org.bytedeco</groupId> <artifactId>openblas</artifactId> <version>0.3.9-1.5.3</version> <classifier>linux-x86_64</classifier> </dependency>
该配置不会影响本地开发调试:在Windows/macOS环境下启动项目时,Maven/IDE会根据当前操作系统自动匹配对应平台的原生包,不会出现找不到类的问题。
2. 调整WAR插件的兜底排除规则
删除之前硬编码具体版本的排除配置,改用通配符匹配所有非目标平台的原生jar,作为兜底逻辑避免有遗漏的冗余包进入部署包:
<plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.3</version> <configuration> <packagingExcludes> WEB-INF/lib/nd4j-native-*-android-*.jar, WEB-INF/lib/nd4j-native-*-windows-*.jar, WEB-INF/lib/nd4j-native-*-macosx-*.jar, WEB-INF/lib/nd4j-native-*-linux-arm*.jar, WEB-INF/lib/nd4j-native-*-linux-ppc64le.jar, WEB-INF/lib/openblas-*-android-*.jar, WEB-INF/lib/openblas-*-windows-*.jar, WEB-INF/lib/openblas-*-macosx-*.jar, WEB-INF/lib/openblas-*-linux-arm*.jar, WEB-INF/lib/openblas-*-linux-ppc64le.jar </packagingExcludes> </configuration> </plugin>
效果验证
按照上述配置修改后重新执行打包,生成的WAR包体积会减少400MB以上,仅保留部署目标环境需要的linux-x86_64架构原生组件,不会出现运行时缺失类的问题。
内容的提问来源于stack exchange,提问作者allenfromspace
相关产品推荐
相关产品推荐

