You need to enable JavaScript to run this app. Maven构建WAR包时如何排除nd4j-native-platform下非linux-x86_64的jar包
优惠活动
大模型
产品
解决方案
定价
更多

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包,压缩部署包体积。

现有配置的问题根源

  1. 依赖写法错误:当前pom中给nd4j-native-platform添加<classifier>linux-x86_64</classifier>的逻辑不成立——nd4j-native-platform本身是聚合包,不存在带linux-x86_64分类器的对应artifact,这个分类器配置会被Maven忽略,最终还是会把全平台的原生jar全部作为传递依赖引入项目。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.11 23:15:04