linux jar包内的定时任务修改jar包内的配置文件 permission denied

发布于 2022-09-12 02:21:58 字数 4597 浏览 17 评论 0

问题描述

本人的程序是一个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的权限修改成功了
微信截图_20200424112806.png
我用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼泪淡了忧伤 2022-09-19 02:21:58

把配置文件platform.properties,放到外面来,到 jar 包同级目录, 或者在 jar 包同级创建个 config 目录,放在 config 目录下,猜测是因为已经打成 jar 包的问题,导致无法正常修改,放到外部,当一个正常的文件进行读写试试。毕竟 jar 配置优先级是,外部优先于内部的。image.png

动次打次papapa 2022-09-19 02:21:58

这是我项目中一段代码,主要看第一行,试一下用spring自带的工具类读一下,输入流和输出流都一样,不保证能解决你的问题,或者可以试下ResourceBoundle

private static void restore(String url, String username, String password) throws SQLException, IOException {
        try (InputStream is = new ClassPathResource("backup.sql").getInputStream()) {
            /** 由于jar中的文件读取问题,做以下处理(流的读取反而不受限制) **/
            String path = copy(is);
            RunScript.execute(url, username, password, path, Charset.forName("UTF-8"), false);
            log.info("+--------------------------------------------------------------+");
            log.info("|       datasource file initialize successfully (^-^)V       |");
            log.info("+--------------------------------------------------------------+");
        } catch (SQLException | IOException e) {
            log.error("datasource file initialized failed");
            throw e;
        }
    }

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文