打jar包之后读不到properties⽂件
(1)在Spring项⽬中有专门读取properties⽂件的类
代码如下:
import io.support.PropertiesLoaderUtils;
Properties ret = PropertiesLoaderUtils.loadProperties(new ClassPathResource("XXX.properties"));
rs = Property("proname");
(2)在普通项⽬中读取properties⽂件
Properties properties = new Properties();
InputStream in = Class().getClassLoader().getResourceAsStream("/configfilename.properties");
properties.load(in);
String str = Property("name");
遇到的问题是项⽬打成jar包后⽆法读取到jar包内的properties⽂件
发现在eclipse⾥⼀切正常,但打成jar包后就⽆法读取到properties⽂件了。
之前的程序是这样获取配置⽂件的:
Thread.currentThread().getContextClassLoader().getResource("").getPath() +filename+".properties")
来获取properties⽂件,但发现⼀运⾏就报错.后来将代码改成:
⼀切正常~
关于java 的 classloader 还是有点概念不清,需要补补~~
⼀般在项⽬中使⽤properties配置⽂件的时候都将相关的properties⽂件放在src⽬录下,在将该app打包⽣成jar后,相应的properties配置⽂件⽣成在jar包中,这样的话要修改配置⽂件⼜要重新打jar包,那是相当的⿇烦。。properties在哪打开
你肯定想将配置⽂件放在其他的⽬录下例如下⾯的conf⽂件,⽣成的jar包内不包含相应的配置⽂件,修
改配置⽂件⽆需重新打包,没错,下⾯就是⼀种解决⽅案了。
读取jar包内配置⽂件:
InputStream in = Class().getClassLoader().getResourceAsStream("/configfilename.properties");
读取jar包外配置⽂件:
String filePath = Property("user.dir") + "/conf/configfilename.properties";
InputStream in = new BufferedInputStream(new FileInputStream(filePath));
总结:
1. Property("user.dir") 获得项⽬的绝对路径,然后拼装配置⽂件的路径。
关于打包
项⽬右键→Export(JAR file/Runnable JAR file)
(1)直接运⾏ .class的⽅法
    java  -cp .  com.guangfa.demo1
  不⽤加.class后缀 java -cp 和 -classpath ⼀样,是指定类运⾏所依赖其他类的路径,通常是类库和jar包,需要全路径到jar包,多个jar包之间连接符:window上分号“;”.Linux下使⽤“:”。
(2)从eclipse中export 的jar file,仅仅是把.class打包了。
  执⾏这种jar file需要⽤ java -cp .;demo1.jar com.guangfa.demo1
  如果还应⽤到另外的lib库,必须在cp⾥说明,也就是  java -cp .;demo1.jar;lib01.jar;lib02.jar com.guangfa.demo1 来执⾏。demo1.jar也在cp⾥⾯,demo1.jar就是lib库,最后的参数指明了要被执⾏的类名。
(3)如果从eclipse⾥export出的是 runnable jar file,
那么个执⾏这个jar包的时候是不需要指明哪个类的,直接这样执⾏ java -jar demo1.jar。
原因就是jar包中的MANIFEST.MF内容不同。 runnable jar包中指明哪个类先执⾏,所以你可以⽤ java -jar demo1.jar来执⾏你想要执⾏的代码,⽽不必指明具体哪个类。这个你可以打开 jar包查看MANIFEST.MF的区别
⽣成runnable jar file时,有两个选项,Extract required libraries into generated JAR 和 package equired libraries into generated JAR。
前者是把⽤到的.class ⽂件提取出来,后者则是把所需要的所有jar包都打进⼀个包⾥。两者的MANIFEST.MF⽂件内容也有所不同,这应该是eclipse造成的