暂无分类
暂无标签
发布于2023-03-15 19:24 阅读(577) 评论(0) 点赞(6) 收藏(5)
这里的需求前提是,在项目中进行某些操作前,需要在命令后对shell配置文件的进行修改(如ip、port),这个对于用户是不友好的,需要改为用户页面输入ip、port,后台自动去操作修改配置;那么这篇博客的由来就有了。
上面图片是AI创作,未经允许,不可商用哦!
针对上述功能描述,其实可以拆解为三步
这里有两种实现,
一种是项目加载自定义变量文件到系统变量中;
另一种是shell通过source .env环境变量方式加载。
这种方法的好处是项目中可以获取到自定义变量,如果项目代码需要获取自定义变量进行操作,可以考虑使用此方式
新增一个自定义变量文件(当然也可以在代码中固定写入变量直接加载到系统中,这样的缺点就是不灵活,如果有变动就需要改代码)
BASE_ROOT_DIR=/home
LICENSE_PATH=/home/LICENSE
PACKAGE_PATH=/home/test.tar.gz
/**
* 加载自定义变量文件到系统变量中
* @param configFile
*/
public static void loadProperties(String configFile){
try {
FileInputStream propFile = new FileInputStream(configFile);
Properties p = new Properties(System.getProperties());
p.load(propFile);
System.setProperties(p);
} catch (Exception e) {
e.printStackTrace();
}
}
调用loadProperties方法后,就可以通过System.getProperty("key")
获取自定义的变量了
如获取BASE_ROOT_DIR:System.getProperty("BASE_ROOT_DIR")
自定义变量文件
测试代码
import java.io.FileInputStream; import java.util.Properties; public class LoadProperties { public static void main(String[] args) { String configFile = "/Users/kunzhi/Downloads/learn/linuxTest/config.sh"; loadProperties(configFile); System.out.println("BASE_ROOT_DIR: " + System.getProperty("BASE_ROOT_DIR")); System.out.println("LICENSE_PATH: " + System.getProperty("LICENSE_PATH")); System.out.println("PACKAGE_PATH: " + System.getProperty("PACKAGE_PATH")); } public static void loadProperties(String configFile){ try { FileInputStream propFile = new FileInputStream(configFile); Properties p = new Properties(System.getProperties()); p.load(propFile); System.setProperties(p); } catch (Exception e) { e.printStackTrace(); } } }
运行输出结果
这种方法的好处是在shell执行时直接获取环境变量,不需要项目代码做多余的操作
source test.env
)或者先在命令行执行命令source test.env
后,执行shell文件BASE_ROOT_DIR=/home
LICENSE_PATH=/home/LICENSE
PACKAGE_PATH=/home/test.tar.gz
cd ${DATASYS_BASE_ROOT_DIR}
pwd
echo "DATASYS_PACKAGE_PATH: ${DATASYS_PACKAGE_PATH}"
echo "PACKAGE_PATH: ${PACKAGE_PATH}"
echo "LICENSE_PATH: ${LICENSE_PATH}"
创建shell模版文件 test.sh,并执行
创建环境变量文件 test.env,并在test.sh文件首行加入命令:source test.env
因为替换是否成功,只有通过运行结果才能有力证明,所以我们放在一起看
由于替换shell模版内容的具体操作受自定义变量加载方式影响,所以我们还是按照两种加载方式来看
如果是项目加载自定义变量文件到系统变量中,还需要项目获取变量并传入shell替换;
代码如下
import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.Properties; public class LoadProperties { public static void main(String[] args) { String configFile = "/Users/kunzhi/Downloads/learn/linuxTest/config.sh"; //加载自定义环境变量 loadProperties(configFile); String BASE_ROOT_DIR = System.getProperty("BASE_ROOT_DIR"); String LICENSE_PATH = System.getProperty("LICENSE_PATH"); String PACKAGE_PATH = System.getProperty("PACKAGE_PATH"); System.out.println(BASE_ROOT_DIR + ": " + System.getProperty("BASE_ROOT_DIR")); System.out.println(LICENSE_PATH + ": " + System.getProperty("LICENSE_PATH")); System.out.println(PACKAGE_PATH + ": " + System.getProperty("PACKAGE_PATH")); //需要传入shell模版替换的内容 String[] evnp = {"BASE_ROOT_DIR=" + BASE_ROOT_DIR, "LICENSE_PATH=" + LICENSE_PATH, "PACKAGE_PATH=" + PACKAGE_PATH}; String shellFile = "/Users/kunzhi/Downloads/learn/linuxTest/test1.sh"; //替换并运行shell replaceAndRun(shellFile, evnp); } //加载自定义环境变量 public static void loadProperties(String configFile){ try { FileInputStream propFile = new FileInputStream(configFile); Properties p = new Properties(System.getProperties()); p.load(propFile); System.setProperties(p); } catch (Exception e) { e.printStackTrace(); } } //替换并运行shell private static void replaceAndRun(String path, String[] evnp) { try { Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", path}, evnp,null); //只有process.waitFor() 结果为0,才说明执行成功了 if (process.waitFor() != 0) { throw new Exception(String.valueOf(process.waitFor())); } InputStreamReader ir = new InputStreamReader(process.getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line; //输入shell中执行的每一行 while ((line = input.readLine()) != null){ if (line.contains("ERROR")) { throw new Exception("ERROR"); } System.out.println(line); } } catch (Exception e) { System.out.println(e); } } }
运行结果
如果是shell通过source .env环境变量方式加载,在上一步实操演示可以看出,其实已经达到替换效果,直接执行shell文件即可了
代码如下
package test; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.Properties; /** * @author yanZhiHang * @date 2023/2/26 17:06 */ public class LoadProperties { public static void main(String[] args) { runShell(shellFile1); } private static void runShell(String path) { try { Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", path}, null,null); if (process.waitFor() != 0) { throw new Exception(String.valueOf(process.waitFor())); } InputStreamReader ir = new InputStreamReader(process.getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line; while ((line = input.readLine()) != null){ if (line.contains("ERROR")) { throw new Exception("ERROR"); } System.out.println(line); } } catch (Exception e) { System.out.println(e); } } }
原文链接:https://blog.csdn.net/m0_37482190/article/details/129227983
作者:我是小豆丁
链接:http://www.javaheidong.com/blog/article/653174/27b6b7dc947980c86ddd/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!