[英]Circumvent old java meta-inf / services when using Java modules
我正在尝试使用Batik-library制作一个显示 SVG 图像的 Java FX 应用程序,但是我在正确导入所有组件时遇到了问题。
经过大约 5 个小时的搜索和测试,我终于更改了依赖项的 jar 包之一,以删除早于当前模块系统的旧 Java 服务(或您称之为的任何服务)。 因此,当前的解决方法是手动删除“ batik-script-1.13.jar ”中的“ META-INF/services/org.apache.batik.script.InterpreterFactory ”文件。
有没有合适的方法来做到这一点? 在我的项目模块信息中,还是通过 Maven? 无需手动更改罐子?
提前致谢! :)
如果相关:Mac OS、Java openjdk-14.0.2、Maven 3.6.3、VSCode 1.49.0
TL;DR — 无法使用 JPMS 系统绕过 batik 库的java.lang.module.InvalidModuleDescriptorException
问题。
长篇大论的版本
几个月前我自己也遇到了同样的问题。 我发现,像你一样很可能也发现了, 这个旧的 Jigsaw Dev 邮件列表帖子......
…
> 2) 启动层初始化时出错
> java.lang.module.FindException: 无法为
> .m2\\repository\\org\\apache\\xmlgraphics\\batik-script\\1.8\\batik-script-1.8.jar
>引起:java.lang.module.InvalidModuleDescriptorException: Provider
>类 org.apache.batik.bridge.RhinoInterpreterFactory 不在模块中
存在 META-INF/services/org.apache.batik.script.InterpreterFactory 配置文件,其中提供程序类不在此模块中。
…
回复 OP 的人是具有数十年经验的 Java 平台开发团队的成员。
我将他们的“我建议你联系这个库的维护者发布一个可以作为模块运行的版本”的建议给邮件列表 OP,作为一个线索,试图将 batik 库与 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.