我在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
版本失败.