Spring Native 打包成 exe 可执行文件
Spring Native GraalVM Maven About 13,727 words参考
https://docs.spring.io/spring-native/docs/current/reference/htmlsingle
前提
下载了GraalVM CE 22.0.0.2
(22.1.0
版本打包Spring Native
应用为exe
时有Bug
,不推荐下载此版本。)
Fatal error: Unsupported OptionOrigin
Execution of native-image.cmd returned non-zero result
安装了native-image
。使用如下命令安装:
gu.cmd install native-image
下载 Demo 工程
git clone https://github.com/spring-guides/gs-rest-service
cd gs-rest-service/complete
注意
experimental
的依赖需要在spring-release
仓库拉取,在settings.xml
中确认是否不走代理。
主要是*,!spring-release
,!spring-release
表示!spring-release
不走代理下载。
<mirror>
<id>local repo</id>
<name>local nexus repository</name>
<url>http://192.168.100.1</url>
<mirrorOf>*,!spring-release</mirrorOf>
</mirror>
完整 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.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>rest-service-complete</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rest-service-complete</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>0.12.0</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
<execution>
<id>test-generate</id>
<goals>
<goal>test-generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<!-- ... -->
<repository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
<pluginRepositories>
<!-- ... -->
<pluginRepository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</pluginRepository>
</pluginRepositories>
<profiles>
<profile>
<id>native</id>
<dependencies>
<!-- Required with Maven Surefire 2.x -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.11</version>
<extensions>true</extensions>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
</execution>
<execution>
<id>test-native</id>
<goals>
<goal>test</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
<configuration>
<!-- ... -->
</configuration>
</plugin>
<!-- Avoid a clash between Spring Boot repackaging and native-maven-plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
打包
需在X64 Native Tools Command Prompt for VS 2022
命令行中运行mvn
命令。
mvn -Pnative clean package
输出
========================================================================================================================
GraalVM Native Image: Generating 'rest-service-complete'...
========================================================================================================================
[1/7] Initializing... (22.3s @ 0.22GB)
Warning: Could not register org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer: allDeclaredConstructors for reflection. Reason: java.lang.NoClassDefFoundError: org/springframework/jdbc/CannotGetJdbcConnectionException.
Warning: Could not register org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer: allDeclaredConstructors for reflection. Reason: java.lang.NoClassDefFoundError: javax/validation/ValidationException.
Warning: Could not register org.springframework.boot.liquibase.LiquibaseChangelogMissingFailureAnalyzer: allDeclaredConstructors for reflection. Reason: java.lang.NoClassDefFoundError: liquibase/exception/ChangeLogParseException.
Version info: 'GraalVM 22.0.0.2 Java 17 CE'
The bundle named: org.apache.tomcat.util.threads.res.LocalStrings, has not been found. If the bundle is part of a module, verify the bundle name is a fully qualified class name. Otherwise verify the bundle path is accessible in the classpath.
[2/7] Performing analysis... [**********] (92.7s @ 3.42GB)
Warning: Could not register complete reflection metadata for org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator. Reason(s): java.lang.NoClassDefFoundError: org/aspectj/util/PartialOrder$PartialComparable
Warning: Could not register complete reflection metadata for org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer. Reason(s): java.lang.NoClassDefFoundError: javax/validation/ValidationException
Warning: Could not register complete reflection metadata for org.springframework.boot.liquibase.LiquibaseChangelogMissingFailureAnalyzer. Reason(s): java.lang.NoClassDefFoundError: liquibase/exception/ChangeLogParseException
Warning: Could not register complete reflection metadata for org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer. Reason(s): java.lang.NoClassDefFoundError: org/springframework/jdbc/CannotGetJdbcConnectionException
Warning: Could not register complete reflection metadata for org.springframework.validation.beanvalidation.SpringValidatorAdapter$ViolationFieldError. Reason(s): java.lang.NoClassDefFoundError: javax/validation/Validator, java.lang.NoClassDefFoundError: javax/validation/ConstraintViolation
Warning: Could not register complete reflection metadata for org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator. Reason(s): java.lang.NoClassDefFoundError: org/aspectj/util/PartialOrder$PartialComparable
13,806 (90.66%) of 15,228 classes reachable
22,214 (73.31%) of 30,300 fields reachable
68,163 (62.55%) of 108,977 methods reachable
755 classes, 268 fields, and 3,409 methods registered for reflection
81 classes, 75 fields, and 67 methods registered for JNI access
[3/7] Building universe... (6.0s @ 4.32GB)
[4/7] Parsing methods... [***] (5.7s @ 2.83GB)
[5/7] Inlining methods... [*****] (5.6s @ 5.14GB)
[6/7] Compiling methods... [*******] (52.5s @ 3.34GB)
[7/7] Creating image... (6.1s @ 1.86GB)
29.07MB (43.00%) for code area: 45,649 compilation units
33.25MB (49.19%) for image heap: 9,581 classes and 425,231 objects
5.28MB ( 7.81%) for other data
67.60MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area: Top 10 object types in image heap:
1.67MB sun.security.ssl 11.87MB byte[] for general heap data
1.02MB java.util 3.26MB java.lang.Class
1010.29KB com.oracle.svm.core.reflect 2.90MB java.lang.String
718.04KB com.sun.crypto.provider 2.42MB byte[] for java.lang.String
617.74KB org.apache.tomcat.util.net 1.50MB java.util.LinkedHashMap
528.21KB org.apache.catalina.core 1.06MB java.lang.reflect.Method
481.90KB org.apache.coyote.http2 861.31KB s.r.a.AnnotatedTypeFactory$AnnotatedTypeBaseImpl
478.57KB sun.security.x509 596.39KB java.util.HashMap$Node
444.52KB com.oracle.svm.jni 560.39KB java.lang.String[]
442.50KB java.util.concurrent 524.34KB com.oracle.svm.core.util.LazyFinalReference
... 561 additional packages ... 2905 additional object types
(use GraalVM Dashboard to see all)
------------------------------------------------------------------------------------------------------------------------
42.5s (21.5% of total time) in 42 GCs | Peak RSS: 6.90GB | CPU load: 4.65
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
C:\Users\zhangb76\practice\gs-rest-service\complete\target\rest-service-complete.exe (executable)
C:\Users\zhangb76\practice\gs-rest-service\complete\target\rest-service-complete.build_artifacts.txt
========================================================================================================================
Finished generating 'rest-service-complete' in 3m 16s.
[INFO]
[INFO] --- spring-boot-maven-plugin:2.7.0:repackage (repackage) @ rest-service-complete ---
[INFO] Attaching repackaged archive C:\Users\zhangb76\practice\gs-rest-service\complete\target\rest-service-complete-0.0.1-SNAPSHOT-exec.jar with classifier exec
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:35 min
[INFO] Finished at: 2022-07-08T12:28:32+08:00
[INFO] ------------------------------------------------------------------------
相关 issue
Views: 2,549 · Posted: 2022-10-08
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...