【问题标题】:java.lang.UnsatisfiedLinkError: URI scheme is not "file" with javafx:jlinkjava.lang.UnsatisfiedLinkError: URI 方案不是带有 javafx:jlink 的“文件”
【发布时间】:2022-01-12 07:12:02
【问题描述】:

您好,我正在使用 jnativehook 库和运行 mvn javafx:run 的 javafx 工作正常,但使用 mvn javafx:jlink 无法启动启动器,这里是 javafx 插件 xml,

<plugin>
   <groupId>org.openjfx</groupId>
   <artifactId>javafx-maven-plugin</artifactId>
   <version>0.0.6</version>
   <executions>
      <execution>
         <id>default-cli</id>
         <configuration>
            <launcher>launcher</launcher>
            <mainClass>facsimile/com.github.srilakshmikanthanp.facsimile.Launcher</mainClass>
         </configuration>
      </execution>
   </executions>
</plugin>

这是堆栈跟踪,

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.UnsatisfiedLinkError: URI scheme is not "file"
        at com.github.kwhat.jnativehook@2.2-SNAPSHOT/com.github.kwhat.jnativehook.GlobalScreen.<clinit>(GlobalScreen.java:91)        
        at facsimile@1.0.0/com.github.srilakshmikanthanp.facsimile.Launcher.start(Launcher.java:34)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
        ... 1 more
Exception running application com.github.srilakshmikanthanp.facsimile.Launcher

github 存储库是hereline,如何解决这个错误?

【问题讨论】:

  • “我正在使用带有 javafx 的 jnativehook 库” -> 为什么?
  • 监听全局键盘和鼠标事件以显示和隐藏具有指定快捷键的阶段;)
  • 您正在通过fallback 进行本机库查找。通过确保适当的 jbativehook 本机库位于您为属性 System.getProperty("jnativehook.lib.name", "JNativeHook") 定义的路径中,在启动脚本启动器中正确设置本机库的路径。
  • 我尝试用 jpackage 打包图像,可以将两者捆绑在一起吗?
  • 尝试让 loadLibrary 为名称 JNativeHook 工作。检查该名称 maps to on your system 的系统相关映射在哪里,并确保该库在那里。

标签: java javafx jlink jnativehook


【解决方案1】:

注意

JavaFX 具有内置的键盘处理功能。

绝对不要这样做,除非您需要一些 JavaFX 未内置的功能。

那就是说。 . .如果你真的需要这样做。 . .

我通过以下步骤使其工作:

  1. 通过 Idea New JavaFX project wizard 创建了一个新的 JavaFX 项目。

  2. 添加了对 JNativeHook 2.2-SNAPSHOT 的依赖。

    • 需要快照,因为 2.2.1 版本模块信息不适合我。

      <dependency>
          <groupId>com.github.kwhat</groupId>
          <artifactId>jnativehook</artifactId>
          <version>2.2-SNAPSHOT</version>
      </dependency>
      
    • 需要启用 sonatype 快照存储库才能访问它。

      <repositories>
         <repository>
            <id>oss.sonatype.org-snapshot</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
         </repository>
      </repositories>
      
  3. 向应用添加了导入:

    import com.github.kwhat.jnativehook.GlobalScreen;
    
  4. 在应用的启动方法中添加了以下行:

    GlobalScreen.registerNativeHook();
    
  5. 在应用程序的停止方法中添加了以下行:

    GlobalScreen.unregisterNativeHook();
    
  6. 在 module-info.java 中添加以下行

    requires com.github.kwhat.jnativehook;
    
  7. 已关联应用:

    • 在maven窗口中右键点击Plugins | javafx | javafx:jlink 并选择“Run Maven Build”。
  8. 从 jar 中提取原生库。

    • 右键点击jnativehook-&lt;longversioninfo&gt;.jar

    • 选择复制路径/参考... |绝对路径

    • 在命令行窗口jar xvf &lt;copied path&gt;

    • 为平台找到合适的原生库。

      find . | grep dylib   
      
    • 对我来说它是一个 intel mac,所以文件是:

      ./com/github/kwhat/jnativehook/lib/darwin/x86_64/libJNativeHook.dylib
      
    • 名称已通过添加到 start 方法的这一行的输出得到确认:

      System.out.println("libname: " + System.mapLibraryName("JNativeHook"));           
      
  9. 将本机库libJNativeHook.dylib复制到为jlink创建的应用程序创建的lib目录中,这是:

    <projectname>/target/app/lib
    
  10. 尝试运行应用程序:

    cd <projectname>/target/app/bin
    ./app
    
  11. 应用程序运行将失败并出现以下错误(表示本机库已加载并且还有另一个错误):

    Caused by: com.github.kwhat.jnativehook.NativeHookException: Failed to enable access for assistive devices.
    
  12. 按照此处的说明为终端应用启用辅助设备:

  13. 再次运行应用程序:

    ./app
    

现在应用程序运行良好。 . .

也许有更简单的方法可以做到这一点。 . .我不知道。

如果您愿意,您可以create an issue 要求 jnativehook 开发人员简化此操作。如果您这样做,请务必链接回此问题的上下文。

以某种方式(我不知道如何)在 jlink 完成后可以拾取 JavaFX 库,而无需手动将本机库复制到 jlink 输出库目录。也许为 JavaFX 所做的任何事情都可以为 jnativehook 做,以使其更易于与 jlink/jpackage 一起使用。

【讨论】:

  • javafx 有全局键盘监听器吗?
  • 我按照您的指示将 dill 文件复制到 image/bin 现在它正在工作。它暂时解决了我的问题:)
  • @srilakshmikanthanp 我不这么认为,我认为关键监听器都是基于应用程序的,但我可能错了,它的公共 API 或私有内部实现中可能有一些东西可以让你这样做.有一个相关的问题目前没有明确的答案,但指向一些参考资料(包括 jnativehook):JavaFX global keyboard listener
  • 我的说明是针对图像 lib 目录而不是 bin 目录,但也许它适用于两者,或者目标目录在您的设置中不同,无论哪种方式,它都能正常工作:-)
  • 但是我需要解决的问题我每次构建时都在jnativehook上提出了问题,感谢您的努力谢谢;)
猜你喜欢
  • 2011-02-20
  • 2013-07-30
  • 2015-08-17
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2012-05-12
  • 2012-06-14
  • 2011-12-13
相关资源
最近更新 更多