Spring Boot: GraalVM原生镜像支持

huangapple go评论107阅读模式
英文:

Spring Boot: GraalVM Native Image Support

问题

Sure, here's the translated content you requested:

我有一个Spring Boot项目,最初使用的是Java 11的2.7.6版本,当前正在添加[GraalVM原生镜像支持][1],按照[使用Buildpacks构建原生镜像][2]的文档进行操作。我已经将版本更改为Java 17的3.1.0版本,并修改了pom.xml。我还对spring-data-jpa进行了更改,重构了导入语句,现在可以运行该应用程序。

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>

<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>

我对添加GraalVM的理解是它将加快应用程序的启动时间并减小jar文件或应用程序的Docker镜像的构建大小。以下是比较结果。

在GraalVM之前:
应用程序启动时间约为7秒
运行 mvn clean install 的时间约为15秒
Jar文件大小约为61MB

在GraalVM之后:
应用程序启动时间约为2秒
运行 mvn clean install -Pnative 的时间约为12秒
Jar文件大小约为77MB

问题如下:

  1. 我可以看到应用程序启动时间的性能提升,这很好,但是jar文件的大小已经增加,应该小于约61MB。

  2. 我是否使用了正确的GraalVM构建命令,即使用 mvn clean install -Pnative

  3. 在文档中有如下说明,我是否需要在pom.xml中添加任何内容?

用于镜像的构建器是paketobuildpacks/builder:tiny。它具有小的足迹和减小的攻击面,但如果需要,您也可以使用paketobuildpacks/builder:base或paketobuildpacks/builder:full,以在镜像中获得更多工具。

如果我在spring-boot-maven-plugin的配置中添加以下内容,我会收到共享的错误消息:

<image>
<buildpacks>
<buildpack>paketobuildpacks/builder:full</buildpack>
</buildpacks>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>

class org.springframework.boot.maven.Image无法转换为class org.springframework.boot.maven.FilterableDependency(org.springframework.boot.maven.Image和org.springframework.boot.maven.FilterableDependency位于加载器org.codehaus.plexus.classworlds.realm.ClassRealm @6228d0bd的未命名模块中)


更新:

当我运行 mvn -Pnative native:compile 时,我收到以下错误。

错误:应该在运行时初始化的类在图像构建期间被初始化:
在构建时意外初始化了org.apache.commons.logging.LogFactory。要查看为什么初始化了org.apache.commons.logging.LogFactory,请使用--trace-class-initialization=org.apache.commons.logging.LogFactory
在构建时意外初始化了org.apache.commons.logging.LogFactoryService。要查看为什么初始化了org.apache.commons.logging.LogFactoryService,请使用--trace-class-initialization=org.apache.commons.logging.LogFactoryService

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>3.1.0</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.xyz</groupId>
  12. <artifactId>abc</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>abc</name>
  15. <description>Application</description>
  16. <properties>
  17. <java.version>17</java.version>
  18. <springdoc-openapi-ui.version>1.6.13</springdoc-openapi-ui.version>
  19. <problem.version>0.26.0</problem.version>
  20. <org.json.version>20220320</org.json.version>
  21. <apache.commons.lang3.version>3.12.0</apache.commons.lang3.version>
  22. <checkstyle-plugin.version>3.2.0</checkstyle-plugin.version>
  23. <checkstyle.version>10.5.0</checkstyle.version>
  24. </properties>
  25. <dependencies>
  26. <!-- Your dependencies here -->
  27. </dependencies>
  28. <build>
  29. <plugins>
  30. <plugin>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-maven-plugin</artifactId>
  33. <configuration>
  34. <image>
  35. <buildpacks>
  36. <buildpack>paketobuildpacks/builder:full</buildpack>
  37. </buildpacks>
  38. <env>
  39. <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
  40. </env>
  41. </image>
  42. <excludes>
  43. <exclude>
  44. <groupId>org.projectlombok</groupId>
  45. <artifactId>lombok</artifactId>
  46. </exclude>
  47. </excludes>
  48. </configuration>
  49. <executions>
  50. <execution>
  51. <goals>
  52. <goal>build-info</goal>
  53. </goals>
  54. </execution>
  55. </executions>
  56. </plugin>
  57. <plugin>
  58. <groupId>org.graalvm.buildtools</groupId>
  59. <artifactId>native-maven-plugin</artifactId>
  60. </plugin>
  61. <!-- Other plugins -->
  62. </plugins>
  63. </build>
  64. </project>

