使用 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>
我正在尝试使用 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>