#java #javafx #shader #recompile #javafx-11
#java #javafx #шейдер #перекомпилировать #javafx-11
Вопрос:
Я пытаюсь перекомпилировать JavaFX 11 (или 12) из исходного кода в проекте eclipse, но я сталкиваюсь с некоторыми проблемами.
Вот как я продолжаю:
1. Я загружаю JavaFX SDK для Windows здесь
2. Я создаю проект eclipse для каждого модуля JavaFX (javafx.base, javafx.controls, javafx.fxml, javafx.graphics, javafx.media, javafx.swing и javafx.web).
3. Я исправляю различные незначительные ошибки компиляции
4. Наконец, я создаю простое приложение JavaFX в новом проекте
Но когда я запускаю приложение, я получаю эту ошибку:
java.lang.Исключение ClassNotFoundException: com.sun.prism.shader.Texture_Color_Loader в java.base/jdk.internal.loader.Встроенный загрузчик классов.loadClass(встроенный загрузчик классов.java: 583) в java.base/jdk.internal.loader.Загрузчики классов $AppClassLoader.loadClass(ClassLoaders.java:178) в java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) в java.base/java.lang.Class.forName0(собственный метод) в java.base/java.lang.Class.forName(Class.java:315) в javafx.graphics/com.sun.prism.d3d.D3DResourceFactory.createStockShader(D3DResourceFactory.java:405) в javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.getPaintShader(BaseShaderContext.java:263) в javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.validatePaintOp(BaseShaderContext.java:484) в javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.validatePaintOp(BaseShaderContext.java:414) в javafx.graphics/com.sun.prism..impl.ps.BaseShaderGraphics.drawString(BaseShaderGraphics.java:2089) в javafx.graphics/com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312) в javafx.graphics/com.sun.javafx.sg.prism.NGText.renderContent2D(NGText.java:270) в javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:261) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java: 1964) в javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) в javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java: 1964) в javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) в javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java: 1964) в javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479) в javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328) в javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91) в java.base/java.util.concurrent.Исполнители $RunnableAdapter.call(Executors.java:515) в java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) в javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58) в java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) в java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) в javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125) в java.base/java.lang.Thread.run(Thread.java:834) java.lang.Внутренняя ошибка: ошибка загрузки исходного шейдера Texture_Color в javafx.graphics/com.sun.prism.d3d.D3DResourceFactory.createStockShader(D3DResourceFactory.java:411) в javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.getPaintShader(BaseShaderContext.java:263) в javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.validatePaintOp(BaseShaderContext.java:484) в javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext. validatePaintOp(BaseShaderContext.java: 414) в javafx.graphics/com.sun.prism.impl.ps.BaseShaderGraphics.drawString(BaseShaderGraphics.java:2089) в javafx.graphics/com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312) в javafx.graphics/com.sun.javafx.sg.prism.NGText.renderContent2D(NGText.java:270) в javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:261) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java: 1964) в javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) в javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java: 1964) в javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) в javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) в javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java: 1964) в javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479) в javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328) в javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91) в java.base/java.util.concurrent.Исполнители $RunnableAdapter.call(Executors.java:515) в java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) в javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58) в java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) в java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) в javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125) в java.base/java.lang.Thread.run(Thread.java:834)
Когда я смотрю в класс, в котором генерируется исключение, там есть этот фрагмент кода:
общедоступный шейдер createStockShader(конечное строковое имя) { если (имя == null) { создать новое исключение IllegalArgumentException ("Имя шейдера должно быть ненулевым"); } попробуйте { Поток входного потока = AccessController.doPrivileged( (Привилегированное действие) () -> D3DResourceFactory.class . getResourceAsStream("hlsl/" name ".obj") ); Класс klass = Class.forName("com.sun.prism.shader." name "_Loader"); Метод m = klass.GetMethod("loadShader", новый класс[] { ShaderFactory.class , InputStream.class }); возврат (шейдер)m.invoke(null, новый объект[] { это, поток }); } catch (Throwable e) { e.printStackTrace(); выбросить новую внутреннюю ошибку ("Ошибка загрузки стандартного шейдера" имя); } }
Он пытается загрузить классы из пакета com.sun.prism.shader и ресурсы из пакета com.sun.prism.d3d.hlsl, но эти пакеты не существуют в папках sources . Я заглянул в предварительно скомпилированный jar javafx.graphics.jar если эти файлы существуют, и они есть здесь.
Итак, что я должен сделать, чтобы это заработало? Я попытался создать отсутствующий пакет и извлечь в него файлы .class, но eclipse автоматически удаляет их, потому что их нет .я думаю, связанные файлы java.
И я не понимаю, почему в исходном файле архива отсутствуют файлы ресурсов? Цель предоставления доступа к исходным кодам не в том, чтобы легко перекомпилировать и работать / изменять их?
На github, где я получаю исходные тексты, они дают ссылку со всеми инструкциями по созданию OpenJFX, но сайт, похоже, находится на обслуживании уже целую вечность…
Комментарии:
1. убедитесь, что у вас есть все необходимые зависимости
2. Вы не можете просто взять код и выполнить сборку… Вам действительно нужны инструкции wiki. Пока он не работает, попробуйте использовать кэшированную версию
3. Что такое «перекомпилировать»? Если вы загружаете SDK, он уже скомпилирован, поэтому я не знаю, о каких ошибках компиляции вы говорите. Если вы хотите создать OpenJFX, дождитесь завершения обслуживания и следуйте инструкциям. Если вы хотите скомпилировать свой проект с SDK в качестве зависимости, следуйте инструкциям на openjfx.io/openjfx-docs .