-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
Hi. I am have such JAVA code in my pet project that I am running in GraalVM Native Image:
`import ij.ImagePlus;
import ij.process.ColorProcessor;
import ij.process.ImageProcessor;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.meta.api.objects.InputFile;
import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@component
public class ImageFactory {
public InputFile createImageWithText(String text, int fontSize, int backgroundNumber) throws IOException {
String backgroundResource = String.format("/Images/background%d.jpg", backgroundNumber + 1);
try (InputStream resourceStream = getClass().getResourceAsStream(backgroundResource);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
BufferedImage bufferedImage = ImageIO.read(resourceStream);
ImagePlus image = new ImagePlus("Background", new ColorProcessor(bufferedImage));
ImageProcessor ip = image.getProcessor();
Font font = new Font(Font.MONOSPACED, Font.BOLD, fontSize);
ip.setFont(font);
ip.setColor(Color.WHITE);
FontMetrics fontMetrics = ip.getFontMetrics();
int charWidth = fontMetrics.charWidth('A');
String[] lines = text.split("\n");
int x = 20;
int y = ip.getFontMetrics().getHeight();
for (String line : lines) {
if (line.contains("(")) {
String[] subLines = line.split("\\(");
ip.drawString(subLines[0], x, y += ip.getFontMetrics().getHeight());
if (subLines[1].contains("-")) ip.setColor(Color.RED);
else {
ip.setColor(Color.GREEN);
}
ip.drawString("(" + subLines[1], x + charWidth * subLines[0].length(), y);
ip.setColor(Color.WHITE);
} else ip.drawString(line, 30, y += ip.getFontMetrics().getHeight() + 20);
}
ImageIO.write(ip.getBufferedImage(), "jpg", outputStream);
return new InputFile(new ByteArrayInputStream(outputStream.toByteArray()), "prices.jpg");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}`
and it produces the error:
Exception in thread "crypto_currencies_pet_bot Telegram Executor" java.lang.UnsatisfiedLinkError: No awt in java.library.path
2023-11-18 21:51:59 at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.NativeLibrarySupport.loadLibraryRelative(NativeLibrarySupport.java:136)
2023-11-18 21:51:59 at java.base@21.0.1/java.lang.ClassLoader.loadLibrary(ClassLoader.java:106)
2023-11-18 21:51:59 at java.base@21.0.1/java.lang.Runtime.loadLibrary0(Runtime.java:916)
2023-11-18 21:51:59 at java.base@21.0.1/java.lang.System.loadLibrary(System.java:2059)
2023-11-18 21:51:59 at java.desktop@21.0.1/java.awt.Toolkit$2.run(Toolkit.java:1384)
2023-11-18 21:51:59 at java.desktop@21.0.1/java.awt.Toolkit$2.run(Toolkit.java:1382)
2023-11-18 21:51:59 at java.base@21.0.1/java.security.AccessController.executePrivileged(AccessController.java:129)
2023-11-18 21:51:59 at java.base@21.0.1/java.security.AccessController.doPrivileged(AccessController.java:319)
2023-11-18 21:51:59 at java.desktop@21.0.1/java.awt.Toolkit.loadLibraries(Toolkit.java:1381)
2023-11-18 21:51:59 at java.desktop@21.0.1/java.awt.Toolkit.initStatic(Toolkit.java:1419)
2023-11-18 21:51:59 at java.desktop@21.0.1/java.awt.Toolkit.(Toolkit.java:1393)
2023-11-18 21:51:59 at java.base@21.0.1/java.lang.Class.ensureInitialized(DynamicHub.java:595)
2023-11-18 21:51:59 at java.desktop@21.0.1/sun.awt.AppContext$2.run(AppContext.java:273)
2023-11-18 21:51:59 at java.desktop@21.0.1/sun.awt.AppContext$2.run(AppContext.java:262)
2023-11-18 21:51:59 at java.base@21.0.1/java.security.AccessController.executePrivileged(AccessController.java:129)
2023-11-18 21:51:59 at java.base@21.0.1/java.security.AccessController.doPrivileged(AccessController.java:319)
2023-11-18 21:51:59 at java.desktop@21.0.1/sun.awt.AppContext.initMainAppContext(AppContext.java:262)
2023-11-18 21:51:59 at java.desktop@21.0.1/sun.awt.AppContext$3.run(AppContext.java:315)
2023-11-18 21:51:59 at java.desktop@21.0.1/sun.awt.AppContext$3.run(AppContext.java:298)
2023-11-18 21:51:59 at java.base@21.0.1/java.security.AccessController.executePrivileged(AccessController.java:129)
2023-11-18 21:51:59 at java.base@21.0.1/java.security.AccessController.doPrivileged(AccessController.java:319)
2023-11-18 21:51:59 at java.desktop@21.0.1/sun.awt.AppContext.getAppContext(AppContext.java:297)
2023-11-18 21:51:59 at java.desktop@21.0.1/javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:123)
2023-11-18 21:51:59 at java.desktop@21.0.1/javax.imageio.ImageIO.(ImageIO.java:64)
2023-11-18 21:51:59 at com.neo.crypto_bot.service.ImageFactory.createImageWithText(ImageFactory.java:29)
2023-11-18 21:51:59 at com.neo.crypto_bot.command.FavoriteCommandHandler.execute(FavoriteCommandHandler.java:72)
2023-11-18 21:51:59 at org.telegram.telegrambots.extensions.bots.commandbot.commands.BotCommand.processMessage(BotCommand.java:78)
2023-11-18 21:51:59 at org.telegram.telegrambots.extensions.bots.commandbot.commands.CommandRegistry.executeCommand(CommandRegistry.java:109)
2023-11-18 21:51:59 at org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot.onUpdateReceived(TelegramLongPollingCommandBot.java:104)
2023-11-18 21:51:59 at java.base@21.0.1/java.util.ArrayList.forEach(ArrayList.java:1596)
2023-11-18 21:51:59 at org.telegram.telegrambots.meta.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27)
2023-11-18 21:51:59 at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:312)
2023-11-18 21:51:59 at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:832)
2023-11-18 21:51:59 at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211)
I am using container-registry.oracle.com/graalvm/native-image:21.0.1-ol8, but tried lot of options with same result
Can be reproduced in this way:
- docker pull pavelbortnovskyi/crypto-bot-awt-error:latest
- run /get_all_favorite_pairs in https://t.me/crypto_currencies_pet_bot