1 java -jar和-cp的区别

java -cp 指定类运行所依赖其他类的路径,通常是类库,jar包之类。支持通配符

  1. java -cp a.jar;./lib/* pack.mainclass

java -jar 执行该命令时,会用到目录META-INF\MANIFEST.MF文件,在该文件中,有一个叫Main-Class的参数,它说明了java -jar命令执行的类

  1. java -jar myClass.jar

2 如何将resources加入classpath,顺利读取配置文件

  • 将./resources目录下面的配置文件加入classpath
  • 注意不要在resources后面加*
  • Asterix (*) is used to find all JARs not classes.
  1. java -cp "./*;lib/*;./resources" com.myapp.Test

classpath的使用

  • classpath是什么?
  • 可以理解为编译或者打包后,class文件夹所在的位置 ``` 在第1个例子里,classpath:entry/dev/spring-mvc.xml 中, classpath就是指WEB-INF/classes/这个目录的路径。 需要声明的一点是,使用classpath:这种前缀,就只能代表一个文件。

在第2个例子里,classpath:**/mapper/mapping/Mapper.xml, 使用classpath:这种前缀,则可以代表多个匹配的文件; **/mapper/mapping/Mapper.xml,双星号**表示在任意目录下, 也就是说在WEB-INF/classes/下任意层的目录,只要符合后面的文件路径,都会被作为资源文件找到。 ```

3 Spring读取配置文件

如何在spring中读取resource目录下面的配置文件?

  • With Java you can use the classLoader of the current thread and try to load the file
  • But the Spring Framework provides you with much more elegant solution like the ResourceLoader.
  • 注意要区分配置文件是在jar包中还是在jar包外
    • jar包内 resource.getInputStream()
    • jar包外 resource.getFile()

Java: Load file from classpath in Spring Boot

stackoverflow

读取配置文件的一点坑

1 使用java -jar

1.1 使用this.getClassLoader().getResourceAsStream(“application.yaml”)

  • IDEA运行
    • 可以读取
    • 因为找的是在target/classes的同一级目录中,有application.yaml
    • jvm的classloader可以找到这个路径
  • jar包运行(image运行)

    • 不能读取
    • 配置文件没有放在jar包里面
    • 而且是以-jar方式启动,classloader找不到这个文件

      1.2 使用new FileInputStream(“./banner.txt”)

  • IDEA运行

    • 找不到
    • BaseDir是项目根目录
    • ~/IdeaProjects/SAP/UnifiedDataService/
    • 这个目录下当然找不到配置文件
  • jar包运行(image运行)
    • 可以找到
    • BaseDir是jar包所在位置
    • 配置文件正好同级目录

2 使用java -cp, 将resources加入classpath

2.1 使用this.getClassLoader().getResourceAsStream(“application.yaml”)

  • IDEA运行
    • 可以找到
  • jar包运行(image运行)
    • 可以找到

你真的会使用getResource() 吗