在我自己的项目中使用jrawio,导致错误

Using jrawio in my own project, causes an error

我正在使用这个:https://github.com/tidalwave-it/jrawio-src它是一个图像 I/O Camera Raw 文件的 SPI 提供程序

我 运行 maven 项目,获取它生成的必要 jar,并将它们作为引用库放入我自己的转换图像的项目中。当我 运行 将 .NEF 格式转换为 JPEG 时,会发生以下错误。

   Jan 22, 2020 1:54:16 PM it.tidalwave.imageio.util.Logger info
    INFO: Installing RAWProcessor...
    Jan 22, 2020 1:54:16 PM it.tidalwave.imageio.util.Logger info
    INFO: Installed RAWProcessor
    RAWProcessor succesfully installed
    Exception in thread "AWT-EventQueue-1" java.lang.NoSuchMethodError: java.nio.ShortBuffer.position(I)Ljava/nio/ShortBuffer;
        at it.tidalwave.imageio.nef.NEFCompressionData.<init>(NEFCompressionData.java:79)

而 79 是导致错误的行:

73        shortBuffer = byteBuffer.asShortBuffer();
79        shortBuffer.position(1);

根据我的研究,jrawio SPI 中使用的引用缓冲区方法(例如shortBuffer.position(1);)经历了从 Java8 到 Java9 的变化,因此它不会被识别 - 但我不使用 Java9。我使用 Java8 来编辑和 运行ning jrawio maven 项目和我自己的项目。

我也一直在尝试使用旧版 Java 进行编译,但这破坏了我自己的项目。 我一直在更改 generate-sources.xml 和 pom.xml 中的设置,然后 运行 使 jrawio 项目生成 jars 但没有成功。

运行 jrawio 项目还提供:

warning [options] bootstrap class path not set in conjunction with -source 8

我该怎么做才能解决所有这些问题并成功将此 Image I/O SPI Provider for Camera Raw 文件实施到我自己由 Java8 编辑和编译的项目中?

如您所见,Buffer classes 在 java9 中进行了更改,以添加多个方法的协变覆盖。以前,方法

public Buffer position(int newPosition)

仅存在于 Buffer 基础 class 并且因为它也返回 Buffer 与方法链接结合使用并不方便。 In java9, overloaded methods were added to all subclasses to return the concrete subtype,例如

public ShortBuffer position(int newPosition)

这本身就是一个兼容的更改,针对旧方法编译的代码将包含对该方法的引用,并且在加载时将针对具体重载进行解析。

使用来自 jdk9 和 运行 的 class 文件在较旧的 jdk 上编译代码时会出现问题。在这种情况下,字节码包含对新重载的引用,无法在旧版本 jdk.

上解析

这也是您看到警告的原因:

warning [options] bootstrap class path not set in conjunction with -source 8

sourcetarget选项只影响接受的源代码和生成的字节码,但编译仍会使用当前jdk的class库。一种解决方案是将引导 class 路径设置为指向较旧的 jre 版本。

更好的解决方案,已包含在 jdk9、. This makes the compiler use some kind of internal database that contains information about when which methods were added to the jdk, and generate bytecode compatible with a release version. With maven this parameter can be set using the maven.compiler.release property inside the properties block in pom.xml.

<properties>
    <maven.compiler.release>8</maven.compiler.release>
    ...

用ant,用的是运行generate-sources.xmlrelease parameter can be passed to the javac task

(请注意,我实际上并没有使用 jrawio 源代码对此进行测试)