You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

M1 Mac在IntelliJ构建Spring Boot镜像时JNA库加载失败求助

M1 Mac构建Spring Boot镜像时JNA加载失败问题解决思路

问题描述

  • 环境:M1 Mac + IntelliJ
  • 操作:执行Spring Boot镜像构建
  • 报错信息:

Can't load library: /Users/.../Library/Caches/JNA/temp/jna10957970510011304471.tmp

  • 已尝试无效方案:添加JNA Maven依赖、更换JDK与Spring版本、手动将JNA jar包放入temp文件夹
  • 项目POM配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.5</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.in28minutes.microservices</groupId>
<artifactId>currency-exchange-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>currency-exchange-service-docker</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>16</java.version>
    <spring-cloud.version>2020.0.2</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin</artifactId>
    </dependency>

<!--        <dependency>-->
<!--            <groupId>org.springframework.amqp</groupId>-->
<!--            <artifactId>spring-rabbit</artifactId>-->
<!--        </dependency>-->

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot2</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <image>
                    <name>ingllot/mmv2-${project.artifactId}:${project.version}</name>
                </image>
                <pullPolicy>IF_NOT_PRESENT</pullPolicy>
            </configuration>                
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>
</project>

可行解决思路

1. 配置JNA架构适配参数

在IntelliJ的运行/构建配置中添加JVM参数,强制JNA适配M1的arm64架构:
-Djna.nosys=true -Djna.platform.library.path=/opt/homebrew/lib
或者直接在Maven构建命令中追加参数:
mvn spring-boot:build-image -Djna.nosys=true -Djna.platform.library.path=/opt/homebrew/lib

2. 清理JNA缓存目录

手动删除JNA缓存文件夹,让JNA重新生成适配arm64的临时文件:
rm -rf ~/Library/Caches/JNA/
删除后重新执行镜像构建操作。

3. 指定Docker构建平台

M1为arm64架构,构建时明确指定镜像平台,避免架构不兼容:
修改Spring Boot Maven插件配置,添加平台参数:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <name>ingllot/mmv2-${project.artifactId}:${project.version}</name>
            <platforms>
                <platform>linux/arm64</platform>
                <platform>linux/amd64</platform>
            </platforms>
        </image>
        <pullPolicy>IF_NOT_PRESENT</pullPolicy>
    </configuration>                
</plugin>

或者直接在命令行指定平台:
mvn spring-boot:build-image -Dspring-boot.build-image.platform=linux/arm64

4. 更新JNA至arm64兼容版本

在POM中显式指定更高版本的JNA依赖,确保对M1芯片的支持:

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version> <!-- 此版本及以上对arm64支持更完善 -->
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.13.0</version>
</dependency>

5. 检查Docker Desktop设置

确保Docker Desktop已开启Use the new Virtualization framework选项,同时在Settings > Features in development中启用Rosetta for x86/amd64 emulation on Apple Silicon,提升跨架构兼容性。

内容的提问来源于stack exchange,提问作者ING

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:35:31