java - Spring,在应用程序启动期间复制文件

标签 java spring

我有一个 Spring Web 应用程序,我需要在应用程序启动时将一个文件的内容复制到另一个文件。

@Component
public class BootStartUp implements ApplicationListener<ContextRefreshedEvent> {

@Override
public void onApplicationEvent(final ContextRefreshedEvent event) {

  File sourceFile = new File(getClass().getClassLoader()
  .getResource("app_dev.json").getFile()); // Present in src/main/resources folder

  // Getting null pointer exception here
  File destFile = new File(getClass().getClassLoader()
  .getResource("AppConfig.json").getFile());  // Present in src/main/webapp folder
}

所以基本上我正在尝试将一些属性从作为资源的文件复制到 webapp 文件夹中的文件中,当应用程序加载时,UI 文件将使用该文件。

最佳答案

src/main/* 通常只存在于源代码中,而不是在运行时。

Spring 是一个仅运行时的框架,因此当它加载时,工件(在本例中为 WAR)已经构建并打包,因此依赖 src/main/* 东西

WAR 有一个明确定义的布局,所以首先,我建议考虑“WAR”布局并检查路径。只需使用任何可以读取 ZIP 存档(如 WinRAR)的工具打开准备好的 WAR 并进行探索即可。

如果您从 IDE 运行这些内容,在某些情况下,src/main/resources 文件夹甚至可能存在并且可以从类路径访问,但实际上(真正的生产部署)它不会在那里。

我想在这里强调的另一点是,一旦 WAR 被打包和部署,它可能应该被视为只读工件,这意味着在运行时在 WAR 内部复制文件可能不是一个好主意。

通常,Web 容器(Tomcat、Jetty 等)将 WAR 解压到某种临时目录中并从那里加载,并且您永远不会知道该目录的路径,它在运行时总是会发生变化。

因此,假设 UI 文件只是应用程序的一部分,并且有一些配置属性需要解决,则有不同的方法:

  1. 在服务器上创建一些动态端点(例如 Servlet),根据请求将动态返回所需的配置,然后浏览器将调用 servlet 并获取结果。在这种方法中(就像您的方法一样,您创建的工件仍然取决于您运行的环境,而该环境不太好)

  2. 将配置属性保留在外部(在文件系统中,甚至对于更高级的情况,使用一些配置服务器,如 Consul 等、spring-cloud-config 等)并保持 WAR 环境独立。这是对第一种方法的补充,但消除了对环境的依赖

关于java - Spring,在应用程序启动期间复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51490344/

相关文章:

java - 在 spring 属性文件中使用环境变量

javascript - 将 Spring 模型变量从 JSP 模板传递到 javascript

java - Spring JPA异常翻译

java - “堆栈”未声明的错误。 Java 到 C

java - 优化段落中查找单词

java - 是否可以从 Java 访问 Windows ESE?

Spring Boot API 如何验证请求 header 中发送的 NONCE 值以避免重放攻击

java - 消费者模拟方法

java - 如何停止android中默认出现软键盘

java - 尝试在 JBoss EAP 6.3 上部署 spring ws + saaj webapp 时出现 ClassNotFoundException