我有一个Java项目,它导入了我编写的模块。 Java项目称为cg-lambda
,模块称为cg-core
。 cg-core
被作为依赖项导入cg-lambda
中,例如
dependencies {
...
compile 'com.cg:cg-core'
...
}
我在cg-core
中有一个名为ApiConfiguration
的类,该类可加载并解析yaml文件。
package com.cg.config.guice;
public class ApiConfiguration {
public static ApiConfiguration fromLocation() {
try {
String configurationLocation = "src/main/resources/configuration/env_local.yml";
final String absoluteFile = new File(configurationLocation).getAbsolutePath();
....
} catch (Exception e) {
}
}
....
}
yaml文件位于/Users/mark/repos/server-side/cg-core/src/main/resources/configuration/
我从ApiConfiguration.fromLocation()
中的班级叫cg-lambda
:
import com.cg.config.guice.ApiConfiguration;
public class OrderHandler {
public OrderHandler() {
final ApiConfiguration apiConfiguration =
ApiConfiguration.fromLocation();
....
....
调试时,我看到absoluteFile
是/Users/mark/repos/server-side/cg-lambda/src/main/resources/configuration/env_local.yml
即即使ApiConfiguration位于cg-lambda
中,路径也指向cg-core
,而不是cg-core
。有可能获得正确的路径吗?
答案 0 :(得分:0)
这就像路径命名一样,所以我猜src / main / resources被视为资源目录,因此可以假定这被视为类路径资源,因此只需使用OrderHandler.class.getClassLoader()。 getResourceAsStream(“ configuration / env_local.yml”);事实是,这是一个InputStream,因此您需要为ApiConfiguration使用其他构造函数。但是您仍然无法获取路径,而只是加载资源。并尝试这样做,因为当您将此配置打包到JAR / WAR中时,将无法使用path对其进行访问。
答案 1 :(得分:0)
由于资源将打包在cg-core模块中,并且当您的应用运行时,您提供的路径将不存在。
正确的方法是加载文件并获取绝对路径。
String configurationLocation = "configuration/env_local.yml";
final String absoluteFile = new File(ApiConfiguration.class.getClassLoader().getResource(configurationFileLocation).getFile()).getAbsolutePath();