当通过java -jar或者命令行mvn spring-boot:run的方式启动springboot项目时,会引导执行如下代码:

public static void main(String[] args) throws Exception {new JarLauncher().launch(args);
}

调用JarLauncher不带参数的构造方法创建JarLauncher对象,根据Java的继承特性会调用父类中的createArchive方法,官方代码实现如下:

protected final Archive createArchive() throws Exception {ProtectionDomain protectionDomain = getClass().getProtectionDomain();CodeSource codeSource = protectionDomain.getCodeSource();URI location = (codeSource != null) ? codeSource.getLocation().toURI() : null;String path = (location != null) ? location.getSchemeSpecificPart() : null;if (path == null) {throw new IllegalStateException("Unable to determine code source archive");}File root = new File(path);if (!root.exists()) {throw new IllegalStateException("Unable to determine code source archive from " + root);}return (root.isDirectory() ? new ExplodedArchive(root) : new JarFileArchive(root));
}

整个方法实现思路较为简单,即获取当前类所在的某个路径(后面讲解)下是否存在某个文件,然后根据是文件还是文件夹构建不同对象。那么这个路径是什么呢?于是把代码做了简单处理打印path,做了如下四个测试,得出以下现象:

  1. 把代码放置到测试类中执行时,输出:/D:/SoftDevelop/idea_workspace/first-app-by-gui/target/test-classes/
  2. 把代码放置到springboot启动类时,输出:/D:/SoftDevelop/idea_workspace/first-app-by-gui/target/classes/
  3. 打包成jar包,通过地址栏访问/sayPath时,输出:file:/C:/Users/Administrator/Desktop/first-app-by-gui-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/
  4. 打包成jar包,作为第三方依赖包时,输出:file:/C:/Users/Administrator/Desktop/first-app-by-gui-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/first-app-by-gui-0.0.2-SNAPSHOT.jar!/

综上所述,可以得出getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getSchemeSpecificPart()返回的内容为当前类所在的根路径,这里的根路径需要根据上述几种情况结合实际分析!

以上,完了!!

getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getSchemeSpecificPart()返回内容解析相关推荐

  1. selenium 获取请求返回内容的解决方案

    selenium 获取请求返回内容的解决方案 参考文章: (1)selenium 获取请求返回内容的解决方案 (2)https://www.cnblogs.com/zgq123456/articles ...

  2. ajax请求成功之后,自动打开一个空白页面,并打印出了返回内容

    一.问题描述 ajax请求成功之后,自动打开一个空白页面,并打印出了返回内容,返回值是规定的success内容:{code: "200", msg: "请求成功" ...

  3. Spring mvc 注解@ResponseBody 返回内容编码问题

    @ResponseBody 在@Controller 类方法中能够让字符串直接返回内容. 其返回处理的类是org.springframework.http.converter.StringHttpMe ...

  4. apirestful php自动测试,PHP实现自动识别Restful API的返回内容类型

    如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json.xml.html.serialize.csv.php等数据? 其实这也不难,因为Rest API也是基于http协议的 ...

  5. HTTP返回内容前面出现一个多出来的数字 Transfer-Encoding: chunked

    我们用测试工具例如postman测试post或者get返回内容是很正常的.但是从编程调试可以看到变量的内容是这样的: postman: HTTP/1.1 200 OK Date: Fri, 09 Se ...

  6. 【JS逆向】某篮球网站返回内容解密

    前言 本文章内容仅仅提供学习与交流,严禁用于商业和非法用途,如侵权请联系删除!!! 一.目标 目标网址:aHR0cHM6Ly93d3cuY2JhbGVhZ3VlLmNvbS9kYXRhLyMvbGVh ...

  7. Qt之QProcess 连续执行多条指令并获取指令返回内容

    简述 system可以连续执行多条指令,只需要使用分号":"分开指令就行,但是system只能返回int类型结果,得不到想要的指令返回内容,且还会阻塞主线程(除非在命令后面加上 & ...

  8. winform-弹窗界面使用DIALOGRESULT判断结果并返回内容,而不使用回调方法,解决主窗体获取不到焦点问题

    确认后,不使用回调返回内容,因为这样的话,对话会影响很多功能问题,比如,获取焦点等,在窗体还没有释放之前,这些方式都无效 private void ConfirmSelectCell(Object i ...

  9. 路漫漫其修远矣 - 关于内容解析 与 存储

    用scrapy框架后,很多访问问题解决了,css解析也非常方便,于是要将之前关注的一个网站爬下来放到mysql里面,然后用tableau接上,这样就可以长期自动监测了.但过程非常坎坷,一直到现在也没有 ...

最新文章

  1. RNA-seq最新利器——全长转录组测序
  2. IS-IS的基本概念
  3. [你必须知道的异步编程]——异步编程模型(APM)
  4. SQL注入:3、无权读取information_schema库和拒绝union、order by语句
  5. 使用spyder编译器单步调试python
  6. hive 时间函数_Hive常用大法(聚合/排序/分组)
  7. PyQt5学习--基本窗口控件--QLabel
  8. 2016.1.20 总结(for语句,选择语句和循环语句混合使用)
  9. 2022-2027年(新版)中国石油化工行业发展建议及投资前景展望报告
  10. PDD订单详情接口解密,需要有anti_content(crawlerInfo)
  11. 链表Dummy Node
  12. C语言程序static改错题,2014计算机二级C语言程序设计全真测试题
  13. 人物回眸效果怎么用Vegas设置
  14. 十二星座、超完美解析!
  15. js处理ISO8601时间
  16. 边云协同的优点_与云端握手 是时候谈谈边云协同这个边缘计算新风向了
  17. VR学习第五节:VR+游戏
  18. c语言之打印输出图形
  19. 《Hands-On Machine Learning with Scikit-Learn TensorFlow》习题答案 - 第一章
  20. 腾讯云、AWS、阿里云哪家云好

热门文章

  1. 【知了堂学习笔记】数据库连接池简介,以及Eclipse中C3p0连接池的简单运用
  2. 【bzoj1222】[HNOI2001]产品加工 背包dp
  3. struts 通配符的使用
  4. 不容按钮、下拉框 执行同一个函数或者同一种函数的用法
  5. Asp.net(C#)中备份还原SQL Server数据库实现
  6. jQuery——入门(二)动画
  7. Python 列表 count( )方法
  8. border:0 none,border:none;,border:0;三者之间的区别
  9. sd卡有多个android文件夹,android - 如何adb拉出SD卡中存在的文件夹的所有文件
  10. 2014递归求解单链表中的平均值(C++,附递归函数思路讲解)