This is due to your classpath, which will default to the current directory. When you run java Main
from /home/user/program
it finds the class in the current directory (since the package seems to be unset, meaning it is the default). Hence, it finds the class in /home/user/program/Main.class
.
Running java /home/user/program/Main
from /home
tries to find the class in the classpath (the current directory) which will look in /home/home/user/program
expecting to find the file Main.class
containing a definition of the Main
class with package .home.user.program
.
Extra detail: I think the java
launcher is trying to be nice by
converting /-notation for a classname
to the .-notation; and when you run
java /home/user/program/Main
it is
actually runningjava
for you. This
.home.user.program.Main
is because you shouldn’t be specifying
a file, but a fully specified
classname (ie including package
specifier). And when a class has a package
java expects to find that class within a
directory structure that matches the package
name, inside a directory (or jar) in the
classpath; hence, it will try to look in
/home/home/user/program
for the class file
You can fix it by specifying your classpath with -cp
or -classpath
:
java -cp /home/user/program Main