try {
String command = "java -Xms64m -Xmx512m -cp %mypath% com.app.GenericAxlTool -i " + ip + " -v 6.0 -a " + axlVer + " -d " + dbVer + " -u " + userName + " -p " + password + " -c sqlselect -f " + queryFile;
String[] envArr = {pathCmd};
System.out.println("Command is: " + command);
ProcessBuilder pb = new ProcessBuilder(command);
Map<String, String> env = pb.environment();
env.put("mypath", ".;lib/gatui.jar;lib/gat.jar;lib/swing-layout-1.0.jar;lib/smtp.jar;lib/AbsoluteLayout.jar;lib/axis.jar;lib/commons-discovery-0.2.jar;lib/jaxm-runtime.jar;lib/jaxrpc.jar;lib/saaj-api.jar;lib/saaj-impl.jar;lib/activation.jar;lib/JSAP-2.1.jar;lib/SNMP4J.jar;lib/mailapi.jar;lib/jtapi.jar;lib/remotehands.jar;lib/conftransfer.jar;lib/jtapi.jar;;lib/devicedashboard.jar;lib/pcdb.jar;lib/lic.jar;lib/poi-3.8-20120326.jar");
pb.directory(new File(curDir));
Process p = pb.start();
//Runtime runtime = Runtime.getRuntime();
//Process p = runtime.exec(command, envArr, new File(curDir));
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
System.out.println("Done with: " + queryFile);
} catch (IOException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
} finally {
return false;
}
The above code results in IOException and secondly, I dont get any output from the stream as well. Here is folder structure.
MainDir
|
--lib
--src
|
--com.query.Exec
|
javafile.java
I dont know what are you trying to do with your code, but to execute commandlines you can simply use
Runtime.getRuntime().exec(command)
where command is a string representing the command you want to run.
Related
Is it possible in java by using something like ProcessBuilder to open gitbash, write a command (for example git status) and output the results?
I can successfully open git bash by using the following code but i don't know how to write any commands in it.
String[] commands = {"cmd","/C","C:\\Users\\......\\Git\git-bash"};
ProcessBuilder builder = new ProcessBuilder(commands);
builder.redirectErrorStream(true);
Process process = builder.start();
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try
{
br=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + System.getProperty("line.seperator"));
}
} finally {
br.close();
}
String outcome = get_output(process.getInputStream());
process.waitFor();
System.out.println("Process finished with outcome = " + outcome);
You just have to change the paths and the git command. But the git-bash output is printed on a separate .txt file because I couldn't read it in any other way.
public class GitBash {
public static final String path_bash = "C:/Program Files/Git/git-bash.exe";
// Create a file Output.txt where git-bash prints the results
public static final String path_file_output_git_bash =
"C:/Users/Utente/Documents/IntelliJ-DOC/IntelliJ_project/Prova/src/main/Git-bash/Output.txt";
public static void main(String[] args) {
// Path to your repository
String path_repository = "cd C:/Users/Utente/Documents/Repository-SVN-Git/Bookkeeper";
// Git command you want to run
String git_command = "git ls-files | grep .java | wc -l";
String command = path_repository + " && " + git_command + " > " + path_file_output_git_bash;
runCommand(command);
}
public static void runCommand(String command) {
try {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command(path_bash, "-c", command);
Process process = processBuilder.start();
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println(" --- Command run successfully");
System.out.println(" --- Output = " + readFileTxt());
} else {
System.out.println(" --- Command run unsuccessfully");
}
} catch (IOException | InterruptedException e) {
System.out.println(" --- Interruption in RunCommand: " + e);
// Restore interrupted state
Thread.currentThread().interrupt();
}
}
public static String readFileTxt() {
String data = null;
try {
File myObj = new File(path_file_output_git_bash);
Scanner myReader = new Scanner(myObj);
while (myReader.hasNextLine()) {
data = myReader.nextLine();
}
myReader.close();
} catch (FileNotFoundException e) {
System.out.println(" --- An error occurred");
e.printStackTrace();
}
return data;
}
}
}
--- EDIT 2021/03/26 ---
Answer without the needs of a .txt file : Read output git-bash with ProcessBuilder in Java
As per the below code, I'm trying to get tomcat process id by the port and end that process. I'm given this command in CMD is working but used to java doesn't work. I want to correct way please help me
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("netstat -aon | find /i \"listening\"");
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<OUTPUT>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</OUTPUT>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t) {
t.printStackTrace();
}
If you are using windows it will be like this. I did not tested for linux but it should work I think if you check commented code.
public static void main(String[] args) throws IOException, InterruptedException {
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("cmd /c netstat -ano | findstr 8080");
//for linux
//Process proc = rt.exec("/bin/bash -c netstat -ano |grep 8080");
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(proc.getInputStream()));
String line = null;
System.out.println("<OUTPUT>");
if ((line = bufferedReader.readLine()) != null) {
int processIdString = line.lastIndexOf(" ");
String processId = line.substring(processIdString, line.length());
System.out.println("Your process Id to Kill : " + processId);
rt.exec("cmd /c Taskkill /PID" + processId + " /T /F");
//for linux
//rt.exec("/bin/bash -c kill -9 "+processId);
}
System.out.println("<OUTPUT>");
} catch (Exception e) {
System.out.println("Error Occured");
}
}
I have a problem, i want to run my program with another program with a parameter. in first program, this is the code:
public static void main(String[] args) {
System.out.println("Starting cmd main");
String runPath = args[0];
String path = args[1];
String flagname = args[2];
String lockPath = args[3];
String tampung = args[4];
String command = "cmd.exe "
+ "/C"
+ " cd C:\\Program Files\\WinRAR"
+" && rar a -n "+runPath+tampung+".zip "
+ path+ flagname + " -p"+tampung
+ "\n && rar a -n "+lockPath+tampung+".zip "
+ path+ flagname + " -p"+tampung;
try {
Runtime.getRuntime().exec(command);
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
}
when i try to run in cmd, the program i compiled without any errors. But when i try to call from another program, the program is running but the Runtime not give any result. Here the second program:
public static void main(String[] args) {
String runPath = "E:\\Sementara\\DEVELOPMENT\\SpoolPFileLapBulTBEListener\\FLAG\\RUN\\";
String path = "E:\\Sementara\\DEVELOPMENT\\SpoolPFileLapBulTBEListener\\FLAG\\";
String flagname = "CMDcommand.txt";
String lockPath ="E:\\Sementara\\DEVELOPMENT\\SpoolPFileLapBulTBEListener\\FLAG\\RUN\\LOCK\\";
String tampung = "testing";
String cmd = "C:\\ProgramCmd\\Start.bat" + " " + runPath + " " + path + " "+ flagname + " " + lockPath + " " + tampung;
String[] command = { "cmd.exe", "/c", cmd };
System.out.println("Command: " + cmd);
try {
Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line="";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
process.waitFor();
} catch (IOException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
For the .bat in the first program, i use this:
java CmdMain %1 %2 %3 %4 %5
When i try to running the program, here the result:
Command: C:\ProgramCmd\Start.bat E:\Sementara\DEVELOPMENT\SpoolPFileLapBulTBEListener\FLAG\RUN\ E:\Sementara\DEVELOPMENT\SpoolPFileLapBulTBEListener\FLAG\ CMDcommand.txt E:\Sementara\DEVELOPMENT\SpoolPFileLapBulTBEListener\FLAG\RUN\LOCK\ testing
C:\Users\Agung Rizkiono\Documents\Development\Workspace2\testing2>java CmdMain E:\Sementara\DEVELOPMENT\SpoolPFileLapBulTBEListener\FLAG\RUN\ E:\Sementara\DEVELOPMENT\SpoolPFileLapBulTBEListener\FLAG\ CMDcommand.txt E:\Sementara\DEVELOPMENT\SpoolPFileLapBulTBEListener\FLAG\RUN\LOCK\ testing
How can i try to fix the second program?
Trying to call a C program using Java's process builder but don't know what to call in the process builder call.
Process p = new ProcessBuilder("myCommand", "myArg").start();
For myCommand and myArg, what values would I replace it with for it to run a C Program? The program I want it to call is shown here:
calculator.c:
#include <stdio.h>
int main ()
{
int a = 4;
int b = 2;
int c = a + b;
printf("Result: %d \n", c);
}
If calculator.c has not been compiled yet, you will want to first compile it:
Process compile = new ProcessBuilder("gcc", "calculator.c").start();
Process execute = new ProcessBuilder("./a.out").start();
Any relevant compiler flags (e.g., -O or -o calculator) should be included in the arguments as well. If you do rename the executable, you'll want to change ./a.out with it.
A better way (in terms of having few hard-coded constants) would be to have some variables like:
String c_file = "calculator.c";
String output_exe = "calculator";
Process compile = new ProcessBuilder("gcc", "-o " + output_exe, c_file).start();
Process execute = new ProcessBuilder("./" + output_exe);
Lastly, you'll probably want to make sure each of your processes are exiting without error:
if (compile.getInputStream().read() == -1) {
// that means something was written to stderr, and you can do something like
System.out.error("ERROR!");
System.exit(-1);
}
As #VinayDandekar pointed out, you can also do this with exitValue.
if (compile.exitValue() == -1) {
// that means something was written to stderr, and you can do something like
System.out.error("ERROR!");
System.exit(-1);
}
At First Set Your Compiler Path On Environment Variable From Windows System Property Otherwise It will not work . Then Set Compile And Run Code
Compile Code: `
JFileChooser fileChooser=new JFileChooser();
if (fileChooser.showSaveDialog(compile.this) != JFileChooser.APPROVE_OPTION)
return;
File file = fileChooser.getSelectedFile();
try {
FileWriter out = new FileWriter(file);
textEditor.write(out);
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
String filepath = file.getPath();
String filepath2 = filepath.substring(0, filepath.lastIndexOf(File.separator));
System.out.println(filepath);
System.out.println(filepath2);
String name = file.getName();
String name2 = file.getName().substring(0, file.getName().lastIndexOf("."));
String folder = filepath2+"\\";
String exe = folder+name2+".exe";
System.out.println(exe);
ProcessBuilder pb=new ProcessBuilder();
try {
pb = new ProcessBuilder("cmd", "/C", "gcc " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\"");
pb = new ProcessBuilder("cmd", "/C", "g++ " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\"");
pb.directory(new File(filepath2));
Process p = pb.start();
p.waitFor();
int x = p.exitValue();
if (x == 0) {
area.setForeground(red);
area.setText(" == 0 error.. Compilation Finished");
} else {
BufferedReader r = new BufferedReader(new InputStreamReader(p.getErrorStream()));
//BufferedWriter rm=new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
String out;
area.setText("");
while ((out = r.readLine()) != null)
{
area.setForeground(RED);
area.append(out + System.getProperty("line.separator"));
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
`
Run Code: `
JFileChooser fileChooser=new JFileChooser();
if (fileChooser.showSaveDialog(compile.this) != JFileChooser.APPROVE_OPTION)
return;
File file = fileChooser.getSelectedFile();
try {
FileWriter out = new FileWriter(file);
textEditor.write(out);
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
String filepath = file.getPath();
String filepath2 = filepath.substring(0, filepath.lastIndexOf(File.separator));
System.out.println(filepath);
System.out.println(filepath2);
String name = file.getName();
String name2 = file.getName().substring(0, file.getName().lastIndexOf("."));
String folder = filepath2+"\\";
String exe = folder+name2+".exe";
System.out.println(exe);
ProcessBuilder pb=new ProcessBuilder();
try {
pb = new ProcessBuilder("cmd", "/C", "gcc " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\"");
pb = new ProcessBuilder("cmd", "/C", "g++ " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\"");
pb.directory(new File(filepath2));
Process p = pb.start();
p.waitFor();
int x = p.exitValue();
int z=p.exitValue();
if (x == 0) {
Runtime rt = Runtime.getRuntime();
try {
String username = System.getProperty("user.name");
String c = "#echo off\n" + "\"" +
filepath2 + "\\" + name2 + ".exe\"\n" + "echo.\n" + "echo.\n" + "echo Process Terminated\n" +
"pause\n" +
"exit";
File dir = new File("C:\\Users\\" + username + "\\CodeEditor");
dir.mkdir();
try {
File file2 = new File("C:\\Users\\" + username + "\\CodeEditor" + "\\run.bat");
file2.createNewFile();
PrintWriter writer = new PrintWriter(file2);
writer.println(c);
writer.close();
Process p2 = Runtime.getRuntime().exec("cmd /c start run.bat", null, new File("C:\\Users\\" + username + "\\CodeEditor"));
} catch (Exception ex) {
}
} catch (Exception ex) {
}
} else {
JOptionPane.showMessageDialog(compile.this, "Compilation Error", "Error", JOptionPane.ERROR_MESSAGE);
}
} catch (Exception ex) {
ex.printStackTrace();
}
`
Done!!!
Runtime can be used to execute any command line instruction supported by OS.
Example below would be of help.
package com.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CommandExec {
public static void main(String[] args) {
try {
Process pr = Runtime.getRuntime().exec("ls /etc");
BufferedReader read = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String str = read.readLine();
while (str != null){
System.out.println(str);
str = read.readLine();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
I'm trying to count the number of lines of a text file using a unix command from java code.
My code looks like:
String filePath = "/dir1/testFile.txt";
Runtime rt = Runtime.getRuntime();
Process p;
try {
System.out.println("No: of lines : ");
findLineCount = "cat " + filePath + " | wc -l";
p = rt.exec(findLineCount);
p.waitFor();
} catch (Exception e) {
//code
}
But, nothing is displayed in the console. When I execute the command directly, it works. What could be the issue in the above code?
I suggest you use a ProcessBuilder instead of Runtime.exec. You can also simplify your command by passing the filePath to wc. Please don't swallow Exception(s). Finally, you can use ProcessBuilder.inheritIO() (Sets the source and destination for subprocess standard I/O to be the same as those of the current Java process) like
String filePath = "/dir1/testFile.txt";
try {
System.out.println("No: of lines : ");
ProcessBuilder pb = new ProcessBuilder("wc", "-l", filePath);
pb.inheritIO();
Process p = pb.start();
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
Of course, it's more efficient to count the lines in Java without spawning a new process. Perhaps like,
int count = 0;
String filePath = "/dir1/testFile.txt";
try (Scanner sc = new Scanner(new File(filePath));) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
count++;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.printf("No: of lines : %d%n", count);
When I execute the command directly
I doubt you're execute it "directly". You're probably running it in a shell.
Your code should run that script in a shell too.
rt.exec(new String[]("bash", "-c", findLineCount});
This is how i printed number of lines
public static void main(String[] args) {
try {
Runtime run = Runtime.getRuntime();
String[] env = new String[] { "path=%PATH%;" + "your shell path " }; //path of cigwin bin or any similar application. this is needed only for windows
Process proc = run.exec(new String[] { "bash.exe", "-c", "wc -l < yourfile" }, env);
BufferedReader reader = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
String s;
while ((s = reader.readLine()) != null) {
System.out.println("Number of lines " + s);
}
proc.waitFor();
int exitValue = proc.exitValue();
System.out.println("Status {}" + exitValue);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}