编译运行一个java程序

Have you ever thought if it’s possible to compile and run a java program from another java program? We can use Runtime.exec(String cmd) to issue commands to the underlying operating system. We will use the same approach to compile and run a java program from another java program.

您是否曾经想过是否可以从另一个Java程序编译并运行一个Java程序? 我们可以使用Runtime.exec(String cmd)向底层操作系统发出命令。 我们将使用相同的方法从另一个Java程序编译并运行一个Java程序。

从另一个Java程序编译并运行Java程序 (Compile and Run Java Program from another Java Program)

Let’s write a simple java program that will be compiled and run from another java program.

让我们编写一个简单的Java程序,该程序将从另一个Java程序编译并运行。

package com.journaldev.files;public class Test {public static void main(String[] args) {System.out.println("Start");for(String str : args){System.out.println(str);}}}

Here is the other program where I am compiling and running the Test class.

这是我正在编译和运行Test类的另一个程序。

package com.journaldev.files;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;public class CompileRunJavaProgram {public static void main(String[] args) {try {runProcess("pwd");System.out.println("**********");runProcess("javac -cp src src/com/journaldev/files/Test.java");System.out.println("**********");runProcess("java -cp src com/journaldev/files/Test Hi Pankaj");} catch (Exception e) {e.printStackTrace();}}private static void printLines(String cmd, InputStream ins) throws Exception {String line = null;BufferedReader in = new BufferedReader(new InputStreamReader(ins));while ((line = in.readLine()) != null) {System.out.println(cmd + " " + line);}}private static void runProcess(String command) throws Exception {Process pro = Runtime.getRuntime().exec(command);printLines(command + " stdout:", pro.getInputStream());printLines(command + " stderr:", pro.getErrorStream());pro.waitFor();System.out.println(command + " exitValue() " + pro.exitValue());}}

Notice the difference in javac and java commands. We need to do this because Eclipse working directory is the project root directory but my classes source directory is src.

注意javacjava命令的区别。 我们需要这样做,因为Eclipse工作目录是项目的根目录,但是我的类源目录是src。

When I run the above program from Eclipse, here is the output produced.

当我从Eclipse运行上述程序时,这是产生的输出。

pwd stdout: /Users/pankaj/Documents/eclipse-workspace/JavaExceptions
pwd exitValue() 0
**********
Path Serapartor = /
javac -cp src src/com/journaldev/files/Test.java exitValue() 0
**********
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Start
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Hi
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Pankaj
java -cp src com/journaldev/files/Test Hi Pankaj exitValue() 0

Here is the output when I run the same program from the command line, the working directory is the project root directory.

这是当我从命令行运行相同程序时的输出,工作目录是项目根目录。

pankaj:~ pankaj$ cd /Users/pankaj/Documents/eclipse-workspace/JavaExceptions
pankaj:JavaExceptions pankaj$ javac -cp src src/com/journaldev/files/Test.java
pankaj:JavaExceptions pankaj$ javac -cp src src/com/journaldev/files/CompileRunJavaProgram.java
pankaj:JavaExceptions pankaj$ java -cp src com/journaldev/files/CompileRunJavaProgram
pwd stdout: /Users/pankaj/Documents/eclipse-workspace/JavaExceptions
pwd exitValue() 0
**********
javac -cp src src/com/journaldev/files/Test.java exitValue() 0
**********
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Start
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Hi
java -cp src com/journaldev/files/Test Hi Pankaj stdout: Pankaj
java -cp src com/journaldev/files/Test Hi Pankaj exitValue() 0
pankaj:JavaExceptions pankaj$

The above program will work fine in Unix systems but it will not work in Windows systems because Windows File separator is different from Unix file separators.

上面的程序在Unix系统上可以正常运行,但是在Windows系统中不能运行,因为Windows文件分隔符与Unix文件分隔符不同。

To make sure it’s platform independent, we can pass commands as an argument to the main function. The main function will look like this:

为了确保它与平台无关,我们可以将命令作为参数传递给main函数 。 主要功能如下所示:

public static void main(String[] args) {try {if(args.length < 2) throw new Exception("Mandatory Arguments missing");runProcess(args[0]);runProcess(args[1]);} catch (Exception e) {e.printStackTrace();}}

We can also use File.separator to create the commands in platform independent way. We can also get this property from System getProperty method System.getProperty("file.separator").

我们还可以使用File.separator以平台无关的方式创建命令。 我们还可以从System getProperty方法System.getProperty("file.separator")获得此属性。

Above program can be changed like below for system independent code.

上面的程序可以像下面这样更改,用于系统独立代码。

String separator = File.separator;
System.out.println("File Serapartor = "+separator);separator = System.getProperty("file.separator");
System.out.println("File Serapartor = "+separator);runProcess("javac -cp src src"+separator+"com"+separator+"journaldev"+separator+"files"+separator+"Test.java");
System.out.println("**********");
runProcess("java -cp src com"+separator+"journaldev"+separator+"files"+separator+"Test Hi Pankaj");

You will get the same output as above. That’s all for using Runtime exec method to compile and run a java program from another java program.

