【问题标题】:access folder in spring boot in classpath在类路径中的spring boot中访问文件夹
【发布时间】:2021-03-12 22:50:06
【问题描述】:

我正在尝试访问在 Spring Boot 应用程序的类路径中创建的文件夹。一个sn-p的代码如下:

ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
URL url = classLoader.getResource("converters");
LOGGER.debug("**************** url: " + url);
File file = new File(url.toURI());
        
Path path = Paths.get(file.getAbsolutePath());
Arrays.stream(path.toFile().listFiles()).forEach(f -> LOGGER.debug("*******files: " + f.getName()));
if (!path.toFile().isDirectory()) {
   throw new IllegalArgumentException(ErrorCode.INVALID_MAPPERS_DIRECTORY.formatMessage(path));
}

上面的代码在 Intellij 中运行时没有任何问题,我得到的 url 如下:

file:/C:/Users/user1/projects/my-service/test/build/resources/main/converters

当我在应用程序 rpm 中的 Linux 上运行它时,我得到以下 url 值:

jar:file:/opt/home/libexec/my-service-2.0.0-SNAPSHOT.jar!/BOOT-INF/lib/my-service-api-2.0.0-SNAPSHOT.jar!/converters

为什么会有不同的行为?

【问题讨论】:

  • 您不能假设类路径包含文件夹或Files,句号。你必须使用另一种策略;这取决于手头的具体任务。

标签: java spring spring-boot


【解决方案1】:

问题

我需要能够引用用户可能在我的 Spring Boot 应用程序的类路径中创建的文件夹。

解决方案

以下内容对我有用:

mapperFilesFolder = resolver.getResources("classpath*:" + mappersLocation + "/.");
Path path = Paths.get(mappersFolder[0].getURI());

【讨论】:

  • 为什么需要将类路径包含在这个逻辑中?在我看来,当您在文件系统上有一个目录时,用户可以在其中对文件进行操作和操作,并且应用程序可以从中读取......您就完成了。
  • @Gimby,我们需要能够观察用户对文件所做的任何更改,如果发生此类更改,我们需要在不启动应用程序的情况下进行验证和重新加载。用户可以为文件指定任何位置,但如果未指定,则默认为存在于类路径中的文件夹。
【解决方案2】:

区别在于包装。 您的 IDE 不会打包您的应用程序来运行它,它只是使用文件系统,因为这样更快。 当您打包您的应用程序并部署您的 ide 可以从文件系统访问的所有资源时,现在都打包在您的 spring boot fat jar 文件中。在您的情况下,该文件位于 my-service-api-2.0.0-SNAPSHOT.jar 内,该 my-service-api-2.0.0-SNAPSHOT.jar 封装在您的胖罐中。

【讨论】:

  • 谢谢@Hopey One,回答是有道理的,但是有没有办法可以引用文件系统上类路径中的文件夹或目录?
猜你喜欢
  • 2017-08-07
  • 2018-05-28
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
相关资源
最近更新 更多