即使依赖项存在于类路径中,Spring boot 仍显示“无法解析”

Posted

技术标签:

【中文标题】即使依赖项存在于类路径中,Spring boot 仍显示“无法解析”【英文标题】:Spring boot shows 'can not be resolved' even if the dependency exists in classpath 【发布时间】:2019-07-22 05:00:14 【问题描述】:

我有一个 Spring Boot 应用程序,它在 pom.xml 中添加了 starter-data-jpa 依赖项。我可以清楚地找到 maven 依赖部分中的 javax.persistence 包。但我无法使用@Entity 注释。手动输入 import javax.persistence.Entity 时,eclipse 显示未解决的依赖关系。 提前致谢。

这是我的 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springframework.boot</groupId>
    <artifactId>currency-exchange-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>currency-exchange-serviceweb</name>
    <description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>       
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>$spring-cloud.version</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

【问题讨论】:

做 Maven 清洁构建 如果这没有帮助,请发布代码和错误消息。 删除 的依赖项并使用 mvn clean install 重试 【参考方案1】:

您正在为 JPA 启动器指定 &lt;scope&gt;test&lt;/scope&gt;,它专门告诉 Maven 您只希望该依赖项可用于测试类。删除范围,它应该可以工作。

【讨论】:

【参考方案2】:

尝试从 pom.xml 中删除 &lt;scope&gt; 用于依赖 JPA 启动器,执行 mvn clean install -U。这应该可以解决您的问题。

【讨论】:

不是全部,只是 JPA 启动器。 @chrylis 对不起,我错过了。感谢您指出。将更新我的答案。【参考方案3】:

您应该首先从 spring-boot-starter-data-jpa 依赖项中删除 &lt;scope&gt;test&lt;/scope&gt;

如果仍然无法正常工作,请在终端中使用以下命令验证您的项目是否在直接使用 Maven 时运行:

mvn spring-boot:run

如果此命令有效,请在 IDE 中重新导入项目,然后再次测试。通常,IDE 不会立即更新类路径,因此会出现故障。

【讨论】:

这个ide故障是怎么回事? 出于任何原因使缓存无效并重新启动。正确的做法是直接从命令行和 mvn 执行此操作。有时 ide 难以刷新和重新导入类路径

以上是关于即使依赖项存在于类路径中,Spring boot 仍显示“无法解析”的主要内容,如果未能解决你的问题,请参考以下文章

NoClassDefFoundError 即使 Jar 存在于类路径中

删除 gradle 中的传递类路径依赖项

如何在 Spring Boot 中选择性地升级依赖项? (示例案例:Spring Data)

如何将基于 Spring Boot 构建的依赖项使用到典型的 Spring 应用程序中?

从 Gradle 中的 Spring Boot 中排除 Tomcat 依赖项

如何从 spring-boot-starter-parent 中排除特定依赖项