问题
I'm trying to recompile JavaFX 11 (or 12) from source in an eclipse project, but I encounter some problems.
Here is how I proceed:
1. I download the JavaFX SDK for Windows here
2. I create an eclipse project for each JavaFX module (javafx.base, javafx.controls, javafx.fxml, javafx.graphics, javafx.media, javafx.swing and javafx.web)
3. I correct various minor compilation errors
4. Finally I create a simple JavaFX application in a new project
But when I execute the application, I get this error:
java.lang.ClassNotFoundException: com.sun.prism.shader.Texture_Color_Loader at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:315) at javafx.graphics/com.sun.prism.d3d.D3DResourceFactory.createStockShader(D3DResourceFactory.java:405) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.getPaintShader(BaseShaderContext.java:263) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.validatePaintOp(BaseShaderContext.java:484) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.validatePaintOp(BaseShaderContext.java:414) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderGraphics.drawString(BaseShaderGraphics.java:2089) at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312) at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderContent2D(NGText.java:270) at javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:261) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964) at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964) at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964) at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479) at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328) at javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125) at java.base/java.lang.Thread.run(Thread.java:834) java.lang.InternalError: Error loading stock shader Texture_Color at javafx.graphics/com.sun.prism.d3d.D3DResourceFactory.createStockShader(D3DResourceFactory.java:411) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.getPaintShader(BaseShaderContext.java:263) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.validatePaintOp(BaseShaderContext.java:484) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderContext.validatePaintOp(BaseShaderContext.java:414) at javafx.graphics/com.sun.prism.impl.ps.BaseShaderGraphics.drawString(BaseShaderGraphics.java:2089) at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312) at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderContent2D(NGText.java:270) at javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:261) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964) at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964) at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270) at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072) at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964) at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479) at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328) at javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125) at java.base/java.lang.Thread.run(Thread.java:834)
When I look in the class where the exception is thrown, there is this chunk of code:
public Shader createStockShader(final String name) { if (name == null) { throw new IllegalArgumentException("Shader name must be non-null"); } try { InputStream stream = AccessController.doPrivileged( (PrivilegedAction) () -> D3DResourceFactory.class. getResourceAsStream("hlsl/" + name + ".obj") ); Class klass = Class.forName("com.sun.prism.shader." + name + "_Loader"); Method m = klass.getMethod("loadShader", new Class[] { ShaderFactory.class, InputStream.class }); return (Shader)m.invoke(null, new Object[] { this, stream }); } catch (Throwable e) { e.printStackTrace(); throw new InternalError("Error loading stock shader " + name); } }
It is trying to load classes from the package com.sun.prism.shader and ressources from the package com.sun.prism.d3d.hlsl, but these packages do not exist in the sources folders. I looked in the pre-compiled jar javafx.graphics.jar if these files exists, and there are here.
So, what should I do to make it works? I tried to create the missing package and extract .class files into it, but eclipse automatically delete them because there is no .java files associated i guess.
And, I don't understand why is it missing ressources files in sources archive file? The goal of giving access to sources is not to recompile and work/modify them easily?
On the github where I get the sources, they give a link with all instructions for building OpenJFX, but the site seems to be under maintenance for ages now...
来源:https://stackoverflow.com/questions/55704337/how-to-recompile-javafx-11-12