为另一个 OS 创建一个 Spring 本机应用程序
Create a Spring Native application for another OS
我正在 Linux 机器上构建 Spring Native 应用程序。在 Linux 上构建 运行s 的可执行文件。
如何在 运行 原生于 Windows 的同一台机器上构建可执行文件?一种选择是创建一个 Docker image,但是否还有一种方法可以构建一个 Windows 可执行文件,在使用 Linux 机器时 运行 没有 Docker作为构建环境?
我的设置:
GraalVM CE 21.1.0 (Java 11) 已安装,PATH
和 JAVA_HOME
已相应设置
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.5.1</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Native</description>
<properties>
<java.version>11</java.version>
<repackage.classifier>exec</repackage.classifier>
<native-buildtools.version>0.9.0</native-buildtools.version>
<spring-native.version>0.10.0</spring-native.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>${spring-native.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>junit-platform-native</artifactId>
<version>${native-buildtools.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>${repackage.classifier}</classifier>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>${spring-native.version}</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${native-buildtools.version}</version>
<executions>
<execution>
<id>build-native</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
- 单个应用程序 class 位于子文件夹
src/main/java/demo
:
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
GraalVM 目前没有为不同 OSes 交叉编译应用程序的选项。
技术原因是,在构建过程中,来自 JDK 的本机代码被链接到可执行文件中,这显然是特定于平台的,并且特定于 OS 的代码路径也记录在输出二进制文件中,并且其他 OSes 的代码可能不会,因为在分析期间未执行或查看它。
因此目前无法在 Linux 上生成 Windows 可执行文件。您可以探索的选项是:
- 使用 Linux 可执行文件构建 docker 映像
- 构建 linux 可执行文件并 运行 使用 Windows Linux 子系统 (WLS)
- 在 Windows 台机器上构建本机映像,例如使用提供 Windows 台机器的 CI 服务。以下是如何使用 GitHub 操作执行此操作的示例:https://blogs.oracle.com/developers/building-cross-platform-native-images-with-graalvm(请参阅 Windows 的“创建 Windows 图像”一章)
我认为在云机器上构建的最后一个选项是对最终用户最友好的。
我正在 Linux 机器上构建 Spring Native 应用程序。在 Linux 上构建 运行s 的可执行文件。
如何在 运行 原生于 Windows 的同一台机器上构建可执行文件?一种选择是创建一个 Docker image,但是否还有一种方法可以构建一个 Windows 可执行文件,在使用 Linux 机器时 运行 没有 Docker作为构建环境?
我的设置:
GraalVM CE 21.1.0 (Java 11) 已安装,
PATH
和JAVA_HOME
已相应设置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.5.1</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Native</description>
<properties>
<java.version>11</java.version>
<repackage.classifier>exec</repackage.classifier>
<native-buildtools.version>0.9.0</native-buildtools.version>
<spring-native.version>0.10.0</spring-native.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>${spring-native.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>junit-platform-native</artifactId>
<version>${native-buildtools.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>${repackage.classifier}</classifier>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>${spring-native.version}</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${native-buildtools.version}</version>
<executions>
<execution>
<id>build-native</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
- 单个应用程序 class 位于子文件夹
src/main/java/demo
:
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
GraalVM 目前没有为不同 OSes 交叉编译应用程序的选项。 技术原因是,在构建过程中,来自 JDK 的本机代码被链接到可执行文件中,这显然是特定于平台的,并且特定于 OS 的代码路径也记录在输出二进制文件中,并且其他 OSes 的代码可能不会,因为在分析期间未执行或查看它。
因此目前无法在 Linux 上生成 Windows 可执行文件。您可以探索的选项是:
- 使用 Linux 可执行文件构建 docker 映像
- 构建 linux 可执行文件并 运行 使用 Windows Linux 子系统 (WLS)
- 在 Windows 台机器上构建本机映像,例如使用提供 Windows 台机器的 CI 服务。以下是如何使用 GitHub 操作执行此操作的示例:https://blogs.oracle.com/developers/building-cross-platform-native-images-with-graalvm(请参阅 Windows 的“创建 Windows 图像”一章)
我认为在云机器上构建的最后一个选项是对最终用户最友好的。