Spring Boot类路径

40

这里的Spring Boot文档中,关于服务静态内容,它说:

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

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

src/main/resources

将被复制到类路径(classpath)内,因此我可以将我的静态内容放在其中:

src/main/resources/static

一切都将正常工作,我很高兴因为我可以让我的静态内容位于src目录下。

但是,我有几个问题:

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

49

/src/main/resources 是一个Maven项目结构约定。它是您项目中放置资源的路径。在构建过程中,Maven会将其中的文件放置在适当的位置供您在运行时类路径中使用,例如在可执行的.jar中,一些物理文件系统位置(使用java-cp选项)等。

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

Spring Boot文档讨论类路径,因为它不应该假设您的项目设置方式。


1
有点遗憾的是,目录 /src/main/resources 并不严格与 Spring Boot 相关,因为现在我必须记住,如果我使用除 Maven 之外的其他构建工具(比如 Gradle)启动 Spring Boot 项目,并将静态内容放在 /src/main/resources 中,则该项目可能无法正常工作.. :/ - Andrea
2
@Andrea 这是一个被广泛采用的惯例。Gradle 也支持它。 - Sotirios Delimanolis

7
类路径还包含其他库(JAR),这些库也可以有一个static文件夹,该文件夹将包括用于提供静态资源的内容。因此,如果文档仅说明文件夹src/main/resources/static,那么它是不完整的。
注意事项2:只要您不更改默认的Maven配置,那么就可以安全地认为它是正确的。
注意事项3:也许可以从官方Oracle文档开始:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html。提示:当然,类路径中不仅包含资源文件夹的内容,而且还包含所有已编译的类,因此得名。

感谢您的回答。在我的第三点中,我指的是“Spring Boot官方文档”:一些文档解释了在Spring Boot应用程序中,src/main/resources中的内容会被复制到类路径中或类似的操作。谢谢。 - Andrea
这与Spring Boot无关,因此在Spring Boot文档中找不到任何相关内容。这是默认的Maven(或Gradle,如果您使用它),并且在每个Maven / Gradle项目中都可用,而不仅仅是Spring Boot应用程序。 - dunni
1
谢谢,我不知道/src/main/resources是构建工具的惯例,我以为它更与Spring Boot相关。 - Andrea

0
补充之前的回答,Spring Boot Maven Plugin(在pom.xml中为spring-boot-maven-plugin)使您能够使用Maven运行应用程序。它的一个功能是确保应用程序中包括依赖库在内的内容在运行时类路径上可用,例如在可执行JAR文件中。

1
你好,Andrew,欢迎来到SO!这是一些很棒的内容,但可能更适合作为评论。请参阅https://stackoverflow.com/help/how-to-answer。 - Sanzio Angeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接