Thanks for the precision. I wasn't aware of that detail. On Tue, 6 Feb 2024 at 05:24, Michal Politowski wrote: > Dnia Mon, 5 Feb 2024 21:47:48 -0500, Henri Tremblay napisał(a): > > Yes. > > Let's say you have a file in a directory: > > "src/main/java/org/zsh/Main.java". The class is named Main and is in the > > package org.zsh in this case. > > If you compile it with "javac src/main/java/org/zsh/Main.java" it will > > generate a file named "src/main/java/org/zsh/Main.class". > > > > So, if you execute it the old way, you would do "java -cp src/main/java > > org.zsh.Main" which means "Please execute the class with a main() method > > that is called Main and found in the package org.zsh. The classpath where > > this class can be found is "src/main". > > > > If you execute it the new way, you don't need to compile with javac. So > you > > only have "src/main/java/org/zsh/Main.java". > > And you will execute by doing "java src/main/java/org/zsh/Main.java" and > > that's it. > > > > Bottom line, indeed, the ".java" at the end tells that it's a java source > > file and not a compile class found in the classpath that you want to > > execute. > > Not exactly. You can have a class named java on the classpath. > > The precise behaviour as specified here > https://openjdk.org/jeps/330#Description > (since Java 11) seems to be: if the first non-option argument is > - a name of an existing file with .java extension, or > - a name of an existing file and the --source option is given > then compile/run the source. > > > On Mon, 5 Feb 2024 at 15:44, Bart Schaefer > > wrote: > > > > > On Mon, Feb 5, 2024 at 10:04 AM Henri Tremblay < > henri.tremblay@gmail.com> > > > wrote: > > > > > > > > Java now supports (since Java 10 I think) command lines like > > > > > > > > java Math.java > > > > > > > > It will then just compile and launch that java file. But zsh won't > > > autocomplete for that. It only wants a jar, class file or whatever. > > > > > > The issue is here in the _arguments setup for _java: > > > > > > '(-):class:_java_class -m main > ${(kv)opt_args[(i)(-classpath|-cp)]}' \ > > > '*::args:= _normal' \ > > > && return 0 > > > > > > The (-) says that the first word after "java" must either be an option > > > (start with "-") or must be a class name. The completion stops there > > > unless working on the next word. > > > > > > How does "java" itself distinguish between a class name and a file > > > name? Just whether the string ends in ".java"? > > > > > -- > Michał Politowski > Talking has been known to lead to communication if practiced carelessly. > >