使用Java模块时,如何规避旧版Java中的meta-inf / services问题

3

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

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

有没有一种适当的方法来做这件事?可以在我的项目module-info中或通过maven进行操作,而无需手动更改jar文件吗?

提前感谢! :)

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


那应该是向图书馆管理员询问的更好问题。 - Naman
没错,我的问题更多地是针对是否有一种通过JPMS系统来实现这一点的方法。考虑到它确实试图通过构建自动模块来支持旧的JAR文件,我认为应该有一种处理这个问题的方法。 - RandomDude244
2个回答

1

TL;DR — 使用JPMS系统无法规避batik库的java.lang.module.InvalidModuleDescriptorException问题。


简化版

几个月前我也遇到了这个问题。像你一样,我也找到了这篇旧的Jigsaw Dev邮件列表帖子

> 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\1.8\batik-script-1.8.jar

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

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

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

该回复的人是Java平台开发团队成员,拥有数十年的经验
我理解他们在邮件列表OP的建议“我建议您联系此库的维护者发布一个可作为模块运行的版本”是一个线索,表明试图使用JPMS与batik库是无望的。

1

我曾经花了相当长的时间来解决这个问题,最终放弃了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>

这是一个可怕的解决方法!但感谢提供代码。 - Lii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接