JavaFX访问内部webkit文档

2024-04-02

我正在尝试访问javafx.web/com.sun.webkit.dom来自我的未命名模块 javafx 项目。为此,我创建了一个类com.sun.webkit.dom.DomMapper。 我在 IDE 中没有看到任何错误,但是当我使用mvn clean javafx:run它抱怨——

Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: com/sun/webkit/dom/DomMapper
....
Caused by: java.lang.ClassNotFoundException: com.sun.webkit.dom.DomMapper
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
...

这就是我的 pom.xml 的样子

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId> ... </groupId>
    <artifactId> ... </artifactId>
    <version> ... </version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <exec.mainClass> .... </exec.mainClass>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11</version>
        </dependency> 
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>11</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>11</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.14.3</version>
        </dependency> 
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.4</version>
                <configuration>
                    <options>
                        <option>--add-exports</option><option>javafx.web/com.sun.webkit.dom=ALL-UNAMED</option>
                        <option>--add-opens</option><option>javafx.web/com.sun.webkit.dom=ALL-UNAMED</option>
                    </options>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <compilerArgs>
                        <arg>--add-exports</arg><arg>javafx.web/com.sun.webkit.dom=ALL-UNAMED</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

如果我使用 Maven 阴影插件,我就可以绕过这个问题。 我认为这与 JPMS 安全性的工作原理有关,但我不知道如何绕过它。我尝试了各种组合的添加导出和添加打开,但这对我没有帮助。 我究竟做错了什么?

顺便说一句,我想将 WebKit DOM 映射到 JSoup dom 元素,因为它们为 CSS 选择器提供了一个很好的 API。

Update我正在添加错误的附加堆栈跟踪

java.lang.reflect.InvocationTargetException
    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 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:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
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:834)
Caused by: java.lang.NoClassDefFoundError: com/sun/webkit/dom/DomMapper
    at xyz.jphil.internal_browser.TestApp.start(TestApp.java:86)
    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(Native Method)
    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
Caused by: java.lang.ClassNotFoundException: com.sun.webkit.dom.DomMapper
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 10 more

这个问题的解决方案在于使用 using--patch-module。因为我添加了一个类 -com.sun.webkit.dom.DomMapper这是由 JPMS 完全密封的。我添加的原因DomMapper in the com.sun.webkit.dom.DomMapper是访问一些包私有函数。

但是,我发现这很容易避免,因此我选择避免使用这些包私有函数。有了这个--patch-module不是必需的,根据 JPMS 文档也不建议这样做。现在解决方案更简单了。添加--add exports就足够了(POM 中已经存在)并且我能够让它工作。

最后,例如使用 Maven Shade 插件将整个程序导出为 Farjar,也是可行的。我添加这个只是为了提供信息。

此答案基于 Jewelsea 和 Slaw 的评论和宝贵意见。 进一步说明:

  • 此示例显示了公共(尽管是内部)函数com.sun.webkit.dom都很好,gist.github.com/jewelsea/6722397
  • 我通过在里面创建一个类来创建的问题com.sun.webkit.dom称为 split-package - 请阅读此处Java 9 中如何避免拆分包 https://stackoverflow.com/questions/51828014/how-split-packages-are-avoided-in-java-9
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX访问内部webkit文档 的相关文章

