我正在VSCode中处理一个JavaFX Maven项目,并试图将gson导入到我的一个类中,但它不允许我这样做.VSCode给了我一个"类型com.google.gson.gson是不可访问的"错误,并拒绝让我使用gson.

该依赖项已添加到我的pom.xml文件中,我在网上try 了一些解决方案,但都不起作用.同样奇怪的是,Gson与我同时处理的另一个Spring Maven项目工作得很好,所以我不太确定问题是什么.

下面是我的pom.xml文件:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ca.cmpt213.asn5</groupId>
    <artifactId>client</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.6</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <!-- <id>default-cli</id>
                        <configuration>
                            <mainClass>ca.cmpt213.asn5.</mainClass>
                        </configuration> -->
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

下面是我正在使用的类,它不能导入Gson:

package ca.cmpt213.asn5;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson; //gives a squiggly red line under this statement

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.Separator;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class SuperhumanTracker extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {

        Label title = new Label("Superhuman Tracker");
        title.setFont(new Font(20));

        TableView table = new TableView<>();
        TableColumn idColumn = new TableColumn<>("ID");
        TableColumn nameColumn = new TableColumn<>("NAME");
        TableColumn superpowerColumn = new TableColumn<>("SUPERPOWER");
        TableColumn abilityScoreColumn = new TableColumn<>("ABILITY SCORE");
        idColumn.setMinWidth(25);
        nameColumn.setMinWidth(200);
        superpowerColumn.setMinWidth(150);
        abilityScoreColumn.setMinWidth(150);

        table.getColumns().addAll(idColumn, nameColumn, superpowerColumn, abilityScoreColumn);

        Button addButton = new Button("Add a Superhuman");

        ComboBox<Integer> idComboBox = new ComboBox<>();
        idComboBox.setPromptText("ID");
        idComboBox.getItems().addAll(1, 2, 3);

        Button viewButton = new Button("Get Details");
        Button deleteButton = new Button("Delete Superhuman");

        viewButton.setOnAction(event -> {
            try {
                long id = Long.valueOf(idComboBox.getValue());
                URL url = new URL("http://localhost:8080/api/superhuman/" + id);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line = reader.readLine();

                Gson gson = new Gson(); //gives a squiggly red line under the Gson class

                System.out.println(connection.getResponseCode());
                connection.disconnect();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }

            Scene scene = new Scene(new SuperhumanDetails(null, 0, 0, null, null, null, null, 0).getView(), 400, 500);
            Stage stage = new Stage();
            stage.setTitle("Superhuman Detailed View");
            stage.setScene(scene);
            stage.show();
        });

        HBox hboxLeft = new HBox(idComboBox, separator1, viewButton, separator2, deleteButton);
        hboxLeft.setAlignment(Pos.CENTER_LEFT);

        HBox hboxRight = new HBox(addButton);
        hboxRight.setAlignment(Pos.CENTER_RIGHT);

        HBox hboxControls = new HBox(hboxLeft, hboxRight);
        hboxControls.setSpacing(180);

        VBox vbox = new VBox(title, table, hboxControls);
        vbox.setAlignment(Pos.CENTER);
        vbox.setSpacing(10);
        vbox.setPadding(new Insets(10,10,10,10));

        Scene scene = new Scene(vbox, 600, 400);
        
        primaryStage.setTitle("Superhuman Tracker");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

以下是MODULE-INFO.Java文件:

module ca.cmpt213.asn5 {
    requires transitive javafx.controls;

    exports ca.cmpt213.asn5;
}

推荐答案

For modular applications

对于模块化应用程序,对于module-info.java,您需要提供适当的设置,以使gson模块可用于您的代码,并使您的代码可用于gson.

这在GSON故障排除文档中的以下部分中有详细介绍:

确保项目的module-info.java文件允许Gson在您的类上使用反射,例如:

module mymodule {
    requires com.google.gson;

    opens mypackage to com.google.gson;
}

For your project

更改:

module ca.cmpt213.asn5 {
    requires transitive javafx.controls;

    exports ca.cmpt213.asn5;
}

致:

module ca.cmpt213.asn5 {
    requires javafx.controls;
    requires com.google.gson;

    opens mypackage to com.google.gson;

    exports ca.cmpt213.asn5;
}

其中mypackage是代码中的某个包,gson需要在该包上运行反射.

虽然它不会导致问题,但我只是注意到您的应用程序不需要关键字transitive.它用于使依赖模块中的类型可供模块的客户端使用.这是一个对于创建可共享的库模块比对于独立的JavaFX应用程序更有用的函数.

For non-modular applications

或者,您也可以通过删除module-info.java文件并遵循instructions for non-modular applications on openjfx.io来使您的应用程序非模块化.

Using the appropriate maven scope

正如注释中所指出的,只有当您确定所提供的依赖项将出现在您的运行时环境中时,才使用provided范围.GSON不是标准JRE的一部分,因此不太可能出现.

Maven documentation人开始:

provided

这与compile非常相似,但表示您希望JDK或容器在运行时提供依赖项.例如,在为Java企业版构建Web应用程序时,您可以将对Servlet API和相关Java EE API的依赖设置为所提供的范围,因为Web容器提供了这些类.具有此范围的依赖项将添加到用于编译和测试的类路径中,但不会添加到运行时类路径中.它是不可传递的.

也许,你的依赖项应该使用默认的compile范围并读取:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

Java相关问答推荐

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

Java在模块化jar文件中找不到类,但是javap可以

OpenJDK、4K显示和文本质量

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

Java 8中的多个字段和计数

通过合并Akka Streams中的多个慢源保持订购

连接Quarkus中的两个异步操作

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

JOOQ中的子查询使用的是默认方言,而不是配置的方言

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

如何在Java中使用正则表达式拆分字符串

Java嵌套流查找任意值

无限递归Java问题

验证没有';t work on Hibernate Entity';s字段

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

设置背景时缺少Android编辑文本下划线