有没有更简单的方法来读取 *.jar 或文件系统?
Is there a simpler way to read off *.jar or filesystem?
我使用 Sparkjava 开发了一个简单的应用程序。我正在使用 Intellij,当我 运行 我的测试,或 运行 本地应用程序时,我所有的资源都是文件。
但是,当我部署时,整个东西 运行 都是一个 jar 文件。因此,我需要一种方法来从文件系统或 jar 中读取我的资源,具体取决于应用程序的启动方式。下面的代码完成了工作,但看起来很笨拙:
String startedOffFile = new java.io.File(Main.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath())
.getName();
InputStream inputStream;
if(startedOffFile.endsWith(".jar")) {
ClassLoader cl = PropertiesParser.class.getClassLoader();
inputStream = cl.getResourceAsStream("myapp.dev.properties");
} else {
inputStream = new FileInputStream(filename);
}
有cleaner/simpler方法吗?
让您的 main
创建此 class 以确定您的 java
可执行文件是否定义了 config.location 参数或将查找 class 路径。
例如。 java -Dconfig.location=/here/myapp.dev.properties -jar youapp.jar
public class ApplicationProperties {
public ApplicationProperties() throws IOException {
final Properties properties = new Properties();
String location = getProperty("config.location")
if(location != null) {
properties.load(new FileInputStream(getProperty("config.location", ENV_PROPERTIES_PATH)));
} else {
properties.load(Classname.class.getClassLoader().getResourceAsStream("myapp.dev.properties"));
}
}
public Properties getProperties() {
return properties;
}
}
如果您将 Maven 与 IntelliJ 一起使用,只需将配置属性文件放在模块的 src/main/resources
目录中。如果您不使用 Maven,则将属性文件放在源代码树的根目录中(在任何包之外 - 如:src/myapp.dev.properties
)。
在 JAR 的 packaging/exporting 之后,可以使用 new Object().getClass().getClassLoader().getResourceAsStream("myapp.dev.properties")
访问文件(使用 new Object()...
,因为在某些 cases/platforms 中未定义静态类加载器) .
IntelliJ/Eclipse环境使用相同的类路径,这意味着加载文件不需要特殊情况。
如果您需要区分开发属性和生产属性。您可以使用 Maven 配置文件进行构建时打包,或者您可以使用 -D 开关加载带有变量的属性。
我使用 Sparkjava 开发了一个简单的应用程序。我正在使用 Intellij,当我 运行 我的测试,或 运行 本地应用程序时,我所有的资源都是文件。
但是,当我部署时,整个东西 运行 都是一个 jar 文件。因此,我需要一种方法来从文件系统或 jar 中读取我的资源,具体取决于应用程序的启动方式。下面的代码完成了工作,但看起来很笨拙:
String startedOffFile = new java.io.File(Main.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath())
.getName();
InputStream inputStream;
if(startedOffFile.endsWith(".jar")) {
ClassLoader cl = PropertiesParser.class.getClassLoader();
inputStream = cl.getResourceAsStream("myapp.dev.properties");
} else {
inputStream = new FileInputStream(filename);
}
有cleaner/simpler方法吗?
让您的 main
创建此 class 以确定您的 java
可执行文件是否定义了 config.location 参数或将查找 class 路径。
例如。 java -Dconfig.location=/here/myapp.dev.properties -jar youapp.jar
public class ApplicationProperties {
public ApplicationProperties() throws IOException {
final Properties properties = new Properties();
String location = getProperty("config.location")
if(location != null) {
properties.load(new FileInputStream(getProperty("config.location", ENV_PROPERTIES_PATH)));
} else {
properties.load(Classname.class.getClassLoader().getResourceAsStream("myapp.dev.properties"));
}
}
public Properties getProperties() {
return properties;
}
}
如果您将 Maven 与 IntelliJ 一起使用,只需将配置属性文件放在模块的 src/main/resources
目录中。如果您不使用 Maven,则将属性文件放在源代码树的根目录中(在任何包之外 - 如:src/myapp.dev.properties
)。
在 JAR 的 packaging/exporting 之后,可以使用 new Object().getClass().getClassLoader().getResourceAsStream("myapp.dev.properties")
访问文件(使用 new Object()...
,因为在某些 cases/platforms 中未定义静态类加载器) .
IntelliJ/Eclipse环境使用相同的类路径,这意味着加载文件不需要特殊情况。
如果您需要区分开发属性和生产属性。您可以使用 Maven 配置文件进行构建时打包,或者您可以使用 -D 开关加载带有变量的属性。