获取程序运行目录 (jar运行目录)

FileSystems.getDefault().getPath("").toAbsolutePath().toString()

Path.get(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent()

这两个代码片段在Java中用于获取不同的路径,尤其在打包为JAR文件运行时会有显著差异:

--1. `FileSystems.getDefault().getPath("").toAbsolutePath().toString()`

  • **功能**:

获取**当前工作目录**(Current Working Directory)的绝对路径。

  • 这里的当前工作目录是启动JVM时用户所在的目录(例如,命令行中执行`java -jar app.jar`时所在的路径)。

  • 如果在IDE中运行,通常是项目根目录或配置的某个运行目录。

  • **JAR运行时行为**:

假设用户执行以下命令:

```bash

cd /home/user/documents

java -jar /path/to/app.jar

```

这段代码将返回:`/home/user/documents`,即用户执行命令时的当前目录,而不是JAR文件所在的位置。

  • **适用场景**:

需要动态获取用户当前操作目录的场景(例如处理用户通过命令行参数指定的相对路径文件)。

---2. `Path.of(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent()`**

  • **功能**:

获取**JAR文件所在的目录**(或类文件目录,如果未打包为JAR)的父路径。

  • `getCodeSource().getLocation()` 返回的是类加载的源位置(例如JAR文件的路径)。

  • `toURI()` 和 `Path.get()` 用于将URL转换为文件系统路径。

  • `getParent()` 会去掉JAR文件名,返回其父目录。

  • **JAR运行时行为**:

假设JAR文件路径为:`/opt/myapp/app.jar`,无论用户从哪里执行JAR(如`java -jar /opt/myapp/app.jar`或`cd /home/user; java -jar /opt/myapp/app.jar`),这段代码会返回:`/opt/myapp`。

  • **注意事项**:

  • 如果类是从非文件系统(如网络、内存)加载的,`getCodeSource().getLocation()` 可能返回`null`或不可解析的URI,导致异常。

  • 需要处理`URISyntaxException`和`NullPointerException`。

  • **适用场景**:

需要定位JAR文件所在目录的场景(例如读取同目录下的配置文件或资源)。

**实际示例**

假设JAR路径为`/opt/app/myapp.jar`,用户执行:

```bash

cd /home/user

java -jar /opt/app/myapp.jar

```

  • **代码片段1**返回:`/home/user`(当前工作目录)。

  • **代码片段2**返回:`/opt/app`(JAR所在目录)。


**如何选择?**

  • 需要**动态读取用户工作目录**(如处理用户输入的文件):用代码片段1。

  • 需要**定位JAR自身路径**(如读取同目录的配置文件):用代码片段2,但需处理异常。

相关推荐
蝎子莱莱爱打怪几秒前
👋🏻👋🏻再见,拉勾网——那个"最懂互联网人"的招聘平台倒了😭
前端·后端·招聘
用户298698530146 分钟前
Java 获取 Word 文档中修订记录的实现方法
java·后端
Dicky-_-zhang6 分钟前
Redis集群模式详解与实战配置
java·jvm
你的保护色7 分钟前
ensp之STP、RSTP、MSTP协议实验
java·服务器·数据库
JAVA学习通20 分钟前
《大营销平台系统设计实现》 - 营销服务 第5节:抽奖前置规则过滤
java·数据库·github
斯特凡今天也很帅23 分钟前
新建数据源报错No bean named ‘SqlSessionFactorykf‘ available
java·数据库·spring boot·mybatis
带刺的坐椅23 分钟前
用 Solon AI 从零构建 MCP 工具服务:让 AI Agent 拥有真实世界的能力
java·ai·solon·mcp·solon-ai
TheRouter28 分钟前
PromptCaching 工程实践:把LLM 调用成本砍掉80%
java·后端·spring·ai
寻道码路29 分钟前
LangChain4j Java AI 应用开发实战(二):大模型参数调优实战:Temperature、TopP、MaxTokens 深度解析
java·开发语言·人工智能·aigc
Gopher_HBo31 分钟前
Go pprof性能剖析
后端