您将获得与上述相同的输出。 这就是使用Runtime exec方法从另一个Java程序编译并运行一个Java程序的全部内容。

The printLines() and runProcess() methods are taken from this post.

printLines()和runProcess()方法摘自这篇文章 。

翻译自: https://www.journaldev.com/937/compile-run-java-program-another-java-program

编译运行一个java程序

编译运行一个java程序_如何从另一个Java程序编译和运行Java程序相关推荐

  1. deepin终端编译c程序_大神支招 如何在Linux下运行C语言程序

    刚入门学习C语言程序的小伙伴比较常遇到的其中一个问题是:如何在Linux下运行C语言程序.今天针对这个热门问题,小编为大家准备了详细的教程! 小编先给大家普及一些关于C语言程序的基本常识:首先大家要清 ...

  2. cmd写java程序_用cmd写一个最简单的Java程序

    一,准备: 1.确保电脑中装有eclipse软件并且确保配置好环境变量 (1)环境变量配置方法: 特别提示:jdk和eclipse保存的路径不能有中文字符 1.打开我的电脑--属性--高级--环境变量 ...

  3. 女朋友生日java程序_★★女朋友要过生日了!我想用java为她写一个程序,一举两得啊! 希望大家多提建议啊!谢谢!!!...

    女朋友要过生日了,我想用java为她写一个程序,所以想请教大家,  希望大家给我出出点子, 同时手头有3D  等漂亮图形的java程序或其他一些特效的文字,图形java程序,都希望大家多提供,  多帮 ...

  4. cmake release和debug代码运行效果不一样_这35个小细节,让你的Java 代码运行效率翻倍!...

    传智播客博学谷 加小谷vx:boxueguu 免费领IT各学科资料.课程 Get更多干货直播课 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码 ...

  5. 构建meteor应用程序_我构建了一个渐进式Web应用程序并将其发布在3个应用程序商店中。 这是我学到的。...

    构建meteor应用程序 by JudahGabriel Himango 犹大(Gabriel Himango) 我构建了一个渐进式Web应用程序并将其发布在3个应用程序商店中. 这是我学到的. (I ...

  6. eclipse的tomcat如何运行自动弹网页_如何在 3 天内零成本完成 AI 小程序开发

    基于对 AI 的爱好与兴趣,我走上了独自钻研机器学习的道路.和所有热爱 AI 的人们一样,在一段孤独的摸索旅程中,我勉强完成了几次深度学习模型的训练.作者:泰斯特想说 故事的起源 基于对 AI 的爱好 ...

  7. vue怎么给pc端浏览器设置一个最小屏幕_创新PC应用、打通云端体验,360小程序引发SaaS软件变革...

    进入2019年,我国云计算产业发展正在从"单点突破"迈入"整体效能提升"的新阶段,这是中国信通院<云计算发展白皮书(2019)>的重要判断. 云计算 ...

  8. java 声明一个bus类_第11章 新特性 – 你应该更新的Java知识之Observer - Java 基础入门笔记...

    作为一个Java程序员,不熟悉设计模式简直不好意思和人打招呼,而Observer模式可以说是位列最常用的设计模式之列,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模 ...

  9. java热力图_我做了一个傻瓜式热力图生成工具

    ​之前后台有粉丝留言,问怎么做热力图.方法很多,首当其冲大杀器 ArcMap,用 ArcToolBox 里的「插值工具」.「核密度分析」就能实现. 毕竟是专业工具,功能确实强大,但用户体验有时候就差点 ...

最新文章

  1. HDU3440(差分约束+SPFA算法)
  2. VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
  3. java中字典算法_Java字典生成算法讲解
  4. 以太网帧格式、最少字节介绍(arp)
  5. 《华为研发》阅读 - 16 (矩阵式管理)
  6. 致远OA表单自定义函数(明细表排名 )
  7. DL中常用的三种K-Lipschitz技术
  8. Vue 3 模板语法
  9. 11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?
  10. visio2013 如何快速画出所有箭头
  11. vue 使用正则判断邮箱格式是否正确 手机号 证件啥的都可以套用
  12. IP座席接入系统方案
  13. 一只小北极熊(结构体
  14. IPFS为数据隐私保驾护航
  15. 5G+物联网商业模式促使物联网卡迎来增长新风口
  16. windows8.1 KB2919355更新步骤
  17. reduce函数及其用法
  18. maven+spring mvc+mybatis+redis+dubbo+zookeeper
  19. 德国:一个中国人在德国生活的真实感受
  20. OMI/Aura臭氧数据下载及绘图

热门文章

  1. [转载] Python内置函数-min函数和max函数-详解
  2. [转载] Python将列表转换成字符串及字符串左右中对齐输出问题
  3. 实用机器人设计(二)-传感器
  4. 牛客Wannafly挑战赛10 A.小H和迷宫
  5. 页面固定定位超出一屏
  6. 程序员提高编程能力万无一失的办法
  7. 那些必须要知道的Javascript
  8. 数据库缓存技术(转)
  9. Debian/Ubuntu Apache Mod_Rewrite 安装
  10. 反卷积可视化工具--deconv-deep-vis-toolbox