linux jar包内的定时任务修改jar包内的配置文件 permission denied
问题描述
本人的程序是一个springboot的jar包运行在linux底下,然后jar包内有定时任务修改配置文件。但是修改文件时,出现了
java.io.FileNotFoundException:filepath (permission denied)
的问题
问题出现的环境背景及自己尝试过哪些方法
jar包在win10环境下可以运行,可以动态修改配置文件,不会报错
但是linux底下运行jar包就会报错。
该版本代码在另外一个linux设备里可以运行。
不成功的linux版本
linaro@linaro-alip:/$ uname -a
Linux linaro-alip 4.4.189 #64 SMP Wed Dec 18 13:47:24 CST 2019 aarch64 GNU/Linux
linaro@linaro-alip:/$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 9.11 (stretch)
Release: 9.11
Codename: stretch
目前试过但是无效的方法有
1 提高权限,jar在linux底下的权限已经chmod 777 了,包括jar所在的目录
2 更改拥有者。无论拥有者是root,还是一般用户(均为目录和jar同时更改)仍然出现问题
3 已经通过流的方式读取jar内的配置文件,不是jar目录和工程目录不一致的问题
4 linux下拆包修改配置文件权限为777后重新封包执行
获取文件到当前路径
jar xvf name.jar BOOT-INF/classes/platform.properties
开放了权限
sudo chmod 777 BOOT-INF/classes/platform.properties
把修改好的文件放回jar包
jar uvf name.jar BOOT-INF/classes/platform.properties
运行后,仍然有permission denied 问题
然后我
jar xvf name.jar
解压jar 查看权限,发现platform.properties的权限修改成功了
我用jar xvf name.jar 拆开整个包,确认platform.properties已经成功777,然后重新打包
jar -cvfM0 name.jar .
结果仍然是permission denied
相关代码
异常提示的点在配置文件修改的部分即这一行
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filepath)));
这边是完整的读取并修改配置文件的方法
public void UpdateConfig(Map<String,String> configParames)throws Exception{
String filepath = "/platform.properties";//配置文件的相对路径
InputStream ins = null;
Properties props = new Properties();//配置对象
BufferedWriter bw = null;
try {
ins = this.getClass().getResourceAsStream("/platform.properties");//流的方式读取配置文件
props.load(ins);
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filepath)));
for (String key : configParames.keySet()) {
props.setProperty(key, configParames.get(key));//将配置文件根据传入的值进行修改
}
platFormConfig.setPlatformUrl(props.getProperty("platform.url"));
props.store(bw, "改变数据");
bw.close();
} catch (IOException e) {
e.printStackTrace();
System.err.println("Visit " + filepath + " for updating " + "" + " value error");
} finally {
try {
if (bw!=null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
我期待的结果是配置文件被定时任务正常修改
但是linux底下运行时却报错
java.io.FileNotFoundException: /platform.properties (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at com.service.ConfigService.UpdateConfig(ConfigService.java:24)
at com.service.ScheduleSwitchLine.scheduled1(ScheduleSwitchLine.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Visit /platform.properties for updating value error
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
把配置文件platform.properties,放到外面来,到 jar 包同级目录, 或者在 jar 包同级创建个 config 目录,放在 config 目录下,猜测是因为已经打成 jar 包的问题,导致无法正常修改,放到外部,当一个正常的文件进行读写试试。毕竟 jar 配置优先级是,外部优先于内部的。
这是我项目中一段代码,主要看第一行,试一下用
spring
自带的工具类读一下,输入流和输出流都一样,不保证能解决你的问题,或者可以试下ResourceBoundle
类