当前位置: 首页 > 知识库问答 >
问题:

Spring Boot和GraalVM本地映像

容修贤
2023-03-14

随着最新版本的Spring Boot2.3.0,spall-graalvm-本机0.7.0。BUILD-SNAPSHOT,GraalVM20.1.0. r11和相应的博客文章

  • https://spring.io/blog/2020/04/16/spring-tips-the-graalvm-native-image-builder-feature
  • https://blog.codecentric.de/en/2020/05/spring-boot-graalvm

我还开始玩我的一个应用程序。

幸运的是,我能够在没有任何大障碍的情况下编译我的应用程序。我的compile.sh脚本如下所示

#!/usr/bin/env bash

echo "[-->] Detect artifactId from pom.xml"
ARTIFACT=$(mvn -q \
-Dexec.executable=echo \
-Dexec.args='${project.artifactId}' \
--non-recursive \
exec:exec);
echo "artifactId is '$ARTIFACT'"

echo "[-->] Detect artifact version from pom.xml"
VERSION=$(mvn -q \
  -Dexec.executable=echo \
  -Dexec.args='${project.version}' \
  --non-recursive \
  exec:exec);
echo "artifact version is '$VERSION'"

echo "[-->] Detect Spring Boot Main class ('start-class') from pom.xml"
MAINCLASS=$(mvn -q \
-Dexec.executable=echo \
-Dexec.args='${start-class}' \
--non-recursive \
exec:exec);
echo "Spring Boot Main class ('start-class') is '$MAINCLASS'"

GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

echo "[-->] Cleaning target directory & creating new one"
rm -rf target
mkdir -p target/native-image

echo "Packaging $ARTIFACT with Maven"
mvn -ntp package > target/native-image/output.txt

echo "[-->] Expanding the Spring Boot fat jar"
JAR="$ARTIFACT-$VERSION.jar"
rm -f $ARTIFACT
echo "Unpacking $JAR"
cd target/native-image
jar -xvf ../$JAR >/dev/null 2>&1
cp -R META-INF BOOT-INF/classes

LIBPATH=`find BOOT-INF/lib | tr '\n' ':'`
CP=BOOT-INF/classes:$LIBPATH

GRAALVM_VERSION=`native-image --version`
echo "Compiling $ARTIFACT with $GRAALVM_VERSION"
{ time native-image \
  --verbose \
  --no-server \
  --no-fallback \
  --enable-all-security-services \
  -H:Name=$ARTIFACT \
  -Dspring.native.remove-unused-autoconfig=true \
  -Dspring.native.remove-yaml-support=true \
  -Dspring.native.remove-xml-support=true \
  -Dspring.native.remove-spel-support=true \
  -Dspring.native.remove-jmx-support=true \
  -cp $CP $MAINCLASS >> output.txt ; } 2>> output.txt

if [[ -f $ARTIFACT ]]
then
  printf "${GREEN}SUCCESS${NC}\n"
  mv ./$ARTIFACT ..
  exit 0
else
  cat output.txt
  printf "${RED}FAILURE${NC}: an error occurred when compiling the native-image.\n"
  exit 1
fi

但现在我的麻烦开始了:我的应用程序在启动时依赖一些CSV来加载数据。数据是这样加载的

InputStream is = CSVUtil.class.getResourceAsStream("/myData.csv");

该文件位于/src/main/resources/myData。csv

如前所述,编译工作没有问题,但一旦我启动应用程序,它找不到CSV。

Caused by: java.lang.NullPointerException: null
    at java.io.Reader.<init>(Reader.java:167) ~[na:na]
    at java.io.InputStreamReader.<init>(InputStreamReader.java:113) ~[na:na]
    at ch.aaap.raw.CSVUtil.getData(CSVUtil.java:33) ~[na:na]
...

这似乎不是汇编的一部分。有什么提示可以让原生映像命令知道我需要这些CSV吗?

共有1个答案

郑茂材
2023-03-14

看起来添加以下参数有助于-H:IncludeResources='.*/*。csv$'

 类似资料:
  • 我在使用micronaut和aws SDK-v2构建GraalVM本机映像时遇到了一个问题。在详细说明错误之前,我想要注意的是,在使用sdk-v2之前,本机映像是正确构建的。 一旦我更新到aws sdk-v2(通过micronaut依赖项as): 我在试图构建图像时出错了 我的假设是micronaut一定在内部做了一些反思,这使得构建过程失败。我添加了以下json文件来设置反射配置

  • 我设法为springboot fat jar构建了本机映像,但当我运行它时,它抛出了异常:“”。我尝试添加一个默认构造和一个空的init()方法,但都失败了。如何克服此异常并使本机映像运行? 以下是完整日志:

  • 我正在尝试用GraalVM创建一个本地映像,我的代码是: 然后我把代码本身称为: 当我运行IDE或java-jar时,它可以正常工作,但当我尝试编译为本机映像时,会抛出一个错误。下面是用于编译本机映像的命令行。 错误: TypeError:invokeMember(打印)在JavaObject[com.compiler.commons.log]上。Console@113a2d320(com.com

  • 亲爱的,我下面的原生图像构建教程由Quarkus创建原生graalvm,但我得到了下面的错误: 我的环境:OS:CentOS 7 Quarkus:0.11.0 Java:Open JDK 1.8.0_181 GraalVM:1.0.0-rc13 使用quarkus在你的应用程序中没有主要方法,但如何使用graal原生图像使其工作?

  • 我正在尝试用Dockers创建一个GraalVM本地映像。我已经创建了一个Micronaut项目,并成功创建了jar应用程序,并在docker中运行;此外,我已经用这个jar文件创建了一个GraalVM本机映像,现在可以运行这个应用程序,但我需要在docker中运行一个GraalVM本机映像,在论坛中寻找答案。我发现有必要在docker中构建本机映像。因此我尝试了这个docker文件: 它不会抛出

  • 我在这里将Micronaut应用程序作为Graalvm本地映像进行试用。