为什么来自Maven依赖项的静态内容在spring-boot中提供?

时间:2019-05-23 11:28:50

标签: java maven spring-boot

我有一个简单的多模块Maven项目。第一个模块是有角度的前端,第二个模块是spring-boot应用程序。

我配置了前端Maven模块来构建角度应用程序并将汇编的文件收集到frontend.jar中。结果,我具有以下存档结构:

jar -tf frontend.jar | sort
---------------------------
META-INF/
META-INF/MANIFEST.MF
META-INF/maven/
META-INF/maven/sample-project/
META-INF/maven/sample-project/frontend/
META-INF/maven/sample-project/frontend/pom.properties
META-INF/maven/sample-project/frontend/pom.xml
static/
static/3rdpartylicenses.txt
static/assets/
static/assets/img/
static/assets/img/loading.gif
static/favicon.png
static/index.html
static/main.8e44da4898d2a7a95ed3.js
static/polyfills.d72edd4c76dc8f27444a.js
static/runtime.a66f828dca56eeb90e02.js
static/styles.0afb74a990d73ad0b544.css

在那之后,我在前端模块上添加了spring-boot .pom文件依赖性,并构建了整个项目。

<dependency>
    <groupId>sample-project</groupId>
    <artifactId>frontend</artifactId>
    <version>${version}</version>
</dependency>

最后,我启动Spring Boot Web应用程序后发现,当我转到localhost:port/ url时,我得到了我的角度应用程序。

接下来的问题是:spring-boot如何理解它应该提供frontend依赖关系中的静态内容?请注意,spring-boot模块资源中没有静态文件夹。

1 个答案:

答案 0 :(得分:1)

在Java中,“罐子”只是组织用于部署的应用程序的方式。您不能根据类或资源的实际jar或磁盘上的位置对其进行寻址(除非您正在编写自己的ClassLoader)。这样的物理细节在运行时不可用。从运行时的角度看,一切都变得平坦,有点像docker层。

因此,实际上没有“哪个类来自哪个依赖项”的概念。这有时会导致细微的错误,但这也是诸如jarjar,OSGi和新的Java 9模块之类的技术存在的原因。

通常,Spring Boot提供/ static下classpath中可用的所有内容。没有资源来自“哪个jar”或“哪个目录”的概念。