无法导入类,IntelliJ 显示 BOOT-INF 前缀,似乎是相关的

Posted

技术标签:

【中文标题】无法导入类,IntelliJ 显示 BOOT-INF 前缀,似乎是相关的【英文标题】:Can't import classes, IntelliJ showing BOOT-INF prefix and it seems to be related 【发布时间】:2019-05-09 19:12:29 【问题描述】:

这是使用 Java 和 Maven - 我正在尝试从项目中导入一些类,这些类可以在我的机器上构建到本地 mvn 存储库,或者我可以从公司的外部 mvn 存储库下载它,该存储库已经是一个打包的 jar。在查看“外部库”并扩展相关库时,在左侧“项目”窗格中查看 IntelliJ 时,我确实注意到相关 jar 下的所有类都有一个“BOOT-INF.classes”前缀。如果有帮助,它也是一个 springboot 项目,尽管我可以从外部存储库导入所有 springboot 类和所有其他类。

(“外部库”下左窗格中的 IntelliJ 项目视图内部)

Maven:org.springframework.boot:spring-boot-starter-test:2.0.0.RELEASE

Maven:com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.1

---jackson-core-2.8.1.jar

------com.faster.xml.jackson.core

------com.faster.xml.jackson.core.async

........(列出更多包)

Maven:com.mycompany.my.project:component-two-1.0.0-SNAPSHOT

Maven:com.mycompany.my.project:component-three-1.0.0-SNAPSHOT

---com.mycompany.my.project:component-1.0.0-20181201.jar

------BOOT-INF.classes

------BOOT-INF.classes.com.mycompany.project.my.package.one

---------MyClassOne

---------MyClassTwo

------BOOT-INF.classes.com.mycompany.project.my.package.one

------BOOT-INF.classes.com.mycompany.project.my.package.one.alpha

------BOOT-INF.classes.com.mycompany.project.my.package.one.bravo

【问题讨论】:

【参考方案1】:

听起来您正在尝试使用 Spring Boot 应用程序作为依赖项。一般来说,不建议这样做,因为像 war 文件一样,Spring Boot 应用程序不打算用作依赖项。

Spring Boot documentation 表示如下:

如果您的应用程序包含您想与其他项目共享的类,推荐的方法是将该代码移动到一个单独的模块中。然后,您的应用程序和其他项目可以依赖单独的模块。

如果这不是一个选项,那么您需要配置您的项目以构建应用程序 jar 和一个适合用作依赖项的 jar。从文档的同一部分:

如果您无法按照上述建议重新排列代码,则必须将 Spring Boot 的 Maven 和 Gradle 插件配置为生成适合用作依赖项的单独工件。可执行存档不能用作依赖项,因为可执行 jar 格式将应用程序类打包在 BOOT-INF/classes 中。这意味着当可执行 jar 用作依赖项时,它们将无法找到。

要生成两个工件,一个可以用作依赖项,另一个是可执行的,必须指定一个分类器。此分类器应用于可执行存档的名称,将默认存档用作依赖项。

您使用的是 Maven,因此适当的配置如下所示:

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

如果您使用的是 Gradle,则适当的配置如下所示:

jar 
    enabled = true


bootJar 
    classifier = 'exec'

使用任一构建系统,您的应用程序的可执行 fat jar 现在将使用 exec 分类器发布。可以用作依赖的普通jar将是未分类的。

【讨论】:

gradle 配置是什么样的? @Chris94 我已经用等效的 Gradle 配置更新了答案【参考方案2】:

您可以忽略构建 spring boot maven 插件,您将创建一个简单的 jar。

【讨论】:

以上是关于无法导入类,IntelliJ 显示 BOOT-INF 前缀,似乎是相关的的主要内容,如果未能解决你的问题,请参考以下文章

无法让 IntelliJ 识别 proto 编译的 Java 类文件

IntelliJ IDEA导入Maven之后强制刷新项目解决无法识别为Maven项目的问题

IntelliJ 无法解析 Activator-Play build.sbt libraryDependencies

Intellij 无法导入 SBT 项目

无法处理配置类的导入候选

Intellij IDEA通过Plugins导入vue.js