我正在运行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: An illegal reflective access operation has occurred. org.python.core.PySystemState
无关答案 0 :(得分:3)
JDK 9中此区域发生了不兼容的更改。来自JDK 9 release notes:
自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
。
答案 1 :(得分:1)
实际上,Oracle已经引入了这个突然的功能,将javax.imageio.spi.ServiceRegistry限制为某些图像类。您可以在DMelt framework和其他使用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的。