我正在尝试将 Spring/Maven 应用程序迁移到 Spring Boot。它使用 Maven 插件生成一些 JavaScript(在我的例子中 handlebars-maven-plugin )。
该插件本质上生成应包含在部署工件中的生成的 JavaScript 代码。然而,这个“生成的代码”本身并不是源代码的一部分。在旧式 Maven Web 应用程序中,此内容是在 target 目录中创建的,作为 Web 应用程序文件夹的一部分。
我可以想象其他类似的情况,其中源代码的某些部分作为构建的一部分进行处理,而该过程的结果文件不成为源代码本身的一部分(缩小,聚合、混淆、SASS、Less等)。
我读到,在 Spring Boot 中,静态内容应该存储在类路径中的某个位置,/META-INF/resources/、/resources/、>/static/,/public/。但是生成的内容应该输出到哪里呢?
我可以将插件的输出目录更改为“/target/classes/static”,但是在运行mvn spring-boot:run时我无法找到生成的内容。我认为“mvn spring-boot:run”正在从“src”而不是“target”读取源代码。
在 Spring Boot 中应如何处理生成的 JavaScript/CSS?
最佳答案
我确定我生成的 JavaScript/CSS 文件不应写入 src 目录。生成的内容仅属于 target 目录 - 即使生成的代码包含在分发工件(war/jar 文件)中。
我的困惑是由于两个问题造成的。
“mvn spring-boot:run”行为
我的应用程序构建了一个 war 文件,因为我当前需要将其安装在远程 Tomcat 服务器上。 The behaviour of "mvn spring-boot:run" is different for jar and war packaging.据我所知,如果您有一个 war 包“mvn spring-boot:run” 将尝试从 src/main/webapp 提供 Web 内容 目录。我生成的内容不属于 src 目录 - 因此我需要从 target 目录中获取它。
对 Spring Boot 如何提供静态内容的困惑
I read that Spring Boot automatically serves up content from several classpath locations ; /META-INF/resources/、/resources/、/static/、/public/。 p>
即使我更新了生成的 JavaScript 插件输出路径以定位类路径位置,我最初也无法找到它。
我确定WebMvcAutoConfiguration包含负责添加静态内容路径的代码,并且如果您的配置扩展WebMvcConfigurerAdapter,则会触发WebMvcAutoConfiguration。
但是,I've seen comments to suggest如果您使用@EnableWebMvc,那么这会有效地禁用这些默认静态内容位置(我会重视这方面的权威引用 - 我现在发现这个请参阅下面的更新)。 p>
我使用了@EnableWebMvc,所以为了解决这个问题,我扩展了WebMvcConfigurerAdapter来显式定义静态位置以包含我输出生成内容的类路径文件夹。
我敢说,当我现在扩展WebMvcConfigurerAdapter时,我可能不再需要使用@EnableWebMvc,但我对此还没有100%确定。
现在我已经显式配置了要定位的生成内容(通过覆盖 WebMvcConfigurerAdapter 的 addResourceHandlers 方法),我现在可以在使用“ mvn spring-boot:run".
问题已解决 - 如果没有完全理解!
更新
我找到了 Spring Boot 文档中与使用 @EnableWebMvc 时禁用默认静态内容位置的原因相关的部分,它说:
The easiest way to take complete control over MVC configuration is to provide your own @Configuration with the @EnableWebMvc annotation. This will leave all MVC configuration in your hands.
它来自标题为“Switch off the Default MVC configuration”的部分。
关于java - Spring Boot 和生成的 JavaScript/CSS 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43116760/