java 命令 指定路径_命令行中使用java命令执行main方法,自定义文件相对路径所对应的绝对路径...

平常在项目中会分模块进行开发,读写文件时使用的都是绝对路径,测试程序也是使用idea直接执行程序。在学习jetty源码时,由于需要在start模块中启动项目,但需要动态加载依赖的其他模块,此时代码中使用的是相对路径,在使用idea启动程序的时候,可以正常执行,但在命令行中使用java命令启动程序时,总是会报java.lang.ClassNotFoundException,分析原因见下:

1. 打开idea的run配置:

edad37c1f5a68afc9da17622072f7b01.png

虽然是在start模块中启动程序,但idea会自动将运行时的程序根路径设置为working directory中设置的目录,此时项目中使用的相对路径就是依据working directory路径的相对路径(此处是猜测,具体验证可以通过修改working directory内容来验证)

2. 使用java命令执行时,由于没有设置程序运行时的根路径,此时就会将当前main方法所在的类所处的目录设置为跟路径,代码中再使用相对路径时,就是根据main方法所在的类所在的目录生成的路径

根据以上猜测和分析,解决此问题的根本就是找到如何设置程序运行时的根目录

----- 分隔线 ----

分析java源码:

File类:

//获取文件绝对路径方法

public String getAbsolutePath() {

return fs.resolve(this);//FileSystem.resolve()方法

}

根据操作系统不同,使用的FileSystem实现类不一样,我的是mac系统,使用的是UnixFileSystem类:

1 publicString resolve(File f) {2 if (isAbsolute(f)) returnf.getPath();3 return resolve(System.getProperty("user.dir"), f.getPath());4 }

可以发现java源码中使用的是System.getProperty("user.dir")来设置程序运行的跟目录的,那么就可以通过此设置解决这个问题:

1 System.setProperty("user.dir", "/workspace/code/git/jetty.project");

总结:通过修改系统属性user.dir,使用java命令也可以通过jetty源码正常启动了,此时可以猜测idea是否也是通过将working directory设置到user.dir属性来实现的呢。

---- 少百度,多看源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值