2016-03-04 39 views
0

我使用Sparkjava开发了一个简单的应用程序。我使用Intellij,当我运行测试或在本地运行应用程序时,所有资源都是文件。有没有更简单的方法来读取* .jar或文件系统?

但是,当我部署时,整个事情作为一个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); 
} 

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

+0

对我来说很好。 –

+5

为什么不总是从类路径加载资源(即使用ClassLoader.getResourceAsStream()),而不是使用文件IO?资源是否位于类路径中的目录中,或位于类路径中的jar中对您的代码没有影响。 –

+0

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29 –

回答

1

如果你正在使用Maven的IntelliJ用,只是把配置属性模块中的src/main/resources目录内的文件。如果您没有使用Maven,那么将属性文件放在源代码树的根目录中(在任何包之外 - 例如:src/myapp.dev.properties)。

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

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

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

+0

使用maven为特定环境构建特定的Jars不是一个好主意。世界很久以前就已经开始了。当您外化您的配置并让您的代码对其作出反应时,持续部署,DevOps和Container部署效果最佳。 –

+0

该问题未指定应用程序的类型。它可能是桌面应用程序,不要忘记,这是一种很常见的应用程序类型,其中不存在DevOps,容器和新时代部署概念。第二件要注意的是实际问题,在IntelliJ运行测试时加载相同的配置,并作为独立的JAR文件加载。最后,答案显然建议用-D选项覆盖属性文件。 – sahel

+0

DevOps适用于所有应用程序类型,包括桌面。关于持续部署没有新东西。这个问题是关于一个Web服务器。使用Maven构建不同的Jars(桌面或其他)没有错,但可能导致问题。为包括IntelliJ在内的所有部署构建单个Jar是一个更好的选择,因为它简化了代码库。 –

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; 
    } 
} 
相关问题