java - 无法导入类,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
---------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
解决方案
听起来您正在尝试将 Spring Boot 应用程序用作依赖项。一般来说,不建议这样做,因为像 war 文件一样,Spring Boot 应用程序不打算用作依赖项。
Spring Boot 文档说明如下:
如果您的应用程序包含您想与其他项目共享的类,推荐的方法是将该代码移动到单独的模块中。然后,您的应用程序和其他项目可以依赖单独的模块。
如果这不是一个选项,那么您需要配置您的项目以构建应用程序 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 将是未分类的。
推荐阅读
- android - Chrome Android 远程开发工具检查器返回 404
- java - 检测屏幕原因
- c++ - 任务栏扩展(如联系人)
- java - 使用java在第二次出现空间时拆分字符串
- android - 隐藏键盘时,按下返回的 Xamarin Forms 不执行任何操作
- c# - 在 azure 函数的新应用程序域中创建对象的实例会引发 FileNotFoundException
- python - 在networkx图中查找所有具有已定义属性的节点
- html - 成对的有序项目列表
- android - 如何使用 fusedLocation 获得良好的准确性?
- python - 如何从目录打开文件并将文件保存到新目录?