是否有更简单的方法来读取* .jar或文件系统?

时间:2016-03-04 20:06:11

标签: java fileinputstream spark-java

我使用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);
}

是否有更清洁/更简单的方式?

2 个答案:

答案 0 :(得分:2)

main创建此类以确定您的java可执行文件是否已定义config.location参数或将查看类路径。

例如。 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;
    }
}

答案 1 :(得分:1)

如果您正在使用带有IntelliJ的Maven,只需将配置属性文件放在模块中的src/main/resources目录中即可。如果您不使用Maven,请将属性文件放在源树的根目录中(在任何包之外 - 例如:src/myapp.dev.properties)。

打包/导出JAR后,可以使用new Object().getClass().getClassLoader().getResourceAsStream("myapp.dev.properties")访问该文件(使用new Object()...,因为在某些情况下/平台中未定义静态ClassLoader。)

IntelliJ / Eclipse环境使用相同的类路径,这意味着不需要加载文件的特殊情况。

如果您需要区分开发和生产属性。您可以使用Maven配置文件进行构建时打包,也可以使用-D开关使用变量加载属性。