java.awt.HeadlessException - УЖЕ ГУГЛИЛ!"!"!12! (это связано с майнкрафтом)

Версия Minecraft
1.16.5
API
Forge
Пишу мод, который позволит отправлять картинки в чат майнкрафта (с головой у меня проблем нет). Работает так: копируешь картинку в буфер (ctrl c) вставляешь в чат (ctrl v), жмешь enter. Поначалу получал хеадлес ехептион, потом вписал System.setProperty("java.awt.headless", "false"); в конструктор главного класса мода, все заработало. Скинул другу, чтобы тот протестил, у него хеадлес ехептион даже с System.setProperty("java.awt.headless", "false");. Пробовали -Djava.awt.headless=false в аргументы VM в лаунчере. Пробовали JAVA_OPTS в системных переменных. Пробовал пихать System.setProperty("java.awt.headless", "false") в FMLInitEvent, в начало метода copyTo
copyTo method (паста с инета):
    public static String copyTo(String filename) {
        try {
            Transferable content = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
            if (content == null) {
                System.err.println("error: nothing found in clipboard");
                return "";
            }
            if (!content.isDataFlavorSupported(DataFlavor.imageFlavor)) {
                System.err.println("error: no image found in clipbaord");
                return "";
            }
            BufferedImage img = (BufferedImage) content.getTransferData(DataFlavor.imageFlavor);
            String ext = ext(filename);
            if (ext == null) {
                ext = "png";
                filename += "." + ext;
            }
            File outfile = new File(ChatPhoto.pathToDir + filename);
            ImageIO.write(img, ext, outfile);
            //System.err.println("image copied to: " + outfile.getAbsolutePath());
            mc.player.sendMessage(new StringTextComponent("§aФотография создана: " + outfile.getPath()), mc.player.getUniqueID());
          //  System.out.println(outfile.getAbsolutePath());
            return outfile.getAbsolutePath();
        } catch (Exception ex) {
            ex.printStackTrace();
            mc.player.sendMessage(new StringTextComponent("§cОшибка чтения фотографии из буфера"), mc.player.getUniqueID());
            return "";

        }
    }
Ему не помогло, мне помогло. Я еще думаю над тем, достойно ли общество таких продвинутых технологий (стоит ли выкладывать мод в открытый доступ), но если эти технологии будут выдавать headlessException у каждого второго юзера, то стоит ли их вообще выкладывать? В общем, заранее спасибо за ответы, если таковые будут
 
Краш-лог
java.awt.HeadlessException
at java.desktop/sun.awt.HeadlessToolkit.getSystemClipboard(HeadlessToolkit.java:216)
Краш-лог:
java.awt.HeadlessException
at java.desktop/sun.awt.HeadlessToolkit.getSystemClipboard(HeadlessToolkit.java:216)
Решение
Короче, спустя 2 месяца решил довести дело до конца. Так как поганая жава не позволяет мне скопировать картинку, я додумался скопировать фотографию из буфера другим способом - повершелл скриптом
скрипт:
Add-Type -AssemblyName System.Windows.Forms
$userDir = $env:USERPROFILE
$photoDir = -join($userDir, "\photos")



if ([System.Windows.Forms.Clipboard]::ContainsImage()) {
    if($args.Count -eq 1){
        ([System.Windows.Forms.Clipboard]::GetImage()).Save((Join-Path -Path ($photoDir) -ChildPath "$args"), [System.Drawing.Imaging.ImageFormat]::Png)
    }else{

    Write-Host "Error on args"
    }

} else {
    Write-Host "Clipboard not contains an image"
    
}
При запуске игры мод загружает этот код с pastebin И сохраняет в .ps1 файл, а...
1,038
57
229
И код
Теоретически такой мод не сложный, надо лишь передать пакет в котором и передать данные картинки. А затем получить его и отрисовать картинку. Вся проблема в том что это забъёт канал для остальных пакетов и Вас может даже выкинуть с сервера по таймауту.
 
Не, у меня мод к серверу никак не относится и с пакетами там ничего не связано. Работает мод на любом сервере с любым ядром. Мод сохраняет фотку из буфера обмена на комп (тут и проблема. Смысл кидать весь код мода я не вижу) потом заливает на дедик и отправляет в чат <photo name="имя" nick="ник">. У другого юзера мод считывает тег <photo>, запрашивает фотографию с дедика в формате name-nick.png, скачивает и рендерит в чате. Работает все, кроме сохранения фотки из буфера (Похоже, что у всех, кроме меня почему-то). Те, у кого мода нет, соответственно видят непонятную надпись в чате
 
