1 java -jar和-cp的区别
java -cp 指定类运行所依赖其他类的路径,通常是类库,jar包之类。支持通配符
java -cp a.jar;./lib/* pack.mainclass
java -jar 执行该命令时,会用到目录META-INF\MANIFEST.MF文件,在该文件中,有一个叫Main-Class的参数,它说明了java -jar命令执行的类
java -jar myClass.jar
2 如何将resources加入classpath,顺利读取配置文件
- 将./resources目录下面的配置文件加入classpath
- 注意不要在resources后面加*
- Asterix (*) is used to find all JARs not classes.
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()
- jar包内
Java: Load file from classpath in Spring Boot
读取配置文件的一点坑
1 使用java -jar
1.1 使用this.getClassLoader().getResourceAsStream(“application.yaml”)
- IDEA运行
- 可以读取
- 因为找的是在target/classes的同一级目录中,有application.yaml
- jvm的classloader可以找到这个路径
jar包运行(image运行)
IDEA运行
- 找不到
- BaseDir是项目根目录
- 即
~/IdeaProjects/SAP/UnifiedDataService/
- 这个目录下当然找不到配置文件
- jar包运行(image运行)
- 可以找到
- BaseDir是jar包所在位置
- 配置文件正好同级目录
2 使用java -cp, 将resources加入classpath
2.1 使用this.getClassLoader().getResourceAsStream(“application.yaml”)
- IDEA运行
- 可以找到
- jar包运行(image运行)
- 可以找到