Spring Boot 类路径

Posted

技术标签:

【中文标题】Spring Boot 类路径【英文标题】:Spring Boot classpath 【发布时间】:2016-03-13 15:22:25 【问题描述】:

在Spring Boot's docs here,关于提供静态内容,它说:

默认情况下,Spring Boot 将提供目录中的静态内容 在中称为 /static(或 /public 或 /resources 或 /META-INF/resources) 类路径

我发现目录中的所有内容:

src/main/resources

将被复制到 classpath 中,因此我可以将我的静态内容放入:

src/main/resources/static

一切都会正常工作,我很高兴,因为我可以在src 目录下拥有我的静态内容。

但是,我对此有一些疑问:

    为什么文档没有说将静态内容放在src/main/resources/static 中而不是谈论类路径(我认为这有点令人困惑)? 是否可以假设src/main/resources/ 中的内容将始终复制到类路径中? 是否有一些 Spring Boot 官方文档解释了我应该在类路径中找到除 Java 类和包之外的内容(到目前为止,我只知道我可以找到来自 src/main/resources/ 的所有内容)?

【问题讨论】:

【参考方案1】:

类路径还包含其他库 (JAR),其中也可以有一个 static 文件夹,然后将包含该文件夹以提供静态资源。因此,如果文档只说明文件夹src/main/resources/static,那将是不完整的。

广告 2:只要您不弄乱默认的 Maven 配置,就可以安全地假设这一点。

广告 3:可能从 Oracle 官方文档开始:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html。提示:当然,不仅是类路径中的资源文件夹的内容,当然还有所有已编译的类,因此得名。

【讨论】:

感谢您的回答。在我的第三点中,我的意思是“official docs by Spring Boot”:一些文档解释了在 Spring Boot 应用程序中,src/main/resources 的内容被复制到类路径或类似的东西中。谢谢 这与 Spring Boot 无关,因此您不会在 Spring Boot 文档中找到任何相关内容。它是默认的 Maven(或 Gradle,如果你使用它)功能,它在每个 Maven/Gradle 项目中都可用,而不仅仅是 Spring Boot 应用程序。 谢谢,我不知道/src/main/resources 是一个构建工具的约定,我以为更多的是与Spring Boot 相关的。【参考方案2】:

/src/main/resources 是Maven 项目结构约定。这是您放置资源的项目内部的路径。在构建步骤期间,Maven 将把文件放入那里并将它们放置在适当的位置,以便您在运行时类路径中使用它们,例如在可执行文件.jar 中,类路径中使用的一些物理文件系统位置(java-cp 选项)等。

我可以选择自己构建应用程序或使用其他构建工具。在这种情况下,/src/main/resources 将不存在。但是,目的是使类路径相同,即。包含相同的资源和.class 文件。

Spring 引导文档讨论了类路径,因为它不应该假设您的项目是如何设置的。

【讨论】:

知道/src/main/resources 目录与 Spring Boot 没有严格的关系有点难过,因为现在我必须记住,如果我用另一个构建工具而不是Maven(也许是 Gradle?)如果我将静态内容放在 /src/main/resources.. 中,该项目将无法运行:/ @Andrea 这是一个相当广泛采用的约定。 Gradle supports it, too.

以上是关于Spring Boot 类路径的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 类路径配置文件覆盖外部 application.properties

Spring Boot Test MalformedURLException:未知协议:类路径

Spring boot graphql 在类路径中找不到 graphql 模式文件

Spring Boot 无法访问依赖 jars 类路径中的资源

Spring Boot 从命令行执行将文件添加到类路径

Spring Boot 应用程序无法以类路径启动:[]