使用 Java 9 模块 (JPMS) 时出现 java.lang.NoSuchMethodError

标签 java spring-boot java-module vlcj

我正在尝试使用 JPMS 模块组合 JavaFX、Spring Boot 和 VLCJ。在没有 Spring Boot 的情况下,我的 module-info.java 文件中的一切正常:

module myapplication.module {
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.web;
    requires vlcj;

    requires org.kordamp.iconli.core;
    requires org.kordamp.ikonli.javafx;
    requires org.kordamp.ikonli.fontawesome5;

    exports com.company.app;
}

但是,如果我现在将 Spring Boot 加入其中,我会更新我的 module-info.java 以包含与 Spring 相关的模块:

    requires spring.beans;
    requires spring.context;
    requires spring.core;
    requires spring.boot.autoconfigure;
    requires spring.boot;

但是,我在运行时遇到了这个异常:

java.lang.NoSuchMethodError: com.sun.jna.Native.load(Ljava/lang/String;Ljava/lang/Class;)Lcom/sun/jna/Library;
    at vlcj.natives@4.1.0/uk.co.caprica.vlcj.binding.LibC.<clinit>(LibC.java:38)
    at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.strategy.OsxNativeDiscoveryStrategy.setPluginPath(OsxNativeDiscoveryStrategy.java:72)
    at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.strategy.BaseNativeDiscoveryStrategy.onSetPluginPath(BaseNativeDiscoveryStrategy.java:126)
    at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.NativeDiscovery.tryPluginPath(NativeDiscovery.java:176)
    at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.NativeDiscovery.discover(NativeDiscovery.java:117)
    at vlcj@4.2.0/uk.co.caprica.vlcj.factory.MediaPlayerFactory.discoverNativeLibrary(MediaPlayerFactory.java:187)
    at vlcj@4.2.0/uk.co.caprica.vlcj.factory.MediaPlayerFactory.<init>(MediaPlayerFactory.java:119)
    at vlcj@4.2.0/uk.co.caprica.vlcj.factory.MediaPlayerFactory.<init>(MediaPlayerFactory.java:174)
    at myapplication.module/com.company.app.MyApplication.mediaPlayerFactory(MyApplicationConfiguration.java:18)
    at myapplication.module/com.company.app.MyApplication$$EnhancerBySpringCGLIB$$702eae01.CGLIB$mediaPlayerFactory$0(<generated>)
    at myapplication.module/com.company.app.MyApplication$$EnhancerBySpringCGLIB$$702eae01$$FastClassBySpringCGLIB$$af782040.invoke(<generated>)
    at spring.core@5.1.9.RELEASE/org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
    at spring.context@5.1.9.RELEASE/org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
    at myapplication.module/com.company.app.MyApplication$$EnhancerBySpringCGLIB$$702eae01.mediaPlayerFactory(<generated>)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at spring.beans@5.1.9.RELEASE/org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 34 more

com.sun.jna.Native 是依赖树的一部分的类,因为它是 VLCJ 的传递依赖:

[INFO] +- uk.co.caprica:vlcj:jar:4.2.0:compile
[INFO] |  \- uk.co.caprica:vlcj-natives:jar:4.1.0:compile
[INFO] |     +- net.java.dev.jna:jna:jar:4.5.2:compile
[INFO] |     \- net.java.dev.jna:jna-platform:jar:4.5.2:compile

我还尝试在我的模块描述符中添加 requires jna;,但这并没有改变任何东西。

最佳答案

发布问题 10 分钟后我自己找到了答案:-)

问题不在于 Java 模块系统,而在于 Spring Boot 引入的 JNA 版本比 VLCJ 需要的版本要旧。不知道为什么 Maven 决定这样做或者为什么 Spring Boot 为 JNA 声明一个版本,但是添加依赖项显式修复它:

        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.4.0</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna-platform</artifactId>
            <version>5.4.0</version>
        </dependency>

关于使用 Java 9 模块 (JPMS) 时出现 java.lang.NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57824009/

相关文章:

Java 10 Eclipse + Maven "java.lang.module.FindException: Module myproject not found"

java - --add-opens 是否适用于 JPMS 中动态创建的层?

java.lang.VerifyError : class com. fasterxml.jackson.module.scala.ser.ScalaIteratorSerializer 覆盖 final方法 withResolved

java - 使用 RetroFit2 和 Android/Java 的首次 API 调用

mysql - 如何使用 JPA 注释将 DateTime(3) 表示为数据库中 MySQL 列中的数据类型

java - 在 Controller 中抛出异常时,Spring Websecurity 在 'ignored' 资源上抛出 401

java - Maven 依赖相当于 MOXy

java - 已经有大括号但出现语法错误,插入 "}"来完成类主体

java - 通过 @OneToMany 和 @ManyToOne 使用 JPA hibernate 获得无限递归

java - 类加载器 + 模块 = 测试难题