【问题标题】:Why does VSCode keep opening *.class files as opposed to .java files?为什么 VSCode 一直打开 *.class 文件而不是 .java 文件?
【发布时间】:2021-01-14 19:17:17
【问题描述】:

(我不知道如何将我的屏幕截图上传到 stackoverflow。所以这是一个流式链接:https://streamable.com/0im8tx

在此视频中,当我 cmd 单击 QueriesController 时,VSCode 打开 QueriesController.class 而不是 QueriesController.java。

我已经编译提供了我工作区中 jar 文件的定义:

    "settings": {
        "java.project.referencedLibraries": {
            "include": [
                "<path-to-jar-that-contains-QueriesController.jar>",
.... 
            "sources": {
                "<path-to-jar-that-contains-QueriesController.jar>": "/my/local/java/definition/src/folder",

有谁知道为什么 VSCode 选择将定义作为 .class 文件而不是 .java 文件打开?

【问题讨论】:

  • 我注意到了这一点,尽管启用了为 maven 和 java 下载源的选项。但是我仍然看到 .class 文件,这些文件似乎已被反编译。但是,我确实注意到显示的那些类文件中的 cmets。反编译的 java 类文件和源文件有什么显着区别吗?

标签: java visual-studio-code


【解决方案1】:

我使用命令生成一个简单的jar包,并在另一个项目中使用。确实,当我们点击类名时,打开的是.class文件而不是.java文件:

关于如何生成可执行jar包,可以看看这个reply

  1. 编译.java文件,生成.class;

  2. 生成清单并将它们打包到 jar 中

一般来说,JAR (Java ARchive) 是一种包文件格式,通常用于将许多 Java class files 和关联的 metadataresources(文本、图像等)聚合到一个文件中以进行分发。

.java 文件不包含在 jar 包中,这就是您打开 .class 文件而不是 .java 文件的原因。

【讨论】:

    【解决方案2】:

    我不熟悉 VSCode,但您的问题在大多数 IDE 中都很常见。

    通常在制作 jar 时,它包含已编译的类文件而不是原始源代码。这样做的原因是为了尽可能高效和快速地运行代码,通常人们不希望 jar 中的源代码,因为在运行时它们还必须重新编译,这是浪费时间。

    看看这张照片。我刚刚从 mavenrepository 下载了一个 jar 文件,它下载了 jar 的编译版本。分机号是.class

    IDE 所做的是尝试使用反编译器对代码进行反编译(在这种情况下,您可以看到 FernFlower 反编译器)。

    但是它缺少源代码 (.java) 所具有的格式和代码内文档。这就是为什么大多数 IDE 都提供下载源代码的原因。 Intellij 在顶部显示了这一点。其他 IDE 可能会将这个设置隐藏得很深。 (您可能需要自己检查)

    当您下载源代码时,IDE 会尝试联系服务器并下载原始源代码。可能看起来像这样:

    如果仔细观察,您会发现名称已更改为 .java,代表源代码。

    【讨论】:

      【解决方案3】:

      VS Code 在 Java 设置下有选项,Java 下载源和 Maven 下载源

      默认情况下不启用。启用后,VS Code 会显示正确的源文件,尽管名称似乎是 .Class 文件。(在 Ctrl + 单击符号时,带有方法实现、cmets 等,JavaDoc 注释)

      如果在 m2 存储库中找不到正确的源,它会显示带有存根方法的反编译类文件。与此类似的注释显示在文件的开头。

      // Failed to get sources. Instead, stub sources have been generated by the disassembler.
       // Implementation of methods is unavailable.
      

      在任何一种情况下,VS Code 都会以只读模式将 maven 库文件显示为 .Class 文件。此外,源文件不会显示在 Java 项目资源管理器上。(尽管它存在于本地 .m2 存储库中)。

      希望对您有所帮助!快乐编码!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 2018-07-24
        • 1970-01-01
        • 2016-03-05
        相关资源
        最近更新 更多