使用 IntelliJ IDEA 搭建并运行 MXNet Java 示例项目(Maven 全流程指南)
2026/9/21 19:03:53 网站建设 项目流程

使用 IntelliJ IDEA 搭建并运行 MXNet Java 示例项目(Maven 全流程指南)

【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mxnet1/mxnet

本篇技术指南以 MXNet 官方 Java 教程为骨架,带你从零开始在 IntelliJ IDEA 中创建 Maven 项目、引入 MXNet 官方 Java 依赖、运行第一个 NDArray 计算程序,并深入讲解仓库内 Java Demo 项目的源码结构、平台/GPU 依赖切换与命令行构建方式。读完本文,你将掌握在 macOS/Linux 上搭建 MXNet Java 开发环境、在 IDE 中调试运行以及脱离 IDE 用 Maven 命令行编译执行的完整实战能力。

前置条件

在开始之前,需要准备以下软件环境:

  • Java 8 JDK:MXNet Java API 依赖 JDK 8,请确保java -version输出的主版本为 8;
  • Maven:用于管理依赖与构建项目;
  • OpenCV:MXNet Java 包在图像读写(Image.imReadImage.imResize)等操作中依赖 OpenCV 原生库;
  • IntelliJ IDEA:社区版(Community Edition)即可满足本教程的全部需求。

版本说明:MXNet 官方 Java 包随 MXNet 1.4 正式发布,本文教程使用1.4.0版本坐标进行演示;当前仓库内的 java-demo 演示项目 则采用[1.6.0-SNAPSHOT, )的范围版本,二者用法一致,读者可根据自己拉取的依赖版本灵活调整。

macOS 安装前置依赖

macOS 推荐使用 Homebrew 安装全部依赖,依次执行:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew update brew tap caskroom/versions brew cask install java8 brew install maven brew install opencv

其中brew cask install java8会安装 Oracle Java 8;brew tap caskroom/versions是为了让java8cask 可用。

Ubuntu 安装前置依赖

Ubuntu 下使用apt一条命令即可完成 JDK 与 Maven 的安装:

sudo apt-get install openjdk-8-jdk maven

OpenCV 在 Ubuntu 上通常随 MXNet 依赖被拉取;若运行期遇到 OpenCV 原生库缺失问题,可参考本文末尾"故障排查"一节的解决方案(如安装libopencv-imgcodecs3.4)。

在 IntelliJ IDEA 中创建 Maven 项目

Step 1.安装并启动 IntelliJ IDEA。

Step 2.创建新项目:

  1. 在 IntelliJ 欢迎界面点击Create New Project
  2. 左侧选择Maven项目类型;
  3. 勾选Create from archetype,并从列表中选择org.apache.maven.archetypes:maven-archetype-quickstart(这是 Maven 官方的快速开始骨架,会生成标准的src/main/java目录结构与示例App.java);
  4. 点击Next进入项目元数据配置页。

Step 3.填写项目元数据(Project Metadata),本教程使用以下取值:

  • GroupIdmxnet
  • ArtifactIdjavaMXNet
  • Version1.0-SNAPSHOT

点击Next,项目属性(Project Properties)保持默认即可;随后设置项目存放位置(Project Location),其余设置同样保持默认,点击Finish完成创建。

创建完成后,IDEA 会打开项目主视图,并自动在编辑器中展示项目的pom.xml文件——下一步我们就通过它引入 MXNet Java 依赖。

添加 MXNet Java 依赖

MXNet 的 Java 包已发布到 Maven 中央仓库(坐标前缀为org.apache.mxnet)。在pom.xml<dependencies>标签内添加以下依赖:

<dependency> <groupId>org.apache.mxnet</groupId> <artifactId>mxnet-full_2.11-osx-x86_64-cpu</artifactId> <version>1.4.0</version> </dependency>

理解 artifactId 的命名规则

mxnet-full_2.11-osx-x86_64-cpu这个 artifact 名称由四部分拼接而成,理解它才能在换平台、换硬件时正确调整坐标:

片段含义可选值
mxnet-full完整发行包(内含原生库与 Scala/Java 绑定)mxnet-full
_2.11Scala 二进制版本(Java API 基于 Scala 2.11 编译)2.11
osx-x86_64目标操作系统与 CPU 架构osx-x86_64linux-x86_64
cpu计算后端cpugpu

使用时注意两点:

  • Linux上运行,请把osx-x86_64改为linux-x86_64
  • 若本机配备 NVIDIA GPU 且希望使用 GPU 加速,请把cpu改为gpu(GPU 包内置 CUDA 运行时,当前 Maven 包基于 CUDA 9.2 构建)。

仓库演示项目的自动化做法

