我在Windows上,假设我正在从Spring Initializr下载一个默认的demo项目,如下所示:

现在,为了运行该项目,我还将向application.properties添加默认的H2支持:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

接下来,我将添加一个简单的HelloWorldController.java控制器,如下所示:

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController
{
    @GetMapping("/")
    public String index()
    {
        return "Greetings from Spring Boot!";
    }
}

我可以从IntelliJ IDEA成功地运行rest API,或者编译一个可执行文件JAR并运行它,在浏览器中转到http://localhost:8080就可以像预期的那样工作.

我的native-image版本是:

>where gu
C:\graalvm-ee-java19-windows-amd64-22.3.1\bin\gu.cmd

我的Java版本是:

>java -version
java version "19.0.1" 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)

根据HELP.md,我可以通过运行mvnw native:compile -Pnative(通过管理员x64 Native Tools Command Prompt for VS 2022)来编译本机映像,所以我做到了.我遇到的第一个错误与文件路径(Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <> at index 3)中的空格有关,我通过将整个项目移到不带空格的文件路径中修复了它.(然而,如今这根本不应该是问题.)

现在,经过大约8分钟的等待,本机编译成功了.在运行demo.exe时,它无法启动:

D:\Moved\demo>target\demo

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.6)

2023-04-26T00:04:22.787+02:00  INFO 28544 --- [           main] com.example.demo.DemoApplication         : Starting AOT-processed DemoApplication using Java 19.0.2 with PID 28544 (D:\Moved\demo\target\demo.exe started by BullyWiiPlaza in D:\Moved\demo)
2023-04-26T00:04:22.787+02:00  INFO 28544 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to 1 default profile: "default"
2023-04-26T00:04:23.017+02:00  INFO 28544 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-04-26T00:04:23.020+02:00  INFO 28544 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-04-26T00:04:23.020+02:00  INFO 28544 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.8]
2023-04-26T00:04:23.052+02:00  INFO 28544 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-04-26T00:04:23.053+02:00  INFO 28544 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 265 ms
2023-04-26T00:04:23.107+02:00  INFO 28544 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-04-26T00:04:23.113+02:00  INFO 28544 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA
2023-04-26T00:04:23.114+02:00  INFO 28544 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-04-26T00:04:23.116+02:00  WARN 28544 --- [           main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': Instantiation of supplied bean failed
2023-04-26T00:04:23.116+02:00  INFO 28544 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-04-26T00:04:23.121+02:00  INFO 28544 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2023-04-26T00:04:23.123+02:00  INFO 28544 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-04-26T00:04:23.127+02:00 ERROR 28544 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': Instantiation of supplied bean failed
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1220) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1158) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[demo.exe:6.0.8]
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1132) ~[demo.exe:6.0.8]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:907) ~[demo.exe:6.0.8]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[demo.exe:6.0.8]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[demo.exe:3.0.6]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[demo.exe:3.0.6]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[demo.exe:3.0.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[demo.exe:3.0.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[demo.exe:3.0.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[demo.exe:3.0.6]
        at com.example.demo.DemoApplication.main(DemoApplication.java:10) ~[demo.exe:na]
Caused by: java.lang.IllegalStateException: No available JtaPlatform candidates amongst [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform, org.hibernate.service.jta.platform.internal.NoJtaPlatform]
        at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.getNoJtaPlatformManager(HibernateJpaConfiguration.java:213) ~[demo.exe:na]
        at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.configureJtaPlatform(HibernateJpaConfiguration.java:150) ~[demo.exe:na]
        at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.customizeVendorProperties(HibernateJpaConfiguration.java:139) ~[demo.exe:na]
        at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.entityManagerFactory(JpaBaseConfiguration.java:132) ~[demo.exe:na]
        at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration__BeanDefinitions.lambda$getEntityManagerFactoryInstanceSupplier$3(JpaBaseConfiguration__BeanDefinitions.java:84) ~[na:na]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:68) ~[demo.exe:6.0.8]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:54) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.lambda$get$2(BeanInstanceSupplier.java:204) ~[na:na]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[demo.exe:6.0.8]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.invokeBeanSupplier(BeanInstanceSupplier.java:216) ~[na:na]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.get(BeanInstanceSupplier.java:204) ~[na:na]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:947) ~[demo.exe:6.0.8]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1214) ~[demo.exe:6.0.8]
        ... 17 common frames omitted

那么,它不起作用了,为什么?

经过进一步的研究,我发现了this个问题和相关的问题.此外,try Spring Boot版本3.0.5运行良好,而3.0.6版本失败.

推荐答案

由于缺少本机提示,我面临着同样的回归,在a thread个中找到了3个简单的解决方案,链接在您所指的一个的底部.以下是从侵入性较小(首选)到最具侵入性的 Select :

  • native-maven-plugin版本0.9.21中元数据存储库从0.2.7降级到0.2.6(这是Boot 3.0.6的默认设置):
<plugin>
    <groupId>org.graalvm.buildtools</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <configuration>
        <metadataRepository>
            <enabled>true</enabled>
            <version>0.2.6</version>
        </metadataRepository>
    </configuration>
</plugin>
  • hibernate-core使用较早的元数据存储库(6.1.1.Final而不是Boot 3.0.6的默认设置6.1.7.Final):
<plugin>
    <groupId>org.graalvm.buildtools</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <configuration>
        <metadataRepository>
            <dependencies>
                <dependency>
                    <groupId>org.hibernate.orm</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <metadataVersion>6.1.1.Final</metadataVersion>
                </dependency>
            </dependencies>
        </metadataRepository>
    </configuration>
</plugin>
  • native-maven-plugin的评级从0.9.21下调至0.9.20:
<plugin>
    <groupId>org.graalvm.buildtools</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <version>0.9.20</version>
</plugin>

对于Spring Boot,该问题被跟踪为here,对于native-build-tools,该问题被跟踪为there

附注:

对于那些使用Gradle而不是Maven的人来说,有一个相当于Spring Boot thread中的第一个解决方案

graalvmNative {
    metadataRepository {
        version = "0.2.6"
    }
}

Java相关问答推荐

Proguard配置以保留具有参数的注释的成员

Java模式匹配记录

Jlink选项&-strie-ative-Commands";的作用是什么?

如何修复IndexOutOfBoundsException在ClerView适配器的onRowMoved函数?

Java LocalTime.parse在本地PC上的Spring Boot中工作,但在Docker容器中不工作

SpringBoot+Java 17@Valid未验证POJO

从Spring5迁移到Spring6:无法在雅加达包中找到类

为什么在maven中,getLast方法不适用于List?

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

继续收到错误SQLJDBC EXCEPTION执行";org.springframework.dao.InvalidDataAccessResourceUsageException:&

将PNG转换为位图自定义十六进制字符串

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

从泛型枚举创建EnumMap

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

未调用OnBackPressedCallback-Activitiy立即终止

字符串的Gzip压缩在java11和java17中给出了不同的结果

将基于实例编号的对象列表拆分为新的对象列表

如何使用stream.allMatch()为空流返回false?

为什么Java编译器为没有参数的方法(getter方法)创建桥接方法