boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

解决Spring Boot镜像构建时JNA加载失败的问题


avatar
作者 2025年8月24日 23

解决Spring Boot镜像构建时JNA加载失败的问题

本文旨在帮助开发者解决在使用 spring Boot 构建 docker 镜像时,在 M1 Mac 上遇到的 “Can’t load library” 错误,该错误通常与 JNA (Java Native access) 库加载失败有关。通过调整 spring bootspring cloud 和 Java 的版本兼容性,可以有效地解决此问题,确保镜像构建顺利进行.

在 M1 Mac 上使用 Spring Boot 构建 Docker 镜像时,可能会遇到如下错误:Can’t load library: /Library/Caches/JNA/temp/jna10957970510011304471.tmp。 这个问题通常与 JNA 库的版本兼容性有关,尤其是在使用较新版本的 macos 和 Apple Silicon 芯片时。 以下提供了一种有效的解决方案,即通过调整 maven 项目中的 Spring Boot、Spring Cloud 和 Java 版本,以确保它们之间的兼容性。

解决方案:调整版本依赖

问题的核心在于 Spring Boot、Spring Cloud 和 Java 版本的兼容性。 不兼容的版本可能导致 JNA 库加载失败,从而阻止镜像的成功构建。 以下步骤详细说明了如何修改 pom.xml 文件来解决这个问题。

  1. 修改 Spring Boot 版本:

    将 <parent> 标签中的 spring-boot-starter-parent 版本更新到 2.7.5 或更高版本。 例如:

    <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>2.7.5</version>     <relativePath/> <!-- lookup parent from repository --> </parent>
  2. 修改 Java 版本:

    将 <properties> 标签中的 java.version 更新到 17 或更高版本。 例如:

    <properties>     <java.version>17</java.version>     <spring-cloud.version>2021.0.5</spring-cloud.version> </properties>
  3. 修改 Spring Cloud 版本:

    将 <properties> 标签中的 spring-cloud.version 更新到与 Spring Boot 版本兼容的版本。 对于 Spring Boot 2.7.5,Spring Cloud 2021.0.5 是一个合适的选择。 例如:

    <properties>     <java.version>17</java.version>     <spring-cloud.version>2021.0.5</spring-cloud.version> </properties>
  4. 更新 dependencyManagement 中的 Spring Cloud 版本:

    确保 <dependencyManagement> 标签中 spring-cloud-dependencies 的版本与 <properties> 中定义的 spring-cloud.version 相匹配。

    <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>
  5. 完整 pom.xml 示例:

    以下是一个修改后的 pom.xml 文件的示例,其中包含了上述所有更改:

    <?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.7.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>17</java.version>         <spring-cloud.version>2021.0.5</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>

注意事项

  • 版本兼容性: 务必确保 Spring Boot、Spring Cloud 和 Java 版本之间的兼容性。 可以参考 Spring Cloud 官方文档,查找与特定 Spring Boot 版本兼容的 Spring Cloud 版本。
  • 清理缓存: 在修改 pom.xml 文件后,建议清理 Maven 缓存并重新构建项目。 可以使用 mvn clean install 命令来完成此操作。
  • JDK 版本: 确保你的 ide (如 IntelliJ idea) 和 Maven 使用的是相同的 JDK 版本。 可以在 IDE 的设置中配置 JDK。

总结

通过调整 Spring Boot、Spring Cloud 和 Java 的版本,可以有效地解决在 M1 Mac 上构建 Spring Boot Docker 镜像时遇到的 JNA 加载失败问题。 关键在于确保这些依赖项之间的兼容性,并遵循上述步骤修改 pom.xml 文件。 在修改后,清理缓存并重新构建项目,应该能够成功构建 Docker 镜像。 如果在尝试这些步骤后仍然遇到问题,请检查 Maven 和 JDK 的配置,并确保它们与项目所需的版本匹配。



评论(已关闭)

评论已关闭