启动应用程序之前,如何在项目中创建目录?

时间:2019-12-27 08:19:43

标签: java spring gradle

我正在用tomcat和gradle创建Spring MVC应用程序,用户可以在其中从前端上传一些文件,然后可以进行更改。 我想将该文件上传到项目目录(scr / tmp / env)。如果我手动创建目录,它可以工作,但是我不能将空包推送到git中。这意味着当有人将我的项目下载到另一台计算机上时,他将在项目内没有这些目录。 例如,我可以使用 public static void 方法和以下代码创建一些类:

File file = new File("src/tmp/dbEnv/");
if (!file.exists()) {
  Files.createDirectories(Paths.get("src/tmp/dbEnv/"));
}

它将创建目录。但是,如果我将此代码粘贴到spring方法中(例如,在控制器或dao类中),则不会创建目录。

能否给我一些建议,如何在启动之前在项目中创建目录,并在完成应用程序之前清除它们?可能是Spring或Gradle可以做到吗?谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用应用程序侦听器来利用应用程序启动和拆卸事件,如下所示:

@Configuration
public class TempDirConfig {

  private static final Path TEMP_PATH = Paths.get( "/tmp/dbEnv" );

  @Bean( "createTempDir" )
  public ApplicationListener<ContextStartedEvent> createTempDir() {
    return event -> {
      try {
        if ( !Files.exists( TEMP_PATH ) ) {
          Files.createDirectories( TEMP_PATH );
        }
      }
      catch ( IOException aE ) {
        // oops
      }
    };
  }

  @Bean( "removeTempDir" )
  public ApplicationListener<ContextClosedEvent> removeTempDir() {
    return event -> {
      try {
        if ( Files.exists( TEMP_PATH ) ) {
          FileSystemUtils.deleteRecursively( TEMP_PATH );
        }
      }
      catch ( IOException aE ) {
        // oops
      }
    };
  }
}

答案 1 :(得分:0)

  

我无法将空包推送到git

在这种情况下,我们向该目录添加.gitkeep(类似于.gitignore)。目录不再为空,但是.将该文件隐藏了。

  

File file = new File("src/tmp/dbEnv/");

我想这会在其他地方创建文件,请尝试these getResource()-methods之一。

  

也许是Spring或Gradle可以做到吗?

格雷迪也是我的第一个念头。在启动时创建目录。但是Spring和Gradle都不会(可靠地)检测到应用程序的关闭状态...您可以在.gitkeep上添加任何内容(但如果使用了.gitignore,则只是为了防止...提交。和/或您可以在应用程序启动期间清除目录(例如,在您提到的主方法中)。

答案 2 :(得分:0)

URL路径= ClassName.class.getClass()。getProtectionDomain()。getCodeSource()。getLocation();

// URL路径= this.getClass()。getProtectionDomain()。getCodeSource()。getLocation();

String libpath = path.toString()。substring(0,path.toString()。indexOf(“ env /”));

// Libpath将使用scr / tmp /

返回绝对路径

答案 3 :(得分:0)

我的解决方案:

public class StartAppFilesProcessorListener implements ApplicationListener<ContextRefreshedEvent> {

  private static final String PATH = System.getProperty("user.dir") + "/src/tmp/dbEnv";

  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    File file = new File(PATH);
    if (!file.exists()) {
      try {
        Files.createDirectories(Paths.get(PATH));
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}