0

您好,我正在使用jnativehook库和 javafx 运行mvn javafx:run正常,但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 存储库位于此处如何解决此错误?

4

1 回答 1

1

警告

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

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

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

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

  1. 通过 Idea New JavaFX 项目向导创建了一个新的 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. 在应用程序的 start 方法中添加了以下行:

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

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

    requires com.github.kwhat.jnativehook;
    
  7. 链接应用程序:

    • 在 maven 窗口中右键单击 Plugins | javafx | javafx:jlink 并选择“运行 Maven 构建”。
  8. 从 jar 中提取本机库。

    • 右键单击jnativehook-<longversioninfo>.jar

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

    • 在命令行窗口中jar xvf <copied path>

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

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

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

      System.out.println("libname: " + System.mapLibraryName("JNativeHook"));           
      
  9. 将本机 lib 复制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
    

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

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

如果您愿意,您可以创建一个问题,要求 jnativehook 开发人员简化此操作。如果您这样做,请务必链接回此问题以获取上下文。

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

于 2022-01-12T09:42:03.927 回答