用JAVA执行CMD命令备份PG数据库,解决需要输入口令的问题
最近要用JAVA做一个PostgreSQL的备份功能,没想到遇到一个大坑。
在网上搜索,很快就找到一个用JAVA的Runtime.getRuntime().exec()执行cmd命令来备份的方法。
执行代码后发现,没有导出对应的SQL文件。我觉得可能是命令有问题,于是我在cmd执行了这条命令,才发现问题所在。
原来是执行命令后还要输入数据密码的,这就是我说的那个大坑。
我马上就想到再用Runtime.getRuntime()执行一遍密码不就得了?但是结果果然不出所料,报错了。
于是又网上查,JAVA怎么执行交互式的cmd命令。让我查到可以获取上一个命令的OutputStream,然后用OutputStream写入密码。
于是把代码改成下面这样:
执行并没有报错,但是还是没有生成对应的SQL文件。
于是继续网上查,结果都找不到JAVA执行cmd备份PostgreSQL怎么来输入密码。
然后我决定转换思路,既然不知道怎么输入密码,那干脆查一下pg_dump免密码导出。果然找到了。那就是在环境变量里加上PGPASSWORD。
然后在cmd窗口执行导出命令,不用输入密码,成功导出。
但在很不幸,代码执行的时候,还是没有生成对应的SQL文件。难道是代码里执行不认这个环境变量?
本以为就一直卡在密码这里过不去了,没想到让我发现了另一个类ProcessBuilder。这个类也能执行cmd命令。于是把Runtime.getRuntime()全部换成ProcessBuilder。然后执行代码。
结果依然是那么的不出所料,没有生成对应的SQL文件。
不过幸好我鼠标多滚了两下,在ProcessBuilder类的API页面。被我看到了一个environment()方法。
就是environment()可以设置环境变量,于是我把刚刚的免密导出环境变量PGPASSWORD用ProcessBuilder类来设置。
然后执行代码,我对这次执行的结果并没抱多大希望。
但是结果依旧是那么的不出所料
导出成功了!
共有 0 条评论