手工拼写平台名容易出错,当前仓库的 java-demo pom.xml 提供了一个更优雅的方案:用 Maven Profile 按操作系统自动激活对应的依赖后缀。其核心片段如下:

<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <mxnet.version>[1.6.0-SNAPSHOT, )</mxnet.version> <mxnet.scalaprofile>2.11</mxnet.scalaprofile> </properties> <profiles> <profile> <id>osx-x86_64</id> <activation> <os> <family>mac</family> </os> </activation> <properties> <mxnet.profile>osx-x86_64-cpu</mxnet.profile> </properties> </profile> <profile> <id>linux-x86_64</id> <activation> <os> <family>unix</family> <name>Linux</name> </os> </activation> <properties> <mxnet.profile>linux-x86_64-cpu</mxnet.profile> </properties> </profile> </profiles> <dependencies> <dependency> <groupId>org.apache.mxnet</groupId> <artifactId>mxnet-full_${mxnet.scalaprofile}-${mxnet.profile}</artifactId> <version>${mxnet.version}</version> </dependency> </dependencies>

依赖坐标通过${mxnet.scalaprofile}-${mxnet.profile}动态拼接:macOS 自动选择osx-x86_64-cpu,Linux 自动选择linux-x86_64-cpu。需要 GPU 时,只需在命令行覆盖属性-Dmxnet.profile=linux-x86_64-gpu,无需改动 pom 文件。该 pom 同时声明了 Apache Snapshot 仓库,便于拉取 1.6.0-SNAPSHOT 系列的每日构建版本。

导入依赖并构建项目

Step 4.完成依赖添加后,注意 IDE 右下角会出现"Maven projects need to be imported"的提示气泡(若未出现,点击右下角的绿色气球图标)。点击其中的Import Changes,Maven 会自动解析并下载org.apache.mxnet依赖及其传递依赖。

Step 5.构建项目:从顶部菜单选择Build → Build Project,等待编译完成。

写入 HelloWorld 代码并运行

Step 6.在项目树中找到 Maven 骨架生成的App.java类(位于src/main/java下),将main方法中的内容替换为仓库内 HelloWorld.java 的示例代码:

package mxnet; import org.apache.mxnet.javaapi.*; import java.util.Arrays; public class HelloWorld { static NDArray$ NDArray = NDArray$.MODULE$; public static void main(String[] args) { System.out.println("Hello World!"); NDArray nd = new NDArray(new float[]{2.0f, 3.0f}, new Shape(new int[]{1, 2}), Context.cpu()); System.out.println(nd.shape()); NDArray nd2 = NDArray.dot(new dotParam(nd, nd.T()))[0]; System.out.println(Arrays.toString(nd2.toArray())); } }

这段代码演示了 MXNet Java API 的三类核心操作:

  1. 创建 NDArraynew NDArray(new float[]{2.0f, 3.0f}, new Shape(new int[]{1, 2}), Context.cpu())在 CPU 上创建一个形状为(1, 2)、取值为[2.0, 3.0]的张量;Shape描述维度,Context.cpu()指定计算设备;
  2. 打印形状nd.shape()返回该张量的维度信息;
  3. 矩阵点积NDArray.dot(new dotParam(nd, nd.T()))[0]计算nd与其转置nd.T()的点积——一个(1,2)向量与(2,1)向量点积,结果形状为(1,1),数值为2.0*2.0 + 3.0*3.0 = 13.0。注意 dot 类运算返回的是NDArray[]数组,因此取下标[0]获取结果。

为什么需要static NDArray$ NDArray = NDArray$.MODULE$;

org.apache.mxnet.javaapi包是基于 Scala 对象编译生成的 Java 接口,其中的NDArray是 Scala 伴生对象。Java 侧若要通过静态风格调用NDArray.dotNDArray.ones等伴生对象方法,必须先声明:

static NDArray$ NDArray = NDArray$.MODULE$;

这一行把 Scala 伴生对象的MODULE$单例暴露为 Java 静态字段,使后续NDArray.dot(...)这类调用可以正常编译执行。java-demo README 明确指出:使用 Param 对象与伴生对象 API 时必须保留这行前置声明。

Step 7.右键点击App.java,选择Run 'App.main()'运行程序。若一切正常,控制台输出应与以下结果类似:

Hello World! (1,2) Process finished with exit code 0

第一行是main方法直接打印的字符串;第二行(1,2)nd.shape()的输出;点积结果[13.0]通过Arrays.toString打印(不同依赖版本下该行输出格式可能略有差异)。Process finished with exit code 0表示进程正常结束、原生库加载成功。

进阶:仓库内的完整 Java Demo 示例

