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

这是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

---------美一

---------我的类二

------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 文档显示以下内容:

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

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

如果您无法按照上面的建议重新排列代码,则必须将Spring Boot的Maven和Gradle插件配置为生成适合用作依赖项的单独工件。可执行归档文件不能用作依赖项,因为可执行 jar 格式将应用程序类打包到 BOOT-INF/类中。这意味着当可执行 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'
}

使用任一生成系统,应用程序的可执行胖罐现在都将使用分类器发布。可用作依赖项的普通 jar 将未分类。exec


答案 2

您可以忽略构建弹簧靴专家插件,您将创建一个简单的jar。


推荐