提问者:小点点

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


我试图使一个JavaFX应用程序显示使用蜡染库的SVG图像,但我有问题得到正确导入所有组件。

经过大约5个小时的搜索和测试,我终于修改了一个依赖项的jar,以删除当前模块系统之前的旧Java服务(或任何你称之为它的东西)。因此,当前的解决方法是手动删除“batik-script-1.13.jar”中的“META-INF/services/org. apache.batik.script.解释器工厂”文件。

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

提前感谢!:)

如果相关:MacOS,Javaopenjdk-14.0.2,Maven 3.6.3,VSCode 1.49.0


共2个答案

匿名用户

太长别读-使用JPMS系统无法规避蜡染库的java. lang.module.InvalidModuleSpeptorException问题。

啰嗦的版本

几个月前,我自己也遇到了同样的问题。我发现,像你一样,很可能也发现了,这个古老的拼图开发邮件列表帖子…

存在META-INF/services/org. apache.batik.script.解释器工厂配置文件,其中包含不在此模块中的提供程序类。

回复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>