【问题标题】:How to find replacement packages when migrating from Java 7 to 12?从 Java 7 迁移到 12 时如何找到替换包?
【发布时间】:2019-11-01 06:36:44
【问题描述】:

我正在将一个巨大的单体应用程序从 java 1.7 迁移到 12,并且我希望以正确的方式完成它,并且尽可能少的 hack。理所当然地,我一直遇到这样的错误:

[ERROR] /home/idiot/projects/projects/blah/blah/src/blah/blah/blah/Blah.java:[8,18] package sun.nio.cs.ext is not visible

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project blah: Compilation failure
    [ERROR] /home/idiot/projects/blah/blah/src/blah/blah/blah/Bblah.java:[152,42] package com.sun.org.apache.xerces.internal.dom is not visible
    [ERROR]   (package com.sun.org.apache.xerces.internal.dom is declared in module java.xml, which does not export it)

以及诸如此类的警告

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.python.google.common.base.internal.Finalizer (file:/home/idiot/.m2/repository/own/plugin/own-plugin-1.jar) to field java.lang.Thread.inheritableThreadLocals
WARNING: Please consider reporting this to the maintainers of org.python.google.common.base.internal.Finalizer
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

模块化这个庞然大物的网络应用似乎是不可能的,甚至没有合适的教程可供查找。 大多数 google 和 stack 结果都是适用于 pre java 11 环境的解决方案。大多数 google-fu 建议使用正确的包,而不是现在隐藏/过时的包。

挑战和我的问题是,如何找出现在过时的 API 被替换为什么?

有成千上万的文件使用反射,com.sun.orgsun.misc 包,一旦找到找到替换包的步骤,如何解决这个问题?只需手动浏览数千个文件并更新?

【问题讨论】:

    标签: java migration openjdk-12


    【解决方案1】:

    我知道没有列出所有现有替换包的单一来源(尽管有一个会很好)。相反,您需要为每个单独的人寻找替代品 - 如果不成功,我建议为每个包/用例创建一个新问题。

    请注意,每个内部 API 很可能没有官方替代品。恰恰相反,一般来说,大多数内部人员不会有公开的替代方案。许多人不需要,但我们总会遇到一些 JDK API 根本不支持的边缘情况。在这种情况下(并作为其他人的创可贴,直到您找到解决方案),您可以强制编译器和运行时使用 --add-exports--add-opens 导出/打开内部 API,例如:

    # your first compile error example
    javac --add-exports jdk.charsets/sun.nio.cs.ext=ALL-UNNAMED ...
    java --add-exports jdk.charsets/sun.nio.cs.ext=ALL-UNNAMED ...
    # your second compiler error example
    javac --add-exports java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED ...
    java --add-exports java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED ...
    # your run-time warning example
    java --add-opens java.base/java-lang=ALL-UNNAMED
    

    以下是如何在 Maven 中将这些添加到编译器插件和 Surefire/Failsafe(语法相同):

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <!-- PLEASE ADD A COMMENT EXPLAINING WHICH CLASSES/DEPENDENCIES
                    USE THIS INTERNAL API AND WHY! -->
            <compilerArgs>
                --add-exports jdk.charsets/sun.nio.cs.ext=ALL-UNNAMED
                --add-exports java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED       </compilerArgs>
        </configuration>
    </plugin>
    <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <!-- PLEASE ADD A COMMENT EXPLAINING WHICH CLASSES/DEPENDENCIES
                    USE THIS INTERNAL API AND WHY! -->
            <argLine>
                --illegal-access=deny
                --add-exports jdk.charsets/sun.nio.cs.ext=ALL-UNNAMED
                --add-exports java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED
                --add-opens java.base/java-lang=ALL-UNNAMED
            </argLine>
        </configuration>
    </plugin>
    

    Explanation of --illegal-access 以及为什么要添加它。)

    是的,这些都是“肮脏的变通方法”,但它们比 Java-9 之前的方式有一个优势:您对内部 API 的依赖现在是明确的,并且到处添加命令行标志的不便让您有动力停止做它。 ?

    有成千上万的文件使用反射,com.sun.orgsun.misc 包,一旦找到找到替换包的步骤,如何解决这个问题?只需手动浏览数千个文件并更新?

    是的。就好像一开始就使用它们是个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      相关资源
      最近更新 更多