13
java.io.IOException: Cannot run program "yarn": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:450)
    at java.lang.Runtime.exec(Runtime.java:347)
    at com.Main.main(Main.java:32)

Hi there, I have a weird problem when execute a command using Java. I used the following code to run a command, if I run mkdir testFolder, the program run successful, but if I changed the command like yarn -v then error happen.

try {
    Process process = Runtime.getRuntime().exec("yarn -v");//, null, new File("/Users/macos/Desktop/TestProj/"));
} catch (IOException ex) {
    ex.printStackTrace();
}

P/s: In debug mode: IntelliJ could run above code, but Netbeans failed.

In production mode (jar file): IntelliJ failed too.

Edit 2:

  MACs-MacBook-Pro:~ macos$ which pwd
    /bin/pwd
    MACs-MacBook-Pro:~ macos$ which mkdir
    /bin/mkdir
    MACs-MacBook-Pro:~ macos$ which java
    /usr/bin/java
    MACs-MacBook-Pro:~ macos$ which yarn
    /usr/local/bin/yarn

I found that if I run a command that is in /bin or /usr/bin, the code run ok (pwd, mkdir, java -version ...), but yarn is in /usr/local/bin/, so it didn't work, and I still don't know how to fix.

18
  • 2
    Do you have yarn installed on your machine? Commented Feb 18, 2019 at 7:52
  • 1
    Have you tried separating the executable from its parameters? I don't know if that is an issue when using Runtime, but it is when using a ProcessBuilder. Commented Feb 18, 2019 at 7:52
  • @vahdet yarn is installed and I can run that command using command line Commented Feb 18, 2019 at 8:14
  • 1
    @SomeName I just have a search for strace, but it may unavailable on mac Commented Feb 18, 2019 at 8:31
  • 1
    Quick googling shows that DTrace can be used for the purpose. Also this might be related stackoverflow.com/questions/31045575/… Commented Feb 18, 2019 at 8:35

5 Answers 5

12

I finally found the answer, because the Process I start is different with the process of the terminal, so can't access /usr/local/bin, have to add -l to run the command as logged in user. Runtime.getRuntime().exec(new String[]{"bash", "-l", "-c", cmd}, null, new File(f))

Sign up to request clarification or add additional context in comments.

Comments

1

As error code 2 suggests you specified a path incorrectly. The error code corresponds to POSIX ENOENT and "No such file or directory" its char * strerror(int errno) representation.

To troubleshoot the problem by yourself you can read the manual page http://man7.org/linux/man-pages/man2/execve.2.html

The relevant section is:

ENOENT

The file filename or a script or ELF interpreter does not exist, or a shared library needed for the file or interpreter cannot be found.

To see with which particula path your process is strarted run java witj strace -f

Comments

0

In my case, I was using an ANT script that at some point called javac task with a fork=true attribute. Inspired by maphongba008 answer I deleted that fork, and so I stopped getting this same error.

Comments

0

I too faced for the same "Process p = Runtime.getRuntime().exec(cmd);".

Other solutions didn't worked as everything was correct and as expected.

I was using the downloaded JDK as Installed JRE's in eclipse and facing error.

Then I tried to search the JDK which is installed by sudo apt which resides in

/usr/lib/jvm/java-11-openjdk-amd64

Upon selecting this JDK, everything started working fine.

enter image description here

Comments

-3

This worked for me:

npm install -g yarn

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.