随机推荐

  • 如何请求Android用户通过点击启用蓝牙?

    from http developer android com guide topics connectivity bluetooth html http developer android com guide topics connect
  • 仅使用 HTML 和 CSS 创建下拉按钮?

    是否可以仅使用 HTML 和 CSS 创建一个带有下拉菜单的按钮 a Take Action a ul li action 1 li li action 2 li ul 单击链接时 悬停也可以 但首选单击 我希望显示 ul actions
  • 抽象声明中没有参数名称?

    这是 F 中抽象成员的典型声明 abstract member createEmployee string gt string gt Employee 您定义参数类型 但不定义它们的名称 没有名字 在实现接口时如何知道每个参数是什么 换句话
  • 如何使用 Kotlin 就地过滤列表?

    在 Java 中 我可以使用以下代码从列表中删除项目 private void filterList List
  • 消除录音曲目中当前播放曲目的声音

    我希望使用远程 IO 进行音频录制和播放 我对核心音频的理解很差 因为我遵循惊人的音频开源 http theamazingaudioengine com 到目前为止 我可以使用相同的代码进行录制和播放 现在我尝试通过麦克风录制并通过 iPh
  • 特定接口上的 TCP/IP 连接

    我想使用两个网络路由之一连接到服务器 一个人会怎样做呢 我在 Google 上搜索了很多 常见的答案是修改路由表 但这并没有什么帮助 因为目的地只有一个 IP 地址 大多数示例都具有具有单个网卡的客户端和具有多个网卡的服务器 但在本例中情况
  • Shell 正则表达式到行尾

    我有一个像这样的小例子的文件 mode dev 该文件中某处的注释中有一个 变量 我想在 Shell 脚本中使用正则表达式获取值 到目前为止我的代码 bin bash conf lt etc test conf Get the file c
  • 队列上的 IEnumerable 迭代器是否应该使项目出列

    我创建了一个自定义通用队列 它实现了通用 IQueue 接口 该接口使用 System Collections Generic 命名空间中的通用队列作为私有内部队列 示例已清除不相关的代码 public interface IQueue
  • 您应该如何从源代码控制构建数据库?

    SO 社区 wiki 上有一些关于数据库对象是否应该进行版本控制的讨论 然而 我还没有看到太多关于为数据库对象创建构建自动化过程的最佳实践的讨论 对于我的团队来说 这一直是一个有争议的讨论点 特别是因为开发人员和 DBA 在评估数据库部署自
  • 如何在 ElasticSearch 中基于正则表达式过滤令牌

    对于 ElasticSearch 查询 我们希望以不同的方式处理单词 即仅由字母组成的标记 和非单词 为此 我们尝试定义两个分析器 返回单词或非单词 例如 我们有描述五金店产品的文档 name Torx drive T9 category
  • 字符串搜索算法

    对于两种字符串搜索算法 KMP和后缀树 在什么情况下优选哪种 举一些实际的例子 如果您必须回答很多查询 例如 大海捞针是否存在 则后缀树会更好 如果您只需在另一个字符串中搜索一个字符串 而不需要执行很多次 那么 KMP 会更好 后缀树是一种
  • SwiftUI - 将 SceneKit 场景添加到 MacOS 项目

    目标 使用 UIViewRepresentable 将 SceneKit 场景添加到 SwiftUI MacOS 项目 不是 Catalyst 我做了什么 当目标是 SwiftUI iOS 时 以下代码可以正常工作 但是当目标是 MacOS
  • Node教程一对多无加载远程服务器Stream Spinner动不停

    我对在项目中使用所需的 Kurrento 很陌生 但是当我克隆 git hub 上为 Kurento 提供的教程并遵循 one2Many 调用的说明时 首先 adapter js 的软件包损坏了 因为我成功解决了它们 但之后出现了一个问题
  • 在 turfjs 中创建多个多边形的联合的最快方法是什么?

    我有这样的东西 但对于大集合来说 速度非常慢 let unionize triangles gt if triangles length 0 return null let ret triangles 0 feature triangles
  • Func<> 获取参数信息

    如何获取传入参数的值Func lt gt C 中的 Lambda IEnumerable
  • 如何将 OData 键值添加到我的实体框架类?

    我正在使用 MVC 5 Microsoft OData 2 1 和 Entity Framework 6 我尝试使用我使用 EntitySetController 类编写的 OData 源 当我添加服务引用并使用 OData 元数据时 它可
  • Maven 货物部署到 war 文件无法作为 teamcity 的一部分部署

    相同的部署在 Windows 和 Linux 上可以正常工作 但使用 teamcity 及其内置 Maven 时出现错误 本地部署 报错 容器配置目录 BuildAgent work 68d4a71c8dc5cfd9 target carg
  • 哪些脚本会进入 Python 包的 bin 文件夹?

    我正在从 Learn Python the Hard Way 及其中提到的练习之一中学习 Python 包 在bin目录下放置一个可以运行的脚本 对我来说 这似乎有点模糊 我不太确定 bin 文件夹中会包含什么样的脚本 搭便车者的包装指南
  • 将按钮放在 div 或屏幕底部

    我想将按钮放置在 div 底部或屏幕底部 但处于非固定位置 我的代码结构如下所示 div 1 div 2 div 3 button 我想将按钮放在div 1的底部 其高度是使用jQuery设置的 高度是屏幕的高度 所以将按钮放在屏幕的底部也
  • JavaFX访问内部webkit文档

    我正在尝试访问javafx web com sun webkit dom来自我的未命名模块 javafx 项目 为此 我创建了一个类com sun webkit dom DomMapper 我在 IDE 中没有看到任何错误 但是当我使用mv