Как перекомпилировать JavaFX 11/12

#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 .