控制台中还会看到以下日志:

  1. <details>
  2. <summary>英文:</summary>
  3. I have a Spring Boot project which was initially using version 2.7.6 with Java 11 and currently, I am adding the [GraalVM Native Image Support][1] by following the documentation with [Building a Native Image Using Buildpacks][2] option. I have changed the version to 3.1.0 with Java 17 and modified the pom.xml. I have also done the changes regarding spring-data-jpa and refactored the import statements and now I am able to run the application.
  4. &lt;parent&gt;
  5. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  6. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  7. &lt;version&gt;3.1.0&lt;/version&gt;
  8. &lt;/parent&gt;
  9. &lt;plugin&gt;
  10. &lt;groupId&gt;org.graalvm.buildtools&lt;/groupId&gt;
  11. &lt;artifactId&gt;native-maven-plugin&lt;/artifactId&gt;
  12. &lt;/plugin&gt;
  13. My understanding of adding the GraalVM is that it will make the application start-up time faster and reduce the build size of jar file or the docker image of an application. Below is the comparison.
  14. **Before GraalVM:** &lt;br&gt;
  15. Application start in ~7s &lt;br&gt;
  16. Time to run `mvn clean install` ~15s &lt;br&gt;
  17. Jar file size ~61MB
  18. **After GraalVM:** &lt;br&gt;
  19. Application start in : ~2s &lt;br&gt;
  20. Time to run `mvn clean install -Pnative` ~12s &lt;br&gt;
  21. Jar file size ~77MB
  22. **Questions are:**
  23. 1. I can see the performance on the application startup time which is good, however jar file size has increased which is supposed to be less than ~61MB
  24. 2. Does I am using the correct command for build with GraalVM by using `mvn clean install -Pnative`
  25. 3. In the documentation there is note as below, do I need to add anything in the pom.xml?
  26. &gt; The builder used for the images is paketobuildpacks/builder:tiny. It
  27. &gt; has small footprint and reduced attack surface, but you can also use
  28. &gt; paketobuildpacks/builder:base or paketobuildpacks/builder:full to have
  29. &gt; more tools available in the image if required.
  30. If I do add below in the configurations of spring-boot-maven-plugin, I am getting the shared error message
  31. &lt;image&gt;
  32. &lt;buildpacks&gt;
  33. &lt;buildpack&gt;paketobuildpacks/builder:full&lt;/buildpack&gt;
  34. &lt;/buildpacks&gt;
  35. &lt;env&gt;
  36. &lt;BP_NATIVE_IMAGE&gt;true&lt;/BP_NATIVE_IMAGE&gt;
  37. &lt;/env&gt;
  38. &lt;/image&gt;
  39. **class org.springframework.boot.maven.Image cannot be cast to class org.springframework.boot.maven.FilterableDependency (org.springframework.boot.maven.Image and org.springframework.boot.maven.FilterableDependency are in unnamed module of loader org.codehaus.plexus.classworlds.realm.ClassRealm @6228d0bd)**
  40. ----------
  41. **UPDATE:**
  42. When I do run `mvn -Pnative native:compile` I am getting the below error.
  43. **Error: Classes that should be initialized at run time got initialized during image building:
  44. org.apache.commons.logging.LogFactory was unintentionally initialized at build time. To see why org.apache.commons.logging.LogFactory got initialized use --trace-class-initialization=org.apache.commons.logging.LogFactory
  45. org.apache.commons.logging.LogFactoryService was unintentionally initialized at build time. To see why org.apache.commons.logging.LogFactoryService got initialized use --trace-class-initialization=org.apache.commons.logging.LogFactoryService**
  46. pom.xml
  47. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  48. &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  49. xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  50. &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  51. &lt;parent&gt;
  52. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  53. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  54. &lt;version&gt;3.1.0&lt;/version&gt;
  55. &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;
  56. &lt;/parent&gt;
  57. &lt;groupId&gt;com.xyz&lt;/groupId&gt;
  58. &lt;artifactId&gt;abc&lt;/artifactId&gt;
  59. &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
  60. &lt;name&gt;abc&lt;/name&gt;
  61. &lt;description&gt;Application&lt;/description&gt;
  62. &lt;properties&gt;
  63. &lt;java.version&gt;17&lt;/java.version&gt;
  64. &lt;springdoc-openapi-ui.version&gt;1.6.13&lt;/springdoc-openapi-ui.version&gt;
  65. &lt;problem.version&gt;0.26.0&lt;/problem.version&gt;
  66. &lt;org.json.version&gt;20220320&lt;/org.json.version&gt;
  67. &lt;apache.commons.lang3.version&gt;3.12.0&lt;/apache.commons.lang3.version&gt;
  68. &lt;checkstyle-plugin.version&gt;3.2.0&lt;/checkstyle-plugin.version&gt;
  69. &lt;checkstyle.version&gt;10.5.0&lt;/checkstyle.version&gt;
  70. &lt;/properties&gt;
  71. &lt;dependencies&gt;
  72. &lt;dependency&gt;
  73. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  74. &lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt;
  75. &lt;/dependency&gt;
  76. &lt;dependency&gt;
  77. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  78. &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;
  79. &lt;/dependency&gt;
  80. &lt;dependency&gt;
  81. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  82. &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
  83. &lt;/dependency&gt;
  84. &lt;dependency&gt;
  85. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  86. &lt;artifactId&gt;spring-boot-starter-validation&lt;/artifactId&gt;
  87. &lt;/dependency&gt;
  88. &lt;dependency&gt;
  89. &lt;groupId&gt;org.json&lt;/groupId&gt;
  90. &lt;artifactId&gt;json&lt;/artifactId&gt;
  91. &lt;version&gt;${org.json.version}&lt;/version&gt;
  92. &lt;/dependency&gt;
  93. &lt;dependency&gt;
  94. &lt;groupId&gt;com.microsoft.sqlserver&lt;/groupId&gt;
  95. &lt;artifactId&gt;mssql-jdbc&lt;/artifactId&gt;
  96. &lt;/dependency&gt;
  97. &lt;dependency&gt;
  98. &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
  99. &lt;artifactId&gt;lombok&lt;/artifactId&gt;
  100. &lt;optional&gt;true&lt;/optional&gt;
  101. &lt;/dependency&gt;
  102. &lt;dependency&gt;
  103. &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;
  104. &lt;artifactId&gt;commons-lang3&lt;/artifactId&gt;
  105. &lt;version&gt;${apache.commons.lang3.version}&lt;/version&gt;
  106. &lt;/dependency&gt;
  107. &lt;dependency&gt;
  108. &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;
  109. &lt;artifactId&gt;commons-collections4&lt;/artifactId&gt;
  110. &lt;version&gt;4.4&lt;/version&gt;
  111. &lt;/dependency&gt;
  112. &lt;dependency&gt;
  113. &lt;groupId&gt;org.springdoc&lt;/groupId&gt;
  114. &lt;artifactId&gt;springdoc-openapi-starter-webmvc-ui&lt;/artifactId&gt;
  115. &lt;version&gt;2.0.2&lt;/version&gt;
  116. &lt;/dependency&gt;
  117. &lt;dependency&gt;
  118. &lt;groupId&gt;org.zalando&lt;/groupId&gt;
  119. &lt;artifactId&gt;problem-spring-web&lt;/artifactId&gt;
  120. &lt;version&gt;${problem.version}&lt;/version&gt;
  121. &lt;/dependency&gt;
  122. &lt;dependency&gt;
  123. &lt;groupId&gt;org.zalando&lt;/groupId&gt;
  124. &lt;artifactId&gt;jackson-datatype-problem&lt;/artifactId&gt;
  125. &lt;version&gt;${problem.version}&lt;/version&gt;
  126. &lt;/dependency&gt;
  127. &lt;dependency&gt;
  128. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  129. &lt;artifactId&gt;mapstruct&lt;/artifactId&gt;
  130. &lt;version&gt;1.5.3.Final&lt;/version&gt;
  131. &lt;/dependency&gt;
  132. &lt;dependency&gt;
  133. &lt;groupId&gt;com.github.xeroapi&lt;/groupId&gt;
  134. &lt;artifactId&gt;xero-java&lt;/artifactId&gt;
  135. &lt;version&gt;4.26.0&lt;/version&gt;
  136. &lt;/dependency&gt;
  137. &lt;dependency&gt;
  138. &lt;groupId&gt;com.google.http-client&lt;/groupId&gt;
  139. &lt;artifactId&gt;google-http-client&lt;/artifactId&gt;
  140. &lt;version&gt;1.43.1&lt;/version&gt;
  141. &lt;/dependency&gt;
  142. &lt;dependency&gt;
  143. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  144. &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
  145. &lt;scope&gt;test&lt;/scope&gt;
  146. &lt;/dependency&gt;
  147. &lt;/dependencies&gt;
  148. &lt;build&gt;
  149. &lt;plugins&gt;
  150. &lt;plugin&gt;
  151. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  152. &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
  153. &lt;configuration&gt;
  154. &lt;image&gt;
  155. &lt;buildpacks&gt;
  156. &lt;buildpack&gt;paketobuildpacks/builder:full&lt;/buildpack&gt;
  157. &lt;/buildpacks&gt;
  158. &lt;env&gt;
  159. &lt;BP_NATIVE_IMAGE&gt;true&lt;/BP_NATIVE_IMAGE&gt;
  160. &lt;/env&gt;
  161. &lt;/image&gt;
  162. &lt;excludes&gt;
  163. &lt;exclude&gt;
  164. &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
  165. &lt;artifactId&gt;lombok&lt;/artifactId&gt;
  166. &lt;/exclude&gt;
  167. &lt;/excludes&gt;
  168. &lt;/configuration&gt;
  169. &lt;executions&gt;
  170. &lt;execution&gt;
  171. &lt;goals&gt;
  172. &lt;goal&gt;build-info&lt;/goal&gt;
  173. &lt;/goals&gt;
  174. &lt;/execution&gt;
  175. &lt;/executions&gt;
  176. &lt;/plugin&gt;
  177. &lt;plugin&gt;
  178. &lt;groupId&gt;org.graalvm.buildtools&lt;/groupId&gt;
  179. &lt;artifactId&gt;native-maven-plugin&lt;/artifactId&gt;
  180. &lt;/plugin&gt;
  181. &lt;plugin&gt;
  182. &lt;groupId&gt;com.google.cloud.tools&lt;/groupId&gt;
  183. &lt;artifactId&gt;jib-maven-plugin&lt;/artifactId&gt;
  184. &lt;version&gt;3.3.1&lt;/version&gt;
  185. &lt;/plugin&gt;
  186. &lt;plugin&gt;
  187. &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
  188. &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
  189. &lt;version&gt;3.10.1&lt;/version&gt;
  190. &lt;configuration&gt;
  191. &lt;source&gt;17&lt;/source&gt;
  192. &lt;target&gt;17&lt;/target&gt;
  193. &lt;annotationProcessorPaths&gt;
  194. &lt;path&gt;
  195. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  196. &lt;artifactId&gt;mapstruct-processor&lt;/artifactId&gt;
  197. &lt;version&gt;1.5.3.Final&lt;/version&gt;
  198. &lt;/path&gt;
  199. &lt;path&gt;
  200. &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
  201. &lt;artifactId&gt;lombok&lt;/artifactId&gt;
  202. &lt;version&gt;1.18.26&lt;/version&gt;
  203. &lt;/path&gt;
  204. &lt;path&gt;
  205. &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
  206. &lt;artifactId&gt;lombok-mapstruct-binding&lt;/artifactId&gt;
  207. &lt;version&gt;0.2.0&lt;/version&gt;
  208. &lt;/path&gt;
  209. &lt;/annotationProcessorPaths&gt;
  210. &lt;/configuration&gt;
  211. &lt;/plugin&gt;
  212. &lt;plugin&gt;
  213. &lt;groupId&gt;pl.project13.maven&lt;/groupId&gt;
  214. &lt;artifactId&gt;git-commit-id-plugin&lt;/artifactId&gt;
  215. &lt;/plugin&gt;
  216. &lt;plugin&gt;
  217. &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
  218. &lt;artifactId&gt;maven-checkstyle-plugin&lt;/artifactId&gt;
  219. &lt;version&gt;${checkstyle-plugin.version}&lt;/version&gt;
  220. &lt;dependencies&gt;
  221. &lt;dependency&gt;
  222. &lt;groupId&gt;com.puppycrawl.tools&lt;/groupId&gt;
  223. &lt;artifactId&gt;checkstyle&lt;/artifactId&gt;
  224. &lt;version&gt;${checkstyle.version}&lt;/version&gt;
  225. &lt;/dependency&gt;
  226. &lt;/dependencies&gt;
  227. &lt;executions&gt;
  228. &lt;execution&gt;
  229. &lt;id&gt;checkstyle&lt;/id&gt;
  230. &lt;phase&gt;validate&lt;/phase&gt;
  231. &lt;goals&gt;
  232. &lt;goal&gt;check&lt;/goal&gt;
  233. &lt;/goals&gt;
  234. &lt;/execution&gt;
  235. &lt;/executions&gt;
  236. &lt;configuration&gt;
  237. &lt;configLocation&gt;checkstyle.xml&lt;/configLocation&gt;
  238. &lt;excludes&gt;**/module-info.java,**/target/**/*,**/protocols/**/*&lt;/excludes&gt;
  239. &lt;consoleOutput&gt;true&lt;/consoleOutput&gt;
  240. &lt;failsOnError&gt;true&lt;/failsOnError&gt;
  241. &lt;violationSeverity&gt;warning&lt;/violationSeverity&gt;
  242. &lt;failOnViolation&gt;true&lt;/failOnViolation&gt;
  243. &lt;linkXRef&gt;false&lt;/linkXRef&gt;
  244. &lt;/configuration&gt;
  245. &lt;/plugin&gt;
  246. &lt;/plugins&gt;
  247. &lt;/build&gt;
  248. &lt;/project&gt;
  249. In console I can also see the below logs
  250. Warning: Could not resolve org.jboss.logmanager.LogManager for reflection configuration. Reason: java.lang.ClassNotFoundException: org.jboss.logmanager.LogManager.
  251. Warning: Could not resolve com.sun.el.ExpressionFactoryImpl for reflection configuration. Reason: java.lang.ClassNotFoundException: com.sun.el.ExpressionFactoryImpl.
  252. Warning: Could not resolve groovy.grape.GrabAnnotationTransformation for reflection configuration. Reason: java.lang.ClassNotFoundException: groovy.grape.GrabAnnotationTransformation.
  253. Warning: Could not resolve groovy.lang.Script for reflection configuration. Reason: java.lang.ClassNotFoundException: groovy.lang.Script.
  254. Warning: Could not resolve groovy.lang.Script for reflection configuration. Reason: java.lang.ClassNotFoundException: groovy.lang.Script.
  255. Warning: Could not resolve groovyjarjarantlr.CommonToken for reflection configuration. Reason: java.lang.ClassNotFoundException: groovyjarjarantlr.CommonToken.
  256. Warning: Could not resolve javafx.beans.value.ObservableValue for reflection configuration. Reason: java.lang.ClassNotFoundException: javafx.beans.value.ObservableValue.
  257. Warning: Could not resolve javax.money.MonetaryAmount for reflection configuration. Reason: java.lang.ClassNotFoundException: javax.money.MonetaryAmount.
  258. Warning: Could not resolve org.codehaus.groovy.antlr.GroovySourceAST for reflection configuration. Reason: java.lang.ClassNotFoundException: org.codehaus.groovy.antlr.GroovySourceAST.
  259. Warning: Could not resolve org.codehaus.groovy.ast.builder.AstBuilderTransformation for reflection configuration. Reason: java.lang.ClassNotFoundException: org.codehaus.groovy.ast.builder.AstBuilderTransformation.
  260. Warning: Could not resolve org.codehaus.groovy.runtime.ScriptBytecodeAdapter for reflection configuration. Reason: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.ScriptBytecodeAdapter.
  261. Warning: Could not resolve org.glassfish.expressly.ValueExpressionImpl for reflection configuration. Reason: java.lang.ClassNotFoundException: org.glassfish.expressly.ValueExpressionImpl.
  262. Warning: Could not resolve org.glassfish.expressly.parser.AstValue for reflection configuration. Reason: java.lang.ClassNotFoundException: org.glassfish.expressly.parser.AstValue.
  263. Warning: Could not resolve org.joda.time.ReadableInstant for reflection configuration. Reason: java.lang.ClassNotFoundException: org.joda.time.ReadableInstant.
  264. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  265. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  266. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  267. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  268. Warning: Method com.zaxxer.hikari.HikariConfig.getScheduledExecutorService() not found.
  269. Warning: Method com.zaxxer.hikari.HikariConfig.isInitializationFailFast() not found.
  270. Warning: Method com.zaxxer.hikari.HikariConfig.isJdbc4ConnectionTest() not found.
  271. Warning: Method com.zaxxer.hikari.HikariConfig.setInitializationFailFast(boolean) not found.
  272. Warning: Method com.zaxxer.hikari.HikariConfig.setJdbc4ConnectionTest(boolean) not found.
  273. Warning: Method com.zaxxer.hikari.HikariConfig.setScheduledExecutorService(ScheduledThreadPoolExecutor) not found.
  274. Warning: Could not resolve oracle.jdbc.OracleConnection for reflection configuration. Reason: java.lang.ClassNotFoundException: oracle.jdbc.OracleConnection.
  275. Warning: Could not resolve org.h2.Driver for reflection configuration. Reason: java.lang.ClassNotFoundException: org.h2.Driver.
  276. Warning: Could not resolve org.postgresql.util.PGobject for reflection configuration. Reason: java.lang.ClassNotFoundException: org.postgresql.util.PGobject.
  277. Warning: Method com.zaxxer.hikari.HikariConfig.getScheduledExecutorService() not found.
  278. Warning: Method com.zaxxer.hikari.HikariConfig.isInitializationFailFast() not found.
  279. Warning: Method com.zaxxer.hikari.HikariConfig.isJdbc4ConnectionTest() not found.
  280. Warning: Method com.zaxxer.hikari.HikariConfig.setInitializationFailFast(boolean) not found.
  281. Warning: Method com.zaxxer.hikari.HikariConfig.setJdbc4ConnectionTest(boolean) not found.
  282. Warning: Method com.zaxxer.hikari.HikariConfig.setScheduledExecutorService(ScheduledThreadPoolExecutor) not found.
  283. Warning: Could not resolve org.hibernate.service.jta.platform.internal.NoJtaPlatform for reflection configuration. Reason: java.lang.ClassNotFoundException: org.hibernate.service.jta.platform.internal.NoJtaPlatform.
  284. Warning: Could not resolve oracle.jdbc.OracleConnection for reflection configuration. Reason: java.lang.ClassNotFoundException: oracle.jdbc.OracleConnection.
  285. Warning: Could not resolve org.h2.Driver for reflection configuration. Reason: java.lang.ClassNotFoundException: org.h2.Driver.
  286. Warning: Could not resolve org.postgresql.util.PGobject for reflection configuration. Reason: java.lang.ClassNotFoundException: org.postgresql.util.PGobject.
  287. Warning: Could not resolve org.jboss.logmanager.LogManager for reflection configuration. Reason: java.lang.ClassNotFoundException: org.jboss.logmanager.LogManager.
  288. Warning: Could not resolve com.sun.el.ExpressionFactoryImpl for reflection configuration. Reason: java.lang.ClassNotFoundException: com.sun.el.ExpressionFactoryImpl.
  289. Warning: Could not resolve groovy.grape.GrabAnnotationTransformation for reflection configuration. Reason: java.lang.ClassNotFoundException: groovy.grape.GrabAnnotationTransformation.
  290. Warning: Could not resolve groovy.lang.Script for reflection configuration. Reason: java.lang.ClassNotFoundException: groovy.lang.Script.
  291. Warning: Could not resolve groovy.lang.Script for reflection configuration. Reason: java.lang.ClassNotFoundException: groovy.lang.Script.
  292. Warning: Could not resolve groovyjarjarantlr.CommonToken for reflection configuration. Reason: java.lang.ClassNotFoundException: groovyjarjarantlr.CommonToken.
  293. Warning: Could not resolve javafx.beans.value.ObservableValue for reflection configuration. Reason: java.lang.ClassNotFoundException: javafx.beans.value.ObservableValue.
  294. Warning: Could not resolve javax.money.MonetaryAmount for reflection configuration. Reason: java.lang.ClassNotFoundException: javax.money.MonetaryAmount.
  295. Warning: Could not resolve org.codehaus.groovy.antlr.GroovySourceAST for reflection configuration. Reason: java.lang.ClassNotFoundException: org.codehaus.groovy.antlr.GroovySourceAST.
  296. Warning: Could not resolve org.codehaus.groovy.ast.builder.AstBuilderTransformation for reflection configuration. Reason: java.lang.ClassNotFoundException: org.codehaus.groovy.ast.builder.AstBuilderTransformation.
  297. Warning: Could not resolve org.codehaus.groovy.runtime.ScriptBytecodeAdapter for reflection configuration. Reason: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.ScriptBytecodeAdapter.
  298. Warning: Could not resolve org.glassfish.expressly.ValueExpressionImpl for reflection configuration. Reason: java.lang.ClassNotFoundException: org.glassfish.expressly.ValueExpressionImpl.
  299. Warning: Could not resolve org.glassfish.expressly.parser.AstValue for reflection configuration. Reason: java.lang.ClassNotFoundException: org.glassfish.expressly.parser.AstValue.
  300. Warning: Could not resolve org.joda.time.ReadableInstant for reflection configuration. Reason: java.lang.ClassNotFoundException: org.joda.time.ReadableInstant.
  301. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  302. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  303. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  304. Warning: Could not register method org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForReadablePartial.&lt;init&gt;() for reflection. Reason: java.lang.NoClassDefFoundError: org/joda/time/ReadableInstant.
  305. [1]: https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html
  306. [2]: https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html#native-image.developing-your-first-application.buildpacks
  307. </details>
  308. # 答案1
  309. **得分**: 1
  310. I had the same problem of your update and I fixed it by adding this args configuration in native-maven-plugin.
  1. <plugin>
  2. <groupId>org.graalvm.buildtools</groupId>
  3. <artifactId>native-maven-plugin</artifactId>
  4. <configuration>
  5. <buildArgs>
  6. <arg>
  7. --initialize-at-build-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService,
  8. </arg>
  9. </buildArgs>
  10. </configuration>
  11. </plugin>
  1. <details>
  2. <summary>英文:</summary>
  3. I hade the same problem of your update and I fixed it by adding this args configuration in native-maven-plugin.
  1. &lt;plugin&gt;
  2. &lt;groupId&gt;org.graalvm.buildtools&lt;/groupId&gt;
  3. &lt;artifactId&gt;native-maven-plugin&lt;/artifactId&gt;
  4. &lt;configuration&gt;
  5. &lt;buildArgs&gt;
  6. &lt;arg&gt;
  7. --initialize-at-build-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService,
  8. &lt;/arg&gt;
  9. &lt;/buildArgs&gt;
  10. &lt;/configuration&gt;
  11. &lt;/plugin&gt;
  1. </details>
  2. # 答案2
  3. **得分**: 0
  4. 我可以看到应用程序启动时间的性能很好,但是jar文件大小已经增加,应该小于~61MB。
  5. 本地镜像是一个特定平台的二进制文件,可以在没有JVM的情况下执行。jar文件的大小并不重要。
  6. 我是否正在使用正确的命令来使用GraalVM构建,使用mvn clean install -Pnative?
  7. 如果你想要使用构建包来创建一个包含本地可执行文件的容器镜像,你应该运行 `mvn -Pnative spring-boot:build-image`。
  8. 如果你想在你的机器上直接构建本地可执行文件,你应该运行 `mvn -Pnative native:compile`。你还需要添加本地构建工具Maven插件:
  9. ```xml
  10. <plugin>
  11. <groupId>org.graalvm.buildtools</groupId>
  12. <artifactId>native-maven-plugin</artifactId>
  13. </plugin>

如果我在spring-boot-maven-plugin的配置中添加以下内容,我会得到共享的错误消息。

只看到配置片段并没有堆栈跟踪,很难确定,但我怀疑你将配置放在了错误的标签中。它应该类似于这样:

  1. <plugin>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-maven-plugin</artifactId>
  4. <configuration>
  5. <image>
  6. <buildpacks>
  7. <buildpack>paketobuildpacks/builder:full</buildpack>
  8. </buildpacks>
  9. <env>
  10. <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
  11. </env>
  12. </image>
  13. </configuration>
  14. </plugin>
英文:

> I can see the performance on the application startup time which is good, however jar file size has increased which is supposed to be less than ~61MB

A native image is a platform-specific binary that can be executed without a JVM. The size of the jar file isn't relevant.

> Does I am using the correct command for build with GraalVM by using mvn clean install -Pnative

If you want to use buildpacks to create a container image that contains a native executable you should run mvn -Pnative spring-boot:build-image.

If you want to build a native executable directly on your machine, you should run mvn -Pnative native:compile. You also need to add the Native Build Tools Maven plugin:

  1. &lt;plugin&gt;
  2. &lt;groupId&gt;org.graalvm.buildtools&lt;/groupId&gt;
  3. &lt;artifactId&gt;native-maven-plugin&lt;/artifactId&gt;
  4. &lt;/plugin&gt;

> If I do add below in the configurations of spring-boot-maven-plugin, I am getting the shared error message

It's hard to tell with only a snippet of configuration and no stack trace but I suspect you've placed the configuration within the wrong tags. It should look something like this:

  1. &lt;plugin&gt;
  2. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  3. &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
  4. &lt;configuration&gt;
  5. &lt;image&gt;
  6. &lt;buildpacks&gt;
  7. &lt;buildpack&gt;paketobuildpacks/builder:full&lt;/buildpack&gt;
  8. &lt;/buildpacks&gt;
  9. &lt;env&gt;
  10. &lt;BP_NATIVE_IMAGE&gt;true&lt;/BP_NATIVE_IMAGE&gt;
  11. &lt;/env&gt;
  12. &lt;/image&gt;
  13. &lt;/configuration&gt;
  14. &lt;/plugin&gt;

huangapple
  • 本文由 发表于 2023年6月1日 13:04:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/76378803.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定