最近想实现一个java执行shell脚本的小demo,其实执行的一条命令是比较容易的,一百度一大堆;执行脚本也特别简单,参数为路径即可,但是有没有想过下面的这种情况?
你想执行一个名字叫 helloword.sh脚本,你的脚本放在 /opt下,你在自己的SpringBoot代码运行shell的命令的参数为/opt/ helloword.sh ,你的代码在自己的服务上跑的美滋滋,但是你的代码跑到别人服务器上,那你怎么能保证别人的/opt下有你的helloword.sh ???
其实比较简单的方法就是我在的SpringBoot的resources目录下放置helloworld.sh,如果jar包启动的时候,能把该helloword.sh复制到当前linux操作系统我规定的目录下,我这个问题就解决了。
https://github.com/cbeann/Demooo/tree/master/springboot-demo-copy
SpringBoot项目,secret.txt文件的位置如下图所示
pom.xml
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
runner:项目启动后调用实现CommandLineRunner接口的实现类
package com.example.springbootdemocopy.runner;
import com.example.springbootdemocopy.App;
import org.apache.commons.io.FileUtils;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.InputStream;
/**
* @author chaird
* @create 2020-10-12 20:41
*/
@Component
public class CopyRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// window();//window上复制文件
linux(); // linux上复制文件
}
/** 在window系统上把resources下的myfile/secret.txt文件复制到xxx */
public void linux() throws Exception {
InputStream inputStream = App.class.getClassLoader().getResourceAsStream("myfile/secret.txt");
// 获得的系统的根目录
File fileParent = new File(File.separator);
/// opt/secret_linux.txt
File targetFile = new File(fileParent, "/opt/secret_linux.txt");
if (targetFile.exists()) {
targetFile.delete();
}
targetFile.createNewFile();
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream, targetFile);
// 记得关闭流
inputStream.close();
}
/** 在window系统上把resources下的myfile/secret.txt文件复制到D:\others\temp\temp\secret_win.txt目录下 */
public void window() throws Exception {
String sourceFileName = "myfile/secret.txt";
ClassPathResource classPathResource = new ClassPathResource(sourceFileName);
InputStream inputStream = classPathResource.getInputStream();
String targetFileName = "D:\\others\\temp\\temp\\secret_win.txt";
// 获得的系统的根目录
File targetFile = new File(targetFileName);
if (targetFile.exists()) {
targetFile.delete();
}
targetFile.createNewFile();
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream, targetFile);
// 记得关闭流
inputStream.close();
}
}