使用 Java 模块时规避旧的 java 元信息/服务

Circumvent old java meta-inf / services when using Java modules

我正在尝试使用 Batik-library 制作一个显示 SVG 图像的 Java FX 应用程序,但我在正确导入所有组件时遇到问题。

经过大约 5 小时的搜索和测试,我终于更改了其中一个依赖项的 jar,以删除早于当前模块系统的旧 Java 服务(或您称之为的任何内容)。所以目前的解决方法是手动删除“META-INF/services/org.apache.batik.script.InterpreterFactory”-文件在“batik-script-1.13.jar”.

是否有正确的方法来做到这一点?在我的项目模块信息中,还是通过 Maven?无需手动更改 jar?

提前致谢! :)

如果相关: Mac OS, Java openjdk-14.0.2, Maven 3.6.3, VSCode 1.49.0

TL;DR — 没有办法绕过 batik 库的 java.lang.module.InvalidModuleDescriptorException 使用 JPMS 系统的问题。


long-winded版本

几个月前我自己也遇到了同样的问题。我发现,就像你一样,很可能也发现了,this old Jigsaw Dev mailing list post

> 2) Error occurred during initialization of boot layer

> java.lang.module.FindException: Unable to derive module descriptor for

> .m2\repository\org\apache\xmlgraphics\batik-script.8\batik-script-1.8.jar

> Caused by: java.lang.module.InvalidModuleDescriptorException: Provider

> class org.apache.batik.bridge.RhinoInterpreterFactory not in module

There exists META-INF/services/org.apache.batik.script.InterpreterFactory config file with a provider class that is not in this module.

回复 OP 的人是a member of the Java Platform Development Team that has decades of experience

我解释了他们对邮件列表 OP 的建议“我建议您联系该库的维护者以发布一个可以 运行 作为模块”的版本,作为一个线索,试图将 batik 库与 JPMS 一起使用是没有希望的。

在最终放弃 JPMS 并试图通过自动化我已经开始工作的 JAR-alterations 来绕过系统之前,我为此苦苦挣扎了很长一段时间。

通过使用名为 Truezip 的 Maven 插件,我将 Maven 设置为自动解压缩、更改然后重新压缩依赖项。尽管它不是最优雅的解决方案,但它确实有效,而且我还在另一个有类似问题的依赖项上使用它。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>truezip-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <id>fix-batik-script</id>
            <goals>
                <goal>remove</goal>
            </goals>
            <phase>process-resources</phase>
            <configuration>
                <fileset>
                    <directory>${settings.localRepository}/org/apache/xmlgraphics/batik-script/1.13/batik-script-1.13.jar/META-INF/services</directory>
                    <includes>
                        <include>org.apache.batik.script.InterpreterFactory</include>
                    </includes>
                </fileset>
            </configuration>
        </execution>
    </executions>
</plugin>