【问题标题】:Eclipse Java 11 do not see external libs that were for older version (java 8)Eclipse Java 11 看不到旧版本 (java 8) 的外部库
【发布时间】:2020-09-13 07:58:15
【问题描述】:

我刚刚将我的 eclipse 项目从 java 8 更新到 java 11。但是我在这个项目中使用了为 java 8 设计的外部库。我已经成功地将这些库导入到项目类路径中,就像以前一样,但是 eclipse 只是拒绝使用它们。当我尝试导入它们时,它会将其突出显示为错误消息“无法访问类型 bla.bla.Foo”。我还尝试将这些库导入到项目模块路径中,并在 module-info.java 中需要它们,这以某种方式解决了问题,但我仍然不断收到警告 “自动模块 'SomeLib' 的名称不稳定,它来自模块的文件名。”“当我尝试使用这些库中的对象时,客户端可能无法访问模块 SomeLib 中的 Foo 类型,因为缺少'需要传递'” .

注意:我将 OpenJDK 11 与 JavaFX 11 一起使用。
注意:我要导入的库是 https://github.com/PetoPetko/JavaFx-Image-Animation
注意:我也收到 "The type com.sun... is not access" 来自 com.sun... 包的所有内容,但我不确定这是否相关解决这个问题。

【问题讨论】:

  • 删除默认包中的module-info.java文件或了解JPMS
  • 如果我删除模块信息,@howlger JavaFx 将无法工作,因为 JavaFx 适用于 java 11
  • module-info.java 是可选的,也适用于 JavaFX(请参阅 documentation for non-modular)。 Java 11 不需要module-info.java 文件。如果您的 module-info.java 文件没有相应的 requires 语句,或者如果它位于不导出此包的模块的包中,则无法访问一个类。
  • @howlger 我试过你提到的东西,它实际上解决了程序错误!但是,当我尝试使用 --module-path "C:\Program Files\JavaFx\lib" --add-modules javafx.controls,javafx.fxml 作为 VM 参数运行应用程序时,它会抛出 java.lang.IllegalAccessError: superclass access check failed: class ugp.org.Texture.Texture$1 (in unnamed module @0x7dc46891) cannot access class com.sun.javafx.collections.ObservableListWrapper (in module javafx.base) because module javafx.base does not export com.sun.javafx.collections to unnamed module @0x7dc46891
  • 请遵循文档:click here on JavaFX and Eclipse。不要使用com.sun.* 的东西。那是内部的。

标签: eclipse javafx import java-8 openjdk-11


【解决方案1】:

好吧,我自己设法以最原始的方式解决了这个问题...... 我只需将 JavaFX 导入类路径并从每个 JavaFx jar 文件中手动删除 module-info.class,从而使 JavaFx 不是模块化的。然后我只用提到的 VM 参数运行一个应用程序,一切都很好!
我相信你们中的许多人将能够给我 10 个理由,为什么从现有库中删除 module-info.class 是一个坏主意,但是......如果它有效,但我仍然认为没有其他解决方案可以让我不模块化项目使用 JavaFx 11。

【讨论】:

    【解决方案2】:

    您为解决问题所做的工作可以通过更简单的方式实现。只需在包含您的主类(假定名称 MyApp)的文件中添加如下所示的行,然后通过调用 MyAppLauncher.main 而不是 MyApp.main 来启动您的应用程序。

    class MyAppLauncher {public static void main(String[] args) {MyApp.main(args);}}
    

    这样做可以使您可以将所有 jars 放在类路径中,这样就可以完全打开模块系统,而无需手动删除 module-info.classes。

    【讨论】:

    • 我无法尝试这个,因为我已经删除了 module-info.class 所以在我的情况下,这无论如何都可以工作,因为“我的”JavaFx 现在不是模块化的!解决这个问题的一个很好的选择就是简单地降级到java8,你不需要使用open jdk,也不需要为使用原始的Oracle java付费!
    • 我也不明白Oracle的逻辑......为什么他们从JDK中弹出JavaFx,使JavaFx外部化?为什么我需要注册和支付新的 Java,比如 Java 11。整个 JPMS 的目的是什么?!我认为 JPMS 让已经很困难的事情变得更加困难......
    • 降级到 Java 8 不是解决方案,除非您真的假设从那时到现在没有任何改进。如果您不想为 Oracle 支付任何费用,也有免费的替代品。我只同意你在 JPMS 问题上的看法。
    • 是的,但由于没有明确的在 javaFx8 和 11 之间添加的功能列表,因此对我来说也是一样的。而且 java 8 可能仍然比 java 11 更受欢迎。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2019-08-12
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多