【问题标题】:what is the starting path for relative path file imports in springspring 中相对路径文件导入的起始路径是什么
【发布时间】:2017-01-10 15:51:19
【问题描述】:

我正在尝试从 jar 文件外部导入 spring config.xml。有一个注解配置类可以导入到配置中

@Configuration
@ImportResource("file:config.xml")
public class SpringConfig {
   ...
}

来自 spring 的日志消息表明它找不到 config.xml。但他们没有说搜索此 config.xml 的路径是什么。

Caused by: java.io.FileNotFoundException: config.xml (The system cannot find the file specified)

在开发环境中

src\main\java\
|__com.packagewithclasses
|__config.xml
|__log4j.xml

在现场环境中

folder_holding_jars_and_configs
|__executable_jar_file.jar
|__config.xml
|__log4j.xml

我已经尝试过文档、谷歌、一些通配符、日志等。没有运气。 jar文件外配置相对路径的spring的起始路径是什么?

【问题讨论】:

  • 您几乎不应该使用文件:对于资源,所有资源都应该从类路径加载。这确保它可以在每台开发人员机器上运行,并且在从 maven/gradle 构建时。

标签: java spring configuration relative-path


【解决方案1】:

如果文件在 jar 之外,您必须提供文件的绝对路径。

例如

@Configuration
@ImportResource("file:/opt/proj/config.xml")
public class SpringConfig {
   ...
}

编辑:

除此之外,您还可以将 XML 文件的相对路径放在 MANIFEST.MF 文件中。由于您的 jar 和 XML 在同一目录中,您可以将以下行放入 MANIFEST.MF

Class-Path: .

MANIFEST.MF 要求文件末尾有一个空行。

现在你可以像下面这样使用xml文件了。

@Configuration
@ImportResource("file:/config.xml")
public class SpringConfig {
   ...
}

对于 maven 项目,MENIFEST.MF 的位置是 `src/main/resources/META-INF/MANIFEST.MF'。

【讨论】:

  • 这不可能。这需要将绝对路径烘焙到 jar 文件中。将该 jar 文件移动到另一个环境会破坏它,因为在另一个环境中绝对路径可能不同。如何制作可移植的、无需重新编译的用户提供的配置?
  • 你是对的,这就是为什么你必须在每个环境中创建相同路径的文件
  • 它必须先在某处查找文件,然后才能确定找不到它?对吗?
  • 您可以考虑使用属性占位符 ${path.file} 并将该属性提供为 JVM 属性 -Dpath.file="absolute path"
  • 我已经更新了我的答案,这可能符合你的标准。
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2023-04-03
  • 2015-09-25
  • 1970-01-01
  • 2010-12-08
  • 2011-12-15
相关资源
最近更新 更多