SpringBoot项目jar发布获取jar包所在目录路径

本文探讨了五种在Java中获取项目目录路径的方法,包括使用ResourceUtils、System属性、ClassUtils等,并对比了不同运行环境下(如IDEA直接运行与远程执行jar包)这些方法的表现差异,推荐在打包环境中使用ApplicationHome获取准确的路径。

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

        //第一种
        File path = new File(ResourceUtils.getURL("classpath:").getPath());
        if(!path.exists()) path = new File("");
        System.out.println(path.getAbsolutePath());
        //第二种
        System.out.println(System.getProperty("user.dir"));
        //第三种
        String path1 = ClassUtils.getDefaultClassLoader().getResource("").getPath();
        System.out.println(URLDecoder.decode(path1, "utf-8"));
        //第四种
        String path2 = ResourceUtils.getURL("classpath:").getPath();
        System.out.println(path2);
        //第五种
        ApplicationHome h = new ApplicationHome(getClass());
        File jarF = h.getSource();
        System.out.println(jarF.getParentFile().toString());

 

这几种获取项目目录的方式中,其中:

第一种、第二种得到的结果一致

第三种、第四种得到的结果一致

但是,不同的运行方式,他们的结果是有偏差的。下面我们来看下不同情况下依次打印的路径是什么。

先看下直接在idea中运行main方法启动项目时候,打印的路径,显示如下:

再看下打包成jar包中,打印的路径

第一种执行方式

操作方式:打开命令行,目录切换到jar包所在目录,然后执行 jar -jar  启动命令,打印的路径如下:

第二种执行方式

操作方式:打开命令行,直接java -jar  E:/web_pack/bis_exporter-1.0-SANPSHOT.jar,即不切换到jar所在目录,而是直接执行,打印的路径如下:

是不是发现问题了!在这种情况下,第一种和第二种方式打印的路径是不对的,他打印的路径就是当前执行命令时所在的目录。这就很容易造成不必要的bug

例如:我们在jar的根目录写一个自定义数据配置文件,通过第一种或者第二种方式读取数据,那么使用远程执行jar的方式,就一定会报找不到配置文件的错误。

总结

综上所述,最好使用第五种方案,获取运行jar所在的目录。

 

 

 

 

### Spring Boot 反向工程实现数据库表到实体类的自动生成 #### Maven依赖配置 在Spring Boot项目中,可以通过Maven引入MyBatis-Plus插件来完成反向工程。以下是必要的Maven依赖项: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <!-- MyBatis Plus Code Generator --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.0</version> </dependency> <!-- Velocity模板引擎用于代码生成 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency> ``` 以上依赖可以支持通过MyBatis-Plus进行代码自动生成[^2]。 #### 配置Generator对象 定义`AutoGenerator`实例并设置相关参数以启动逆向工程过程。下面是一个完整的代码示例: ```java import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; public class CodeGenerator { public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); // 输出路径 gc.setAuthor("Your Name"); // 设置作者名 gc.setOpen(false); // 是否打开输出目录 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("password"); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.example.demo"); // 父名 pc.setModuleName(null); // 模块名 mpg.setPackageInfo(pc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("table_name"); // 要映射的数据表名称 strategy.setNaming(NamingStrategy.underline_to_camel); // 下划线转驼峰命名 strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); // 使用lombok模型 strategy.setRestControllerStyle(true); // 开启RestController风格 mpg.setStrategy(strategy); mpg.execute(); // 执行生成器 } } ``` 上述代码实现了基于指定数据表的实体类、Mapper接口以及Controller等文件的自动化生成功能。 #### IntelliJ IDEA内置工具方法 如果希望利用IDEA自带的功能而非第三方库,可以选择如下方式: 1. 连接至目标数据库; 2. 在Schema视图下定位所需表格; 3. 对选定表格右键操作,调用预设脚本如`Generate POJOs.groovy`完成转换工作[^3]。 此法适用于仅需快速获取基础POJO类型的场景,但对于复杂业务逻辑可能仍需额外调整优化。 ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值