当前位置: 首页 > 知识库问答 >
问题:

JDK9 问题:运行简单的 Java 代码失败

尉迟景福
2023-03-14

我正在运行DMelt(http://jwork.org/dmelt),我注意到简单的Java代码在使用JDK9时会失败。下面是一个 Jython 示例,下面发布了该错误。我使用 Ubuntu 来运行 DMelt。

from jhplot  import *
c1 = HPlot("Canvas")
c1.visible(1)
f1=F1D("x^2")
c1.draw(f1)
c1.export("image.pdf")

或者,用Java重写:

import jhplot.*;

class MyFunction  
{
public static void main(String[] args) { 
HPlot c1 = new HPlot("Canvas");
c1.visible(true);
F1D f1 = new F1D("x^2");
c1.draw(f1);
c1.export("image.pdf");
 }    
} 

这是错误:

Traceback (most recent call last):
  File "a.py", line 7, in <module>
    c1.export("image.pdf")
    at java.desktop/javax.imageio.spi.ServiceRegistry.checkClassAllowed(ServiceRegistry.java:745)
    at java.desktop/javax.imageio.spi.ServiceRegistry.<init>(ServiceRegistry.java:140)
    at org.freehep.graphicsbase.util.export.ExportFileTypeRegistry.<init>(ExportFileTypeRegistry.java:33)
    at org.freehep.graphicsbase.util.export.ExportFileTypeRegistry.getDefaultInstance(ExportFileTypeRegistry.java:44)
    at org.freehep.graphicsbase.util.export.ExportFileType.getExportFileTypes(ExportFileType.java:180)
    at org.freehep.graphicsbase.util.export.ExportFileType.getExportFileTypes(ExportFileType.java:172)
    at jhplot.io.images.ExportVGraphics.export(ExportVGraphics.java:101)
    at jhplot.gui.GHPanel.export(GHPanel.java:501)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: org.freehep.graphicsbase.util.export.ExportFileType is not an ImageIO SPI class

相同的代码在所有Java版本1.5-1.8上都能正常工作。请注意,此错误与Jython无关。这是一个新的JDK9问题,与JDK9无关:发生了非法的反射访问操作。org.python.core.PySystemState

共有2个答案

裴哲
2023-03-14

事实上,Oracle引入了这个突然的特性,将javax . imageio . SPI . service registry限制到某些图像类。您可以在DMelt框架和其他使用矢量图形的开源代码中轻松解决这个问题:

1)从没有限制的JDK 8 http://Hg . open JDK . Java . net/JDK 8u/JDK 8u/JDK/file/9d 617 CFD 6717/src/share/classes/javax/imageio/SPI/获取该包的源代码

2)重命名包并将其添加到您的项目中,在这个阶段,您可以完全删除javax.imagehtml" target="_blank">io.spi.ServiceRegistry。

这个简单的解决方案效果很好。但是要确保你的项目是基于GNU的。

柳涵意
2023-03-14

在JDK 9中,这方面有一个不相容的变化。来自JDK 9版本说明:

自JavaSE1.4以来,javax.imageio.spi。ServiceRegistry提供了一个与JavaSE1.6java.util.ServiceLoader大致相当的工具。该图像i/o功能现在仅限于支持定义为javax.imageio一部分的SPI。将其用于其他目的的应用程序需要重新编码以使用ServiceLoader。

org.freehep。graphicsbase似乎是FreeHEP项目。有人需要检查他们的问题跟踪器,看看他们是否已经解决了这个问题。可能他们可以简单地更改代码以使用<code>java.util。ServiceLoader而不是有点晦涩的<code>javax.imageio.spi.ServiceRegistry。

 类似资料:
  • 最好的方法是什么?JCUDA是一个完美的映射到C CUDA还是完全不同?或者从Java调用C代码并共享结果是否有意义(链接列表是否可以访问)?

  • 我正在尝试构建一个示例java项目,并尝试构建一个docker映像并将该映像推送到AWS ECR,但在登录AWS ECR时遇到了一个问题。 错误:命令执行错误:执行命令时出错:aws ecr public get login password--区域us-east-1 | docker login--用户名aws--密码stdin public。ecr。aws/z8i5y3u6。原因:退出状态1

  • 我有一些使用下面某个模块的网页抓取Python代码 硒 bs4 MySQLdb 调度器 在网上或云上运行代码的最简单方法或平台是什么?

  • 可能的重复: Java是什么?:运算符叫什么,它做什么? 你好,我在理解下面的代码时遇到了一些问题,有人能帮我弄到吗? 我不明白是什么意思。

  • 线程“main”java.lang.noClassDefounderRor: org/openqa/selenium/remote/internal/circularoutputStream在org.openqa.selenium.firefox.firefoxBinary.(firefoxBinary.firefoxBinary.firefoxBinary.firefoxBinary.firef

  • 问题内容: 我正在尝试通过URLConnection上传文件,但是我需要将其读取/写入为二进制文件,而无需进行任何编码更改。 所以我试图从读取数组,但是现在我有一个问题。我用于输出到服务器的对象不允许我执行操作(类型为)。我怎样才能解决这个问题?还是有另一种快速将二进制数据从a复制到a的方法? 谢谢 问题答案: 对象(包括)专门用于输出字符数据。听起来您想要这里而不是这里。 你是哪里人 如果它是通