本次创建的项目是一个最小验证环境。当前仓库的 java-demo 目录 提供了五个可直接运行的示例类,可作为后续学习的扩展材料:

示例类演示内容
HelloWorld.javaNDArray 创建、形状查询与点积运算
NDArrayCreation.java多种 NDArray 构造方式:float/double 数组、ones全 1 张量、random_uniform随机张量
NDArrayOperation.java转置T()、类型转换asType、逐元素相加elemwise_add、L2 范数norm
ImageClassification.java基于 Predictor API 的 ResNet-18 图像分类推理
ObjectDetection.java基于 ObjectDetector API 的 ResNet-50 SSD 目标检测

其中 NDArrayCreation.java 展示了更多 NDArray 构造技巧:

// 创建 Double 类型 NDArray NDArray ndDouble = new NDArray(new double[]{2.0d, 3.0d}, new Shape(new int[]{2, 1}), Context.cpu()); // 创建全 1 张量,形状 (1, 2, 3) NDArray ones = NDArray.ones(Context.cpu(), new int[] {1, 2, 3}); // 在 [0, 2) 区间生成 10x10 均匀分布随机张量 NDArray random = NDArray.random_uniform( new random_uniformParam() .setLow(0.0f) .setHigh(2.0f) .setShape(new Shape(new int[]{10, 10})) )[0];

可以看到,MXNet Java API 中的算子(如random_uniform)统一采用Param 对象 + 返回数组的调用约定:参数通过xxxParam的链式setXxx方法配置,结果以NDArray[]返回后取[0]

而 ImageClassification.java 则演示了完整的推理链路:下载 ResNet-18 模型与测试图片 → 用DataDesc("data", new Shape(new int[]{1, 3, 224, 224}), DType.Float32(), "NCHW")声明输入描述 →Image.imRead读取图片 →imResize缩放到 224x224 →transpose将 HWC 转为 CHW →expand_dims增加 batch 维 →predictor.predict得到分类概率,并读取synset.txt打印最大概率类别。更多细节可参考 java-demo README 与 Java API 文档索引。

故障排查

如果运行报错,首先回头核对前置条件是否齐全。一个典型错误是 OpenCV 原生库缺失,错误信息中部会出现类似下面的片段(x.x为库版本号):

... Library not loaded: /usr/local/opt/opencv/lib/libopencv_calib3d.x.x.dylib ...

该错误说明系统未安装 OpenCV 或版本不匹配,解决方案是安装/升级 OpenCV(macOS 使用brew install opencv)。在 Ubuntu 上若遇到 OpenCV 问题,可尝试安装 OpenCV 3.4 的运行时库(1.2.0 及之后的 MXNet Java 包要求 OpenCV 3.4):

sudo add-apt-repository ppa:timsc/opencv-3.4 sudo apt-get update sudo apt install libopencv-imgcodecs3.4

其余依赖(JDK 8、Maven)的安装校验命令:

java -version # 应输出 1.8.x mvn -version # 应正常打印 Maven 版本

命令行构建与运行(可选)

除了在 IntelliJ 中运行,也可以完全在命令行完成编译与执行。切换到项目的根目录(即pom.xml所在目录),执行:

mvn clean install dependency:copy-dependencies

clean install完成清理、编译与安装,dependency:copy-dependencies会把所有依赖 jar 复制到target/dependency目录,便于后续用通配符指定 classpath。命令成功时输出以如下片段结尾:

[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.475 s [INFO] Finished at: 2018-11-08T05:06:31-08:00 [INFO] ------------------------------------------------------------------------

构建完成后,target目录下会生成javaMXNet-1.0-SNAPSHOT.jar(jar 名由 ArtifactId 与 Version 拼接而成)。在项目根目录执行以下命令运行App.java(假设主类为mxnet.App):

java -cp "target/javaMXNet-1.0-SNAPSHOT.jar:target/dependency/*" mxnet.App

输出应与在 IntelliJ 中运行时一致。若直接运行仓库内的 java-demo 项目,可参考其 README:mvn package构建后用bash bin/java_sample.sh运行 NDArray 示例;GPU 环境则添加-Dmxnet.profile=linux-x86_64-gpu参数。其他辅助命令包括:mvn clean清理构建产物,mvn eclipse:eclipse将 Maven 项目转换为 Eclipse 工程。

下一步

  • 查看 Java API 文档 了解完整 API 清单;
  • 阅读 Java 教程索引 与 SSD 推理教程 学习更多推理场景;
  • 参考仓库内 java-demo 演示项目 的五个示例类,依次跑通 NDArray 运算、图像分类与目标检测,即可全面掌握 MXNet Java 编程。

【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mxnet1/mxnet

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询