繁体   English   中英

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

[英]JDK9 problems: failes running simple java code

我正在运行DMelt( http://jwork.org/dmelt ),并且注意到使用JDK9时,简单的Java代码失败。 这是一个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

JDK 9中的该区域存在不兼容的更改。从JDK 9发行说明

从Java SE 1.4开始,javax.imageio.spi.ServiceRegistry提供了与Java SE 1.6 java.util.ServiceLoader大致等效的功能。 现在,此映像I / O功能仅限于支持定义为javax.imageio一部分的SPI。 将其用于其他目的的应用程序需要重新编码以使用ServiceLoader。

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

实际上,Oracle已经引入了此突然的功能,该功能将javax.imageio.spi.ServiceRegistry限制为某些图像类。 您可以在DMelt框架和其他使用VectorGraphics的开源代码中轻松修复此问题:

1)从不受限制的JDK8 http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/9d617cfd6717/src/share/classes/javax/imageio/spi/获取此程序包的源代码

2)重命名包并将其添加到您的项目中。 在此阶段,您可以完全删除javax.imageio.spi.ServiceRegistry。

这个简单的解决方案很好用。 但是,请确保您的项目基于GNU。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM