在linux服务器上使用Java代码调用linux或maven命令

背景:

项目需求,只要在页面上贴上maven依赖的地址,就能直接下载依赖

例如

<dependency>
    <groupId>com.avides.springboot.testcontainer</groupId>
    <artifactId>springboot-testcontainer-common</artifactId>
    <version>0.1.0-RC6</version>
</dependency>

贴上这个,项目就能直接去下载maven的依赖


做法:

需要用到linux上的maven命令(根据实践,在windows上也可以使用这条命令)

注意:需要先安装maven,并且配置环境变量,有可能配置中的仓库地址要与命令中的一致

mvn dependency:get -DremoteRepositories=http://repo1.maven.org/maven2/ -DgroupId=junit -DartifactId=junit -Dversion=4.8.2

 

java具体写法

public Process exec(String[] cmdArray);
// Linux下
Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","cmds"}).waitFor();
// Windows下
Runtime.getRuntime().exec(new String[]{"cmd","/c",cmds}).waitFor();

Process的几种方法

1、destroy():杀掉子进程

2、exitValue():返回子进程的出口值,值0表示正常终止

3、getErrorStream():获取子进程的错误流

4、getInputStream():获取子进程的输入流

5、getOutputStream():获取子进程的输出流

6、waitFor():导致当前线程等待,如有必要,一直要等到由该Process对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,知道退出子进程,根据管理,0表示正常终止。

注意:在Java中,调用runtime线程执行脚本是非常消耗资源的,所以切记不要频繁使用!

在调用runtime去执行脚本的时候,其实就是JVM开了一个子线程去调用JVM所在系统的命令,其中开了三个通道:输入流、输出流、错误流,其中输出流就是子线程走调用的通道。

大家都知道,waitFor是等待子线程执行命令结束后才访问,但是在runtime中,打开程序的命令如果不关闭,就不算子线程结束,比如如下代码。

注意:

经实践,如果linux命令在linux服务器上执行失败,比如说not found command,也算是执行了,代码也是会继续往下走的。所以要确保命令的正确性,或者使用返回值来判断!调用waitFor()的返回和不调用的返回值,类型都是不同的。


 

这样的下载方法只能把依赖下载到本地maven配置的仓库,如果有其他的需求,比如说我此次项目的需求就是扫描另一个路径下的facade包是否存在,那么在我下载完依赖之后,还有一个操作就是复制一份同样的jar包到另一个路径下。在复制的过程中需要注意的就是maven的目录结构,要保证每次的拼接都是正确的。

另外在操作过程中还出现一个小问题,使用secureCRT登陆linux服务器,必须先执行source .bashrc命令,然后再在这个窗口启动项目,这样子才能正确执行java代码中所输出的linux命令,必须要同一个窗口!请各位参考一下。

 

posted @ 2018-08-25 10:08  me-ht  阅读(2075)  评论(0编辑  收藏  举报