java exe 路径_Java程序中的路径问题

1 Java程序中的路径问题

1.1 背景描述

本文讨论的是非web项目中java程序的路径问题。

在我们编写的Java程序中,需要绝对路径来定位到当前程序所在的路径。我们获取了这个绝对路径的变量值后,传递给Log4j日志框架,从而实现输出日志路径是动态的。

具体来说,是实现下面的预期。

1 当不在程序所在的目录下执行jar文件时,程序中的绝对路径仍然能生效。(即不是指向用户目录)。

2 实现Log4j输出的日志文件能够位于程序所在的目录。(不需要额外的手工指定程序所在目录,动态的实现)。

1.2 问题定位

1 绝对路径的获取。

2 带依赖jar包的打jar包与程序路径问题。

3 获取了绝对路径的变量值后,如何传递给Log4j日志框架,与相关的配置。

1.3 问题解决

1.3.1 问题1:绝对路径的获取

问题1 用下面的代码可以获取程序的绝对路径。

String projectDir = 所在类名.class.getClass().getResource("/").getPath();

System.out.println(projectDir);

// 在eclipse中运行输出结果示例

/E:/workspace_set/big_data_workspace/DemoTest/bin/

// 打成jar包运行的输出结果示例

/E:/workspace_set/big_data_workspace/DemoTest

1.3.2 问题2:带依赖jar包的打jar包与路径问题

打包步骤简述:Export ==> Java ==> Runnable Jar file ==>

在luanch configuration中选择你的main方法所在的类,在Export destination中输入类名,Library handling选择第一项(extract required libraries into genetated jar)即可,如下图所示。==> finish。

c2ba1af1f1126e0f31db7dacc8fe8c46.png

注意事项:对于打成带有第三方依赖包的jar包时,Library handling选择第一项(将依赖的jar解压出来变成class放进你生成的jar),如上图。原因:选择第二项时,绝对路径获取的代码输出为null。

String projectDir = 所在类名.class.getClass().getResource("/").getPath();

System.out.println(projectDir);

// 当Library handling选择第二项时,的输出

null;

1.3.3 问题3:绝对路径值传递给Log4j日志框架,相关的配置

1 log4j.properties文件中的配置说明,在log4j.properties文件中,使用${系统变量名}来引用变量(绝对路径),示例如下。

log4j.appender.file.File=${base.dir}mylog5.log

2 Java程序中的处理。

// 1 在logger私例化之前,执行下面的代码

// 获取绝对路径

String projectDir = 所在类名.class.getClass().getResource("/").getPath();

// 将绝对路径赋值给系统变量

System.setProperty("base.dir", projectDir);

// 2 Read the configuration file configFilename if it exists.

// 这里相当于重新加载,让绝对路径的配置生效;

PropertyConfigurator.configure(projectDir + "log4j.properties");

// 存放绝对路径的系统变量,被Log4j加载的测试

// 获取FileAppender对象

FileAppender appender= (FileAppender) Logger.getRootLogger().getAppender("file");

// 输出示例:/E:/workspace_set/big_data_workspace/DemoTest/bin/mylog5.log

System.out.println(appender.getFile());

// 3 实例化Logger;

Logger logger = Logger.getLogger(当前类名.class);

经过上述步骤,即完成了log4j的正常输出。

1.4 其它问题汇总

1.4.1 问题1

下面是在使用过程中遇到的问题的解释。

现象:在eclipse中执行时,会没有输出日志的文件。但是,打包出去(打包的话,按照本文的操作步骤去打jar包),无论是在程序所在的目录下,还是在其它的目录下,执行这个jar包,都能正常的输出日志文件。

原因:

// 获取绝对路径

String projectDir = 所在类名.class.getClass().getResource("/").getPath();

System.out.println(projectDir);

// 在eclipse中执行的输出值

projectDir=/E:/workspace_set/big_data_workspace/DemoTest/bin/

// 打成jar包的输出值

projectDir=/E:/workspace_set/big_data_workspace/DemoTest/

如上,/E:/workspace_set/big_data_workspace/DemoTest/bin/,这个路径找不到,所以在eclipse中,日志没法正常执行输出。

所以说,这个是正常现象,不影响我们打包出的jar正常的输出日志文件到指定目录。

存放绝对路径的系统变量,是会被Log4j加载,且生效了。测试代码如下:

// 存放绝对路径的系统变量,被Log4j加载的测试

// log4j.properties文件中的配置假设如下:

// log4j.appender.file.File=${base.dir}mylog5.log

// 测试代码

String projectDir = TestLog2.class.getClass().getResource("/").getPath();

PropertyConfigurator.configure(projectDir + "log4j.properties");

//获取FileAppender对象

FileAppender appender= (FileAppender) Logger.getRootLogger().getAppender("file");

System.out.println(appender.getFile());

// 输出值结果示例:

/E:/workspace_set/big_data_workspace/DemoTest/bin/mylog5.log

1.4.2 问题2 文件读取

问题描述:获取的绝对路径在eclipse中执行,由于获取的路径中带有bin这个字段,对于位于src目录下的文件读取有影响吗?

问题答案:没有。使用获取的绝对路径+文件名,即为src目录下文件的绝对路径。这个大家可以做个小实验。这里就不展开了。

1.5 本文相关的代码地址

2 参考文献

https://blog.csdn.net/qq_2180... (eclipse 导出可运行jar包时三种Library handling的区别 - 小蓝的博客 - CSDN博客)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值