java获取当前jar包所在目录

博客指出原本获取工程目录的方法,在将程序打成jar包放于Linux机器上运行时,无法正确获取jar包所在目录,导致程序无法运行。经网上查阅修改方法后,可正常获取jar包所在目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原本获取工程目录使用方法System.getProperty("user.dir")
但是打完包放在linux机器上跑的时候发现无法正确获取到该jar包所在目录,导致无法运行;
网上查阅后修改为如下方法:

public String getPath()
	{
		String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
		if(System.getProperty("os.name").contains("dows"))
		{
			path = path.substring(1,path.length());
		}
		if(path.contains("jar"))
		{
			path = path.substring(0,path.lastIndexOf("."));
			return path.substring(0,path.lastIndexOf("/"));
		}
		return path.replace("target/classes/", "");
	}

这样打成jar包后也可以正常获取到jar包所在的目录;

<think>我们正在处理一个Java项目打JAR文件并获取项目根目录的问题。根据用户的问题,我们需要两个步骤:1.Java项目打JAR文件;2. 在代码中获取项目根目录(在JAR文件中运行时,根目录的概念与文件系统中不同)。 ### 步骤1:将Java项目打JAR文件 打Java项目为JAR文件有多种方式,可以使用IDE(如Eclipse、IntelliJ IDEA)的导出功能,也可以使用构建工具(如Maven、Gradle)。这里我们介绍两种常见方法: #### 方法1:使用Eclipse导出JAR文件 1. 在Eclipse中,右键单击项目 -> Export -> Java -> JAR file。 2. 选择要导出的资源(通常选择整个项目),并指定JAR文件的输出路径。 3. 在下一步中,可以选择是否导出.class文件(默认已选)以及是否压缩。 4. 在“JAR Packaging Options”中,可以选择是否生成清单文件(MANIFEST.MF)。如果项目有主类(含main方法),可以指定主类,这样可以通过`java -jar`命令运行。 5. 完成导出。 #### 方法2:使用Maven构建JAR文件 如果使用Maven,可以在`pom.xml`中配置maven-jar-plugin或maven-assembly-plugin(用于生成可执行JAR含依赖的JAR)。以下是一个基本配置: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.example.MainClass</mainClass> <!-- 替换为你的主类 --> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` 然后运行命令: ```bash mvn package ``` 生成的JAR文件位于`target`目录下。 ### 步骤2:获取项目根目录Java项目中,获取目录的方式取决于代码是运行在IDE中还是打后的JAR文件中。 - **在IDE中运行**:根目录通常是项目的根目录(即含`src`目录的文件夹)。 - **在JAR文件中运行**:JAR文件本身是一个压缩,没有传统文件系统的根目录。此时,我们通常需要获取JAR文件所在的目录,或者获取JAR文件内部的资源。 #### 获取当前JAR文件所在的目录 ```java String jarPath = YourClassName.class.getProtectionDomain().getCodeSource().getLocation().getPath(); File jarFile = new File(jarPath); String jarDir = jarFile.getParent(); // 这就是JAR文件所在的目录 ``` 注意:`YourClassName`需要替换为当前类的名称。 #### 获取JAR文件内部的资源 如果资源被打JAR文件中,可以使用`ClassLoader`来获取资源流: ```java InputStream input = YourClassName.class.getResourceAsStream("/path/to/resource"); ``` #### 获取项目根目录(在IDE中)和JAR文件所在目录(在JAR中)的通用方法 以下代码尝试获取当前类所在的路径,如果路径中含"jar"或"!"(表示在JAR文件中),则解析JAR文件所在目录;否则,返回项目根目录(这里假设项目根目录是类路径的上一级,因为类文件通常在`target/classes`或`bin`目录下)。 ```java import java.io.File; import java.net.URISyntaxException; import java.security.CodeSource; public class PathUtil { public static String getProjectRoot() { try { CodeSource codeSource = PathUtil.class.getProtectionDomain().getCodeSource(); File jarFile = new File(codeSource.getLocation().toURI().getPath()); String jarDir = jarFile.getParentFile().getPath(); // 判断是否是JAR文件 if (jarFile.isFile()) { return jarDir; // 返回JAR文件所在目录 } else { // 在IDE中运行,返回项目根目录(假设项目根目录是类路径的上一级) File classDir = new File(PathUtil.class.getResource("").toURI()); String classPath = classDir.getPath(); // 通常类路径在项目根目录的target/classes或bin目录下,所以向上退两级(因为路径可能有多层) // 但这里我们退到含target/classes或bin的目录(即项目根目录) // 注意:这个逻辑可能因项目结构而异 File projectRoot = classDir.getParentFile().getParentFile(); return projectRoot.getPath(); } } catch (URISyntaxException e) { e.printStackTrace(); return null; } } public static void main(String[] args) { System.out.println("Project Root: " + getProjectRoot()); } } ``` 注意:上述方法在IDE中运行和打JAR后运行的结果可能不同,因为项目结构不同。在IDE中,类文件通常位于`<项目根目录>/target/classes`或`<项目根目录>/bin`目录下,所以返回的是项目根目录。而在JAR中运行时,返回的是JAR文件所在的目录。 ### 总结 1.JAR文件:使用IDE的导出功能或Maven等构建工具。 2. 获取目录:根据运行环境(IDE或JAR)使用不同的方法。上述`PathUtil`类提供了一个通用方法,但需要根据实际项目结构调整。 ### 相关问题 根据用户的问题,我们还可以生成以下相关问题: 1. 如何将Java项目打成可执行的JAR文件? 2.Java中如何读取JAR文件内部的资源? 3. 如何获取当前运行的JAR文件的路径? 4. Maven打时如何含依赖的JAR文件? 5.Java项目中,如何正确管理资源文件(如配置文件)的路径? 希望这些信息对您有帮助!</think>### 打Java项目为JAR文件并获取目录 #### 1️⃣ **打JAR文件** **方法一:使用Maven(推荐)** 1. 在`pom.xml`中添加打插件: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.example.MainClass</mainClass> <!-- 替换主类 --> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` 2. 执行命令: ```bash mvn clean package ``` 生成的JAR位于`target/`目录[^3]。 **方法二:手动打** ```bash # 编译所有Java文件 javac -d bin src/**/*.java # 创建带清单的JAR jar cfe app.jar com.example.MainClass -C bin . ``` --- #### 2️⃣ **获取项目根目录** 在JAR中运行时,传统文件路径不可靠。推荐两种安全方式: **方法一:通过类加载器获取资源路径** ```java // 获取资源所在目录(适用于src/main/resources) URL resource = getClass().getClassLoader().getResource(""); File rootDir = new File(resource.toURI()).getParentFile(); // 返回项目根目录 // 示例:读取resources/config.properties InputStream config = getClass().getResourceAsStream("/config.properties"); ``` **方法二:定位JAR文件自身路径** ```java // 获取JAR文件所在绝对路径 String jarPath = MainClass.class .getProtectionDomain() .getCodeSource() .getLocation() .toURI() .getPath(); File jarFile = new File(jarPath); File rootDir = jarFile.getParentFile(); // JAR所在目录即项目根目录 ``` > ⚠️ **注意事项**: > 1. JAR内的文件需通过`getResourceAsStream()`访问,不可用`File` > 2. 资源文件必须放在`src/main/resources`,Maven会自动打 > 3. 路径中的特殊字符需处理: > ```java > URLDecoder.decode(jarPath, "UTF-8") // 处理空格等特殊字符 > ``` --- ### 验证示例 项目结构: ``` my-project ├── src │ ├── main │ │ ├── java/com/example/MainClass.java │ │ └── resources/config.properties ├── target │ └── my-app.jar # 打后生成 └── pom.xml ``` 代码示例: ```java public class MainClass { public static void main(String[] args) throws Exception { // 获取JAR所在目录 String jarDir = new File( MainClass.class.getProtectionDomain() .getCodeSource().getLocation().toURI() ).getParent(); System.out.println("Root Directory: " + jarDir); // 读取资源文件 try (InputStream in = MainClass.class.getResourceAsStream("/config.properties")) { Properties prop = new Properties(); prop.load(in); System.out.println("Version: " + prop.getProperty("app.version")); } } } ``` --- ### 相关问题 1. 如何在JAR文件中动态加载外部配置文件? 2. Maven打时如何含依赖库(如生成fat-jar)? 3. 为什么JAR内的文件不能用`File`直接访问?如何解决? 4. 如何通过命令行传递参数给JAR程序? 5. 在Spring Boot项目中获取目录有何不同? [^1]: Java EE平台规范定义了JAR标准,括清单文件要求 [^3]: Maven的`maven-jar-plugin`负责JAR配置 [^4]: 签名机制同样适用于JAR文件的安全发布
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值