Hello,

While migrating the Apache Maven JAR plugin (apache/maven-jar-plugin#508 
<https://github.com/apache/maven-jar-plugin/pull/508>) to create archives with 
the "jar" tool (via ToolProvider) instead of a library, I ran into a 
documentation inconsistency around the -C option that I would like to check 
before reporting it.

The "jar --help" option description reads

    -C DIR  Change to the specified directory and include the following file

i.e. a single following file, which matches the implementation in 
src/jdk.jartool/share/classes/sun/tools/jar/Main.java (it joins the directory 
to the single next argument). Two other parts of the documentation, however, 
suggest that "-C dir" applies to several following files -- the usage synopsis

    jar [OPTION...] [ [--release VERSION] [-C dir] files] ...

(note "files", plural) and the example

    -C foo/ classes resources

(two operands after one "-C"). The man page, e.g. 
https://docs.oracle.com/en/java/javase/25/docs/specs/man/jar.html, reads the 
same way.

In practice only the operand immediately after "-C" is resolved relative to 
that directory; any further operand is resolved relative to the current working 
directory. For example,

    mkdir d && touch d/a d/b d/c
    jar --create --file x.jar -C d a b c

fails with

    b : no such file or directory
    c : no such file or directory

(only "a" is archived), because "b" and "c" are looked up in the current 
directory rather than in "d".

The forms that work all produce the same archive, with entries a, b and c. One 
can repeat the option before each file,

    jar --create --file x.jar -C d a -C d b -C d c

add the whole directory,

    jar --create --file x.jar -C d .

or write the later operands relative to the current directory,

    jar --create --file x.jar -C d a d/b d/c

where "b" and "c" are found as "d/b" and "d/c", and because the "-C" directory 
"d" is stripped from every matching entry name the entries are still a, b and 
c. What does not work is listing several bare file names after a single "-C 
dir", which is exactly what the synopsis and the example suggest.

I reproduced this identically on Eclipse Temurin 17, 21 and 25, Azul Zulu 17 
and Amazon Corretto 21, on macOS and Linux; the behaviour and the "--help" 
wording are the same everywhere, as expected for the shared jdk.jartool.

The runtime behaviour looks correct and intentional, so this seems to be a 
documentation issue only. It might be enough to adjust the synopsis so that 
each "-C dir" binds to a single following operand, to correct the "-C foo/ 
classes resources" example (for instance "-C foo/ ."), to align the man page, 
and perhaps to add a note that several inputs relative to a directory require 
repeating "-C dir" per input or using "-C dir .”. 

I do not have JBS credentials to file this myself; could someone confirm 
whether it is worth a documentation issue and, if so, file it?
BTW: Filing bug reports via https://bugreport.java.com/bugreport didn’t work in 
the last 24 hours.

Thanks,
Gerd Aschemann

--
Gerd Aschemann (er/he) --- Veröffentlichen heißt Verändern (Carmen Thomas)
+49/173/3264070 -- [email protected] -- https://aschemann.net

Reply via email to