使用Java模块时规避旧的Java meta-inf /服务

问题描述

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

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

有没有正确方法?在我的项目module-info中,还是通过maven?无需手动更改罐子?

提前谢谢! :)

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

解决方法

TL; DR -使用JPMS系统无法解决蜡染库的 java.lang.module.InvalidModuleDescriptorException 问题。>


冗长的版本

几个月前,我自己遇到了同一问题。我发现this old Jigsaw Dev mailing list post和您一样,也像您一样……

...

> 2)引导层初始化期间发生错误

> java.lang.module.FindException:无法导出

的模块描述符

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

> 原因:java.lang.module.InvalidModuleDescriptorException:提供程序

org.apache.batik.bridge.RhinoInterpreterFactory类不在模块中

存在一个META-INF / services / org.apache.batik.script.InterpreterFactory配置文件,其配置文件不在此模块中。

...

在OP中回复的人有a member of the Java Platform Development Team,其中有decades of experience

我解释了他们的“ 我建议您联系该库的维护者以发布可以作为模块运行的版本”建议,以作为邮件列表OP的提示,带有JPMS的蜡染库是没有希望的。

,

我花了很长时间才与之抗争,直到最终放弃JPMS并试图通过使我已经开始工作的JAR变更自动化来规避系统。

通过使用一个称为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>