在linux服务器上使用Java代码调用linux或maven命令
Posted 故意养只喵叫顺儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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命令,必须要同一个窗口!请各位参考一下。
以上是关于在linux服务器上使用Java代码调用linux或maven命令的主要内容,如果未能解决你的问题,请参考以下文章
java使用jacob客户端需要安装office,服务端需要安装吗?如果需要,服务器是Linux该如何解决?