从JAR目录中读取属性文件

我正在创建一个可执行的JAR,它将在运行时从一个文件中读取一组属性。 目录结构将类似于:

/some/dirs/executable.jar /some/dirs/executable.properties 

有没有办法在executable.jar文件中设置属性加载器类来从jar所在的目录加载属性,而不是硬编码目录。

我不想将属性放在jar本身,因为属性文件需要是可配置的。

为什么不直接将属性文件作为参数传递给main方法? 这样你可以加载属性,如下所示:

 public static void main(String[] args) throws IOException { Properties props = new Properties(); props.load(new BufferedReader(new FileReader(args[0]))); System.setProperties(props); } 

另一种方法:如果你想得到jar文件的当前目录,你需要做一些令人讨厌的事情:

 CodeSource codeSource = MyClass.class.getProtectionDomain().getCodeSource(); File jarFile = new File(codeSource.getLocation().toURI().getPath()); File jarDir = jarFile.getParentFile(); if (jarDir != null && jarDir.isDirectory()) { File propFile = new File(jarDir, "myFile.properties"); } 

…其中MyClass是jar文件中的一个类。 这不是我推荐的东西 – 如果你的应用程序在不同的jar文件(不同目录中的每个jar)的类路径上有多个MyClass实例怎么办? 即你永远无法保证从你认为的jar子里装载MyClass

 public static void loadJarCongFile(Class Utilclass ) { try{ String path= Utilclass.getResource("").getPath(); path=path.substring(6,path.length()-1); path=path.split("!")[0]; System.out.println(path); JarFile jarFile = new JarFile(path); final Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { final JarEntry entry = entries.nextElement(); if (entry.getName().contains(".properties")) { System.out.println("Jar File Property File: " + entry.getName()); JarEntry fileEntry = jarFile.getJarEntry(entry.getName()); InputStream input = jarFile.getInputStream(fileEntry); setSystemvariable(input); InputStreamReader isr = new InputStreamReader(input); BufferedReader reader = new BufferedReader(isr); String line; while ((line = reader.readLine()) != null) { System.out.println("Jar file"+line); } reader.close(); } } } catch (Exception e) { System.out.println("Jar file reading Error"); } } public static void setSystemvariable(InputStream input) { Properties tmp1 = new Properties(); try { tmp1.load(input); for (Object element : tmp1.keySet()) { System.setProperty(element.toString().trim(), tmp1.getProperty(element.toString().trim()).trim()); } } catch (IOException e) { System.out.println("setSystemvariable method failure"); } }