There are several reasons to consider updating,  foremost in my mind is the
changes coming as part of CRA in Europe.  IANAL, but I don't think that
non-maintained code will meet the CRA requirements, nor will code
maintained by a single individual.

Our best approach may be to try to get picocli merged into commons-cli (I
have done a fair amount of work on commons-cli recently and would be
willing to assist in this effort) or get picocli under the ASF umbrella,
assuming that Remko wants to do either of these things.

I believe that subcommands would be a welcome addition to commons-cli.  An
annotation processor likewise may also be welcomed.

Claude


On Tue, Jul 16, 2024 at 10:14 AM Aleksey Yeshchenko <alek...@apple.com>
wrote:

> Hi Maxim,
>
> I think I’m not fully sold on the need to do anything at all here. The
> library may no longer be maintained, but so what if it isn’t, really?
>
> Parsing command line arguments is a pretty well defined problem, it’s not
> the kind of code that rots and needs to be updated to stay operational. If
> it works now it will keep working.
>
> Why would we have to update it sooner or later?
>
> I might be missing something, of course, but what are our pain points with
> airlift/airline in its current state?
>
> —
> AY
>
> > On 16 Jul 2024, at 02:07, Remko Popma <rpo...@apache.org> wrote:
> >
> > Hi Maxim, thank you for letting me know of this discussion.
> >
> > Hello everyone,
> >
> > I developed and maintain picocli; let me try to address the concerns
> raised below.
> >
> > For background, I am on the PMC for Apache Logging Services (mostly
> involved with Log4j), and on the PMC for Apache Groovy.
> > My involvement in these projects is why I chose the Apache 2.0 license.
> Apache is close to my heart and I have no intention to switch to another
> license.
> >
> > The picocli documentation mentions it is possible to incorporate picocli
> in one’s project by copying a single source file. This is not meant as a
> recommendation (I should probably clarify this in the docs). Some
> people/projects have resistance to using an external dependency for command
> line parsing and I thought this would alleviate that concern and make it
> easier for picocli to gain more adoption.
> > If you were to select picocli for Cassandra, I would recommend adding it
> as an external dependency via Maven or Gradle.
> >
> > I hope this is useful.
> >
> > Warmly,
> > Remko Popma
> >
> >
> >
> > On 2024/07/15 18:53:47 Maxim Muzafarov wrote:
> >> Hello everyone,
> >>
> >>
> >> I want to continue the discussion that was originally started here
> >> [2], however, it's better to move it to a new thread with an
> >> appropriate title, so that everyone is aware of the replacement
> >> library we're trying to agree on.
> >>
> >> The question is:
> >> Does everyone agree with using Picocli as an airlift/airline
> >> replacement for our cli tools?
> >> The prototype to look at is here [1].
> >>
> >>
> >> The reasons are as follows:
> >>
> >> Why to replace?
> >>
> >> There are several cli tools that rely on the airlift/airline library
> >> to mark up the commands: NodeTool, JMXTool, FullQueryLogTool,
> >> CompactionStress (with the size of the NodeTool dominating the rest of
> >> the tools). The airline is no longer maintained, so we will have to
> >> update it sooner or later anyway.
> >>
> >>
> >> What criteria?
> >>
> >> Before we dive into the pros and cons of each candidate, I think we
> >> have to formulate criteria for the libraries we are considering, based
> >> on what we already have in the source code (from Cassandra's
> >> perspective). This in itself limits the libraries we can consider.
> >>
> >> Criteria can be as follows:
> >> - Library licensing, including risks that it may change in the future
> >> (the asf libs are the safest for us from this perspective);
> >> - Similarity of library design (to the airline). This means that the
> >> closer the libraries are, the easier it is to migrate to them, and the
> >> easier it is to get guarantees that we haven't broken anything. The
> >> further away the libraries are, the more extra code and testing we
> >> need;
> >> - Backward compatibility. The ideal case is where the user doesn't
> >> even notice that a different library is being used under the hood.
> >> This includes both the help output and command output.
> >>
> >> Of course, all libraries need to be known and well-maintained.
> >>
> >> What candidates?
> >>
> >>
> >> Picocli
> >> https://picocli.info/
> >>
> >> This is the well-known cli library under the Apache 2.0 license, which
> >> is similar to what we have in source code right now. This also means
> >> that the amount of changes (despite the number of the commands)
> >> required to migrate what we have is quite small.
> >> In particular, I would like to point out that:
> >> - It allows us to unbind the jmx-specific command options from the
> >> commands themselves, so that they can be reused in other APIs (my
> >> goal);
> >> - We can customize the help output so that the user doesn't notice
> >> anything while using of the nodetool;
> >> - The cli parser is the same as what we now do with cli arguments.
> >>
> >> This makes the library a good candidate, but leaves open the question
> >> of changing the license of the lib in the future. However, these risks
> >> are relatively small because the CLI library is not a monetizable
> >> thing, as I believe. We can also mitigate the risks copying the lib to
> >> sources, as it mentioned here:
> >> https://picocli.info/#_getting_started
> >>
> >>
> >> commons-cli
> >> https://commons.apache.org/proper/commons-cli/
> >>
> >> In terms of licenses, it is the easiest candidate for us to use as
> >> it's under the asf, and in fact the library is already used in e.g.
> >> BulkLoader, SSTableExpoert.
> >> However, I'd like to point out the following disadvantages the library
> >> has for our case:
> >> - This is not a drop-in replacement for the airline commands, as the
> >> lib does not have annotation for markup commands. We have to flesh out
> >> all the options we have as java classes, or create our owns;
> >> - Subcommands have to be supported manually, which requires extra
> >> effort to adopt the cli parser (correct me if I'm wrong here). We have
> >> at least several subcommands in the NodeTool e.g. cms describe, cms
> >> snapshot;
> >> - Apart from parsing the cli arguments, we need to manually initialize
> >> the command class and set the input arguments we have.
> >>
> >>
> >> JComannder
> >> https://jcommander.org/
> >>
> >> The library is licensed under the Apache 2.0 license, so the situation
> >> is the same as for Picocli. Here I'd like to point out a few things I
> >> encountered while prototyping:
> >> - Unbinding the jmx-specific options from commands is quite tricky and
> >> requires touching an internal API (which I won't do). Option
> >> inheritance is not the way to go if we want to have a clear command
> >> hierarchy regardless of the API used.
> >> - We won't be able to inject a Logger (the Output class in terms of
> >> NodeTool) or other abstractions (e.g. MBeans) directly into the
> >> commands, because it doesn't support dependency injection. This is
> >> also part of the activity of reusing the commands in other APIs, for
> >> instance to execute them via CQL;
> >>
> >> More basic in comparison to the Picocli, focusing primarily on simple
> >> annotation-based parsing and subcommands, and won't allow us to reuse
> >> the commands outside of the cli.
> >>
> >>
> >> airline2
> >> https://github.com/rvesse/airline
> >>
> >> The library is licensed under the Apache 2.0 license, and this is an
> >> attempt to rebuild the original airline library. Currently, this is
> >> not a drop-in replacement, as it has some minor API differences from
> >> the original library. It is also not a better choice for us, as it has
> >> the same drawbacks I mentioned for the previous alternatives, e.g. not
> >> possible to unbind the specific options from the command and use them
> >> only when commands are called from the cli.
> >>
> >>
> >>
> >>
> >> [1] https://github.com/apache/cassandra/pull/2497/files
> >> [2] https://lists.apache.org/thread/m9wfb3gdo9s210824c9rm2ojc9qv9412
> >>
>
>

Reply via email to