1,038
57
229
Мало информации. Нужен полный лог краша.
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: java.awt.HeadlessException
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at java.desktop/sun.awt.HeadlessToolkit.getSystemClipboard(HeadlessToolkit.java:216)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.chatphoto.util.PhotoUtil.copyTo(PhotoUtil.java:189)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.chatphoto.event.Handler.onPress(Handler.java:69)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraftforge.eventbus.ASMEventHandler_16_Handler_onPress_KeyInputEvent.invoke(.dynamic)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraftforge.client.ForgeHooksClient.fireKeyInput(ForgeHooksClient.java:802)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at jdk.internal.reflect.GeneratedMethodAccessor66.invoke(Unknown Source)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at java.base/java.lang.reflect.Method.invoke(Method.java:567)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.optifine.reflect.Reflector.call(Reflector.java:953)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.optifine.reflect.ReflectorMethod.call(ReflectorMethod.java:133)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.client.KeyboardListener.func_197961_a(KeyboardListener.java:548)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.client.KeyboardListener.lambda[imath]null[/imath]7(KeyboardListener.java:622)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.util.concurrent.ThreadTaskExecutor.execute(ThreadTaskExecutor.java:111)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.client.KeyboardListener.lambda[imath]setupCallbacks[/imath]8(KeyboardListener.java:621)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at org.lwjgl.glfw.GLFWKeyCallbackI.callback(GLFWKeyCallbackI.java:37)
[15июн.2023 00:58:18.857] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at org.lwjgl.system.JNI.invokeV(Native Method)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at org.lwjgl.glfw.GLFW.glfwPollEvents(GLFW.java:3101)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at com.mojang.blaze3d.systems.RenderSystem.flipFrame(SourceFile:102)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.client.MainWindow.func_227802_e_(MainWindow.java:398)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.client.Minecraft.func_195542_b(Minecraft.java:997)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:607)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraft.client.main.Main.main(Main.java:184)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at java.base/java.lang.reflect.Method.invoke(Method.java:567)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at net.minecraftforge.fml.loading.FMLClientLaunchProvider.lambda[imath]launchService[/imath]0(FMLClientLaunchProvider.java:37)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at cpw.mods.modlauncher.Launcher.run(Launcher.java:82)
[15июн.2023 00:58:18.858] [Render thread/INFO] [STDERR/]: [net.chatphoto.util.PhotoUtil:copyTo:211]: at cpw.mods.modlauncher.Launcher.main(Launcher.java:66)
[15июн.2023 00:58:18.858] [Render thread/INFO] [net.minecraft.client.gui.NewChatGui/]: [CHAT] Ошибка чтения фотографии из буфера
Краша игры, как такового, не было. Просто исключение. Если нужен прям полный лог, могу скинуть, однако там только ошибка авторизации и еще несколько исключений, не связанных с моим модом и вообще с буфером обмена
 
1,038
57
229

jopi

Попрошайка
1,421
30
260
такое чувство будто PhotoUtil это какой-то супер-тайный-ультра-секрет, хотя по факту там скорее всего буфер обмена и выгрузка в lwjgl как это делает RenderEngine

По поводу-же вопроса - возможной причиной такого поведения может быть использование Линукса/OpenJDK или т.п. что использует awt гуи для буфера обмена
В такой ситуации может не помочь даже jvm аргумент или параметр в переменных. Если проблема в JDK - Используй от Sun (Oracle), либо попробуй найти способ использовать буффер обмена сторонними методами (например нативно, через JNI)


1686999590556.png
 
В PhotoUtil нет никаких секретов. Но там есть куча ненужных методов (старых, вместо своего дедика теперь имгур, и тег фото содержит раздробленную ссылку на имгур), никак не связанных с проблемой, а также чуток кода, за который мне может быть стыдно безо всякой причины. 211 строка класса PhotoUtil - это объявление переменной content. Метод copyTo я уже кидал. По факту класс содержит только утильные методы, которые строят и разбирают тег <photo> и его элементы, ну и сохранение самой фотки из буфера
 
Последнее редактирование:
Короче, спустя 2 месяца решил довести дело до конца. Так как поганая жава не позволяет мне скопировать картинку, я додумался скопировать фотографию из буфера другим способом - повершелл скриптом
скрипт:
Add-Type -AssemblyName System.Windows.Forms
$userDir = $env:USERPROFILE
$photoDir = -join($userDir, "\photos")



if ([System.Windows.Forms.Clipboard]::ContainsImage()) {
    if($args.Count -eq 1){
        ([System.Windows.Forms.Clipboard]::GetImage()).Save((Join-Path -Path ($photoDir) -ChildPath "$args"), [System.Drawing.Imaging.ImageFormat]::Png)
    }else{

    Write-Host "Error on args"
    }

} else {
    Write-Host "Clipboard not contains an image"
    
}
При запуске игры мод загружает этот код с pastebin И сохраняет в .ps1 файл, а при нажатии Ctrl + V в чате запускает скрипт через Runtime.getRuntime().exec()
хз зачем я держу об этом в курсе форум, мб полезно кому-нибудь будет
Короче, если не можешь сделать мод на java, сделай его на повершелл скрипте
 
1,074
72
372
При запуске игры мод загружает этот код с pastebin
Супер решение! Мало того что оно Windows-only, так ещё открывает невиданные просторы для remote code execution. Браво!
Можно просто в jar всё хранить, а не качать с левых сервисов.
 
Сверху