You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2020/10/08 05:21:13 UTC

[james-project] branch master updated (a7a6546 -> ad72940)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from a7a6546  JAMES-3382 Email/query limit & position integration test fix
     new c9f0b7c  JAMES-3400 Architecture Decision Record for new James CLI
     new 170bf0d  JAMES-3400 Add README.md for James CLI based on webadmin endpoints.
     new c96bbe9  Update project roadmap
     new a587090  [ADR] Applicative read repairs (POC mailbox & mailbox-counters)
     new ad72940  JAMES-3399 Allow JSON logging with logback

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                        |  10 ++
 server/container/guice/cassandra-guice/pom.xml |   8 ++
 server/container/guice/jpa-guice/pom.xml       |   8 ++
 server/container/guice/memory-guice/pom.xml    |   8 ++
 server/protocols/webadmin-cli/README.md        | 126 +++++++++++++++++++++++++
 src/adr/0042-applicative-read-repairs.md       | 101 ++++++++++++++++++++
 src/adr/0042-james-cli-based-on-webadmin.md    |  84 +++++++++++++++++
 src/homepage/index.html                        |  16 +++-
 8 files changed, 357 insertions(+), 4 deletions(-)
 create mode 100644 server/protocols/webadmin-cli/README.md
 create mode 100644 src/adr/0042-applicative-read-repairs.md
 create mode 100644 src/adr/0042-james-cli-based-on-webadmin.md


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 01/05: JAMES-3400 Architecture Decision Record for new James CLI

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c9f0b7c5f0a371cffbfe73188bd9e002a5c3eb07
Author: QuanTH <hq...@linagora.com>
AuthorDate: Mon Oct 5 10:52:43 2020 +0700

    JAMES-3400 Architecture Decision Record for new James CLI
---
 src/adr/0042-james-cli-based-on-webadmin.md | 83 +++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)

diff --git a/src/adr/0042-james-cli-based-on-webadmin.md b/src/adr/0042-james-cli-based-on-webadmin.md
new file mode 100644
index 0000000..d7d0061
--- /dev/null
+++ b/src/adr/0042-james-cli-based-on-webadmin.md
@@ -0,0 +1,83 @@
+# 42. James CLI based on webadmin API
+
+Date: 2020-10-05
+
+## Status
+
+Accepted (lazy consensus).
+
+## Context
+
+James servers offer a command-line interface in order to interact with the server. However, it relies on the JMX protocol, which is known to be insecure. The JMX server embedded in Apache James, also used by the command line client is exposed to a java de-serialization issue according to [NVD-CVE-2017-12628 Detail](https://nvd.nist.gov/vuln/detail/CVE-2017-12628), and thus can be used to execute arbitrary commands. 
+
+Besides, the current CLI interface is also not optimal for users. It places actions in front of entities with contiguous syntax, making it harder for the user to remember the command (for example, which entity the GET action command can interact with). If we design to place the entity first and the outgoing actions can interact with that entity afterward, the user will easily imagine what he/she can do with each entity. This creates an intuitive interface that is easier to remember.
+
+Webadmin APIs use HTTP protocol, which is more secure than JMX protocol to interact with James servers.
+
+Webadmin command-line interface is an upcoming replacement for the outdated, security-vulnerable JMX command-line interface. 
+
+## Decision
+
+We decided to write a new CLI client, running on top of the JVM, communicating with James via the webadmin protocol, using http.
+
+* What libraries will we use? 
+
+  * http client: ***Feign library***. We used it as an http client in other parts of James so we continue to use it.
+
+  * CLI: ***Picocli library***. Picocli is a one-file command line parsing framework written in Java that allows us to create command line applications with almost no code. It allows mixing Options with positional Parameters (Eg: no need to the follow order Options then Parameters), [automatic type conversion](https://picocli.info/#_strongly_typed_everything) of command line arguments to the type of the annotated field, provide Automatic Help and better Subcommand Support, easily handle  [...]
+
+* How will we limit breaking changes this new CLI will cause?
+
+  * Work on a wrapper to adapt the old CLI API.
+
+* Where will we locate this cli code?
+
+  * server/protocols/webadmin-cli
+
+* Distribute this CLI as a GraalVM native image.
+
+* Write a man page.
+
+  * Picocli generates beautiful documentation for our CLI (HTML, PDF and Unix man pages).
+
+* We decided to adopt a more modern, modular CLI syntax:
+
+```   
+$ java -jar james_cli.jar [OPTION] ENTITY ACTION {ARGUMENT}
+```
+where
+
+    OPTION: optional parameter when running the command line,
+  
+    ENTITY: represents the entity to perform action on,
+  
+    ACTION: name of the action to perform,
+  
+    ARGUMENT: arguments needed for the action.
+
+#### Examples
+
+Add a domain to the domain list.
+```
+$ java -jar james_cli.jar --url http://127.0.0.1 --port 9999 domain create domainNameToBeCreated
+```
+
+In above command-line 
+
+    OPTION: --url http://127.0.0.1 --port 9999
+  
+    ENTITY: domain
+  
+    ACTION: create
+  
+    ARGUMENT: domainNameToBeCreated
+
+
+## Consequences
+
+It aims at providing a more modern and more secure CLI, also bringing compatibility ability with old CLI.
+
+## References
+* [NVD-CVE-2017-12628 Detail](https://nvd.nist.gov/vuln/detail/CVE-2017-12628)
+* [Picocli 2.0: Do More With Less](https://dzone.com/articles/whats-new-in-picocli-20)
+* [Picocli Homepage](https://picocli.info/)
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 03/05: Update project roadmap

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c96bbe95eaf5e7ebfa28665e666eecab61fea11f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Sep 1 10:23:29 2020 +0700

    Update project roadmap
---
 src/homepage/index.html | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/homepage/index.html b/src/homepage/index.html
index 72c1502..1c57967 100644
--- a/src/homepage/index.html
+++ b/src/homepage/index.html
@@ -154,14 +154,22 @@ WHAT WILL YOU TRY:</b><br>
               </li>
               <li class="post-template"><span><b>INCOMING FEATURES</b><br>
                 <ul>
-                  <li><span class="long-arrow-right">&#8594;</span><span><b>Blobs garbage collector</b>:
-                    the deduplication mechanism used to save some spaces makes it complicated to remove blobs. We are implementing a
-                    garbage collector responsible for removing the no more used blobs.
-                    See this <a href="https://github.com/linagora/james-project/pull/3122">ADR</a> (Architecture Decision Record) for more explanation.</span></li>
+                  <li><span class="long-arrow-right">&#8594;</span><span>Rework our documentation with <a href="https://antora.org/">Antora</a>,
+                    specify it on a per-server basis for ease of use.<br/>
+                    We will furthermore target servers to identified use cases, formulated in non technical terms: Basic Server, Advanced Server and Distributed Server.<br/>
+                    Spring server will be deprecated. A summary of community call describing this item can be found
+                    <a href="https://www.mail-archive.com/server-dev@james.apache.org/msg67212.html">here</a>.</span></li>
+                  <li><span class="long-arrow-right">&#8594;</span><span>Improve developper experience with a migration to the Gradle
+                    build system and Apache hosted automated builds. A summary of community call describing this item can be found
+                    <a href="https://www.mail-archive.com/server-dev@james.apache.org/msg67212.html">here</a>.</span></li>
                   <li><span class="long-arrow-right">&#8594;</span><span>Update the currently implemented JMAP draft specification
                     to the <b>new JMAP RFC</b>. See this
                     <a href="https://github.com/apache/james-project/blob/master/src/adr/0018-jmap-new-specs.md">ADR</a>
                     for more information.</span></li>
+                   <li><span class="long-arrow-right">&#8594;</span><span><b>Blobs garbage collector</b>:
+                    the deduplication mechanism used to save some spaces makes it complicated to remove blobs. We are implementing a
+                    garbage collector responsible for removing the no more used blobs.
+                    See this <a href="https://github.com/linagora/james-project/pull/3122">ADR</a> (Architecture Decision Record) for more explanation.</span></li>
                   <li><span class="long-arrow-right">&#8594;</span><span>Enhance our eventual consistency model by providing
                     <b>tools for reparing projections</b>. See this
                     <a href="https://github.com/linagora/james-project/pull/3125">discussion</a> for more information.</span></li>


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 04/05: [ADR] Applicative read repairs (POC mailbox & mailbox-counters)

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit a58709022caf0efa3983ed531a92e42c8a09b2ff
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Sep 25 13:18:15 2020 +0700

    [ADR] Applicative read repairs (POC mailbox & mailbox-counters)
---
 src/adr/0042-applicative-read-repairs.md | 101 +++++++++++++++++++++++++++++++
 1 file changed, 101 insertions(+)

diff --git a/src/adr/0042-applicative-read-repairs.md b/src/adr/0042-applicative-read-repairs.md
new file mode 100644
index 0000000..3f5bc58
--- /dev/null
+++ b/src/adr/0042-applicative-read-repairs.md
@@ -0,0 +1,101 @@
+# 42. Applicative read repairs (POC mailbox & mailbox-counters)
+
+Date: 2020-09-25
+
+## Status
+
+Adopted (lazy consensus)
+
+Completes [20. Cassandra Mailbox object consistency](0020-cassandra-mailbox-object-consistency.md),
+[23. Cassandra Mailbox Counters inconsistencies](0023-cassandra-mailbox-counters-inconsistencies.md)
+
+## Context
+
+Cassandra eventual consistency is all about "replication", but "denormalization" consistency needs
+to be handled at the applicative layer (due to the lack of transactions in a NoSQL database).
+
+In the past we did set up "Solve inconsistency" tasks that can be assimilated to Cassandra repairs. Such
+tasks, after being scheduled, ensure that the according entity denormalization is correctly denormalized.
+
+However, the inconsistencies persist between runs. We experienced inconsistencies in some production platform
+for both the mailbox entity, and the mailbox counter entity (whose table structure is exposed in
+[these](0020-cassandra-mailbox-object-consistency.md), [ADRs](0023-cassandra-mailbox-counters-inconsistencies.md)).
+Monitoring is required to detect when to run them and is time consuming for the platform administrator.
+Given a large dataset, it could even be impossible to run such tasks in a timely fashion.
+
+Another classic eventual consistency mechanism, that enables auto-healing is read-repair. Randomly piggy back upon reads
+synchronous or asynchronous consistency checks. If missed a repair is performed.
+
+In order to achieve denormalization auto-healing, we thus need to implement "applicative read repairs".
+
+## Decision
+
+Provide a Proof of concept for "Applicative read repairs" for the mailbox and mailbox-counters entities.
+
+This enables read path simplification (and performance enhancements) for the mailbox object.
+
+IMAP LIST should not read mailbox counters. This information is uneeded and we should avoid paying the
+price of read repairs for this operation.
+
+Provide a comprehensive documentation page regarding "Distributed James consistency model".
+
+## Consequences
+
+The expected **auto-healing** inconsistencies on existing deployments (at a limited configuration cost).
+This should ease operation of the Distributed James server.
+
+A configuration for James Distributed server will be added to control read repairs, per entity.
+
+## Alternatives
+
+Cassandra provides some alternative by itself:
+
+ - Secondary indexes avoids the denormalization in the first place. However they are not efficient in
+ a distributed environment as each node needs to be queried, which limits ability to scale.
+ - Materialized view enables Cassandra to maintain a projection on the behalf of the application,
+ coming with an expensive write cost, requiring synchronisation, not fit for complex denormalization
+ (like the message one: the primary key of the originating table needs to appear in the materialized
+ view primary key). Most of all, the updates are performed asynchronously. This mechanism is considered experimental.
+ - Cassandra BATCH suffers from the following downsides:
+   - A batch containing conditional updates can only operate within a single partition
+   - It is unadvised to update many partitions in a single batch, and keep the cardinality low for performance reasons
+
+BATCH could be a good option to keep tables synchronized, but does not apply to mailboxes (conditional update) nor
+counters.
+
+We already propose several tasks to solve denormalization inconsistencies. "Applicative read repairs" should be
+seen as a complement to it.
+
+Another classical mechanism in eventual consistent system is called hinted-handoff. It consists at retries
+(during a given period) when "replicating" data to other replica. We also already have a similar mechanism
+in James as we retry several times failures when writing data to denormalization table. Hard shut-down however
+defeats this strategy that is otherwise efficient to limit inconsistencies across denormalization tables.
+
+## References
+
+ - [Read repairs in Cassandra](https://cassandra.apache.org/doc/latest/operating/read_repair.html)
+ - [20. Cassandra Mailbox object consistency](0020-cassandra-mailbox-object-consistency.md)
+ - [23. Cassandra Mailbox Counters inconsistencies](0023-cassandra-mailbox-counters-inconsistencies.md)
+ - [Hinted handoff](https://cassandra.apache.org/doc/latest/operating/hints.html)
+ - [This link documents materialized views limitations](https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/knownLimitationsMV.html)
+ - [Materialized views considered experimental](https://www.mail-archive.com/user@cassandra.apache.org/msg54073.html)
+ - [CQL Batch](https://docs.datastax.com/en/cql-oss/3.x/cql/cql_reference/cqlBatch.html)
+
+Especially:
+
+```
+Materialized View Limitations:
+
+    All updates to the view happen asynchronously unless corresponding view replica is the same node.
+    We must do this to ensure availability is not compromised.  It's easy to imagine a worst case
+    scenario of 10 Materialized Views for which each update to the base table requires writing to 10
+    separate nodes. Under normal operation views will see the data quickly and there are new metrics to
+    track it (ViewWriteMetrics).
+
+    There is no read repair between the views and the base table.  Meaning a read repair on the view will
+    only correct that view's data not the base table's data.  If you are reading from the base table though,
+    read repair will send updates to the base and the view.
+
+    Mutations on a base table partition must happen sequentially per replica if the mutation touches
+    a column in a view (this will improve after ticket CASSANDRA-10307)
+```


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 05/05: JAMES-3399 Allow JSON logging with logback

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit ad729403a971f08a0bdc450788e083846c64c103
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 8 08:30:25 2020 +0700

    JAMES-3399 Allow JSON logging with logback
---
 pom.xml                                        | 10 ++++++++++
 server/container/guice/cassandra-guice/pom.xml |  8 ++++++++
 server/container/guice/jpa-guice/pom.xml       |  8 ++++++++
 server/container/guice/memory-guice/pom.xml    |  8 ++++++++
 4 files changed, 34 insertions(+)

diff --git a/pom.xml b/pom.xml
index ecbad38..3ffa5b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1943,6 +1943,16 @@
                 <version>${logback.version}</version>
             </dependency>
             <dependency>
+                <groupId>ch.qos.logback.contrib</groupId>
+                <artifactId>logback-jackson</artifactId>
+                <version>0.1.5</version>
+            </dependency>
+            <dependency>
+                <groupId>ch.qos.logback.contrib</groupId>
+                <artifactId>logback-json-classic</artifactId>
+                <version>0.1.5</version>
+            </dependency>
+            <dependency>
                 <groupId>com.beetstra.jutf7</groupId>
                 <artifactId>jutf7</artifactId>
                 <version>${jutf7.version}</version>
diff --git a/server/container/guice/cassandra-guice/pom.xml b/server/container/guice/cassandra-guice/pom.xml
index 7413af1..c29be3b 100644
--- a/server/container/guice/cassandra-guice/pom.xml
+++ b/server/container/guice/cassandra-guice/pom.xml
@@ -300,6 +300,14 @@
             <artifactId>logback-classic</artifactId>
         </dependency>
         <dependency>
+            <groupId>ch.qos.logback.contrib</groupId>
+            <artifactId>logback-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback.contrib</groupId>
+            <artifactId>logback-json-classic</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.linagora</groupId>
             <artifactId>logback-elasticsearch-appender</artifactId>
         </dependency>
diff --git a/server/container/guice/jpa-guice/pom.xml b/server/container/guice/jpa-guice/pom.xml
index 2b7fef3..31e1304 100644
--- a/server/container/guice/jpa-guice/pom.xml
+++ b/server/container/guice/jpa-guice/pom.xml
@@ -172,6 +172,14 @@
             <artifactId>logback-classic</artifactId>
         </dependency>
         <dependency>
+            <groupId>ch.qos.logback.contrib</groupId>
+            <artifactId>logback-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback.contrib</groupId>
+            <artifactId>logback-json-classic</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.linagora</groupId>
             <artifactId>logback-elasticsearch-appender</artifactId>
         </dependency>
diff --git a/server/container/guice/memory-guice/pom.xml b/server/container/guice/memory-guice/pom.xml
index 3acfd83..53f6cf0 100644
--- a/server/container/guice/memory-guice/pom.xml
+++ b/server/container/guice/memory-guice/pom.xml
@@ -209,6 +209,14 @@
             <artifactId>logback-classic</artifactId>
         </dependency>
         <dependency>
+            <groupId>ch.qos.logback.contrib</groupId>
+            <artifactId>logback-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback.contrib</groupId>
+            <artifactId>logback-json-classic</artifactId>
+        </dependency>
+        <dependency>
             <groupId>io.rest-assured</groupId>
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 02/05: JAMES-3400 Add README.md for James CLI based on webadmin endpoints.

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 170bf0dcc277210a159bddea90986cf5b14be26e
Author: QuanTH <hq...@linagora.com>
AuthorDate: Mon Oct 5 16:47:19 2020 +0700

    JAMES-3400 Add README.md for James CLI based on webadmin endpoints.
---
 server/protocols/webadmin-cli/README.md     | 126 ++++++++++++++++++++++++++++
 src/adr/0042-james-cli-based-on-webadmin.md |   7 +-
 2 files changed, 130 insertions(+), 3 deletions(-)

diff --git a/server/protocols/webadmin-cli/README.md b/server/protocols/webadmin-cli/README.md
new file mode 100644
index 0000000..3b4e5d0
--- /dev/null
+++ b/server/protocols/webadmin-cli/README.md
@@ -0,0 +1,126 @@
+# A WebAdmin based CLI for Apache James
+
+## Development
+
+Webadmin command-line interface is an upcoming replacement for the outdated, security-vulnerable JMX command-line interface. It also aims at providing a more modern and intuitive interface.
+
+## Run the command line
+
+## Syntax
+
+General syntax to run the command line
+
+```   
+$ james-cli [OPTION] ENTITY ACTION {ARGUMENT}
+```
+
+where
+
+    OPTION: optional parameter when running the command line,
+  
+    ENTITY: represents the entity to perform action on,
+  
+    ACTION: name of the action to perform,
+  
+    ARGUMENT: arguments needed for the action.
+
+Example: 
+```
+$ james-cli --url http://127.0.0.1 --port 9999 domain list
+```
+
+The above command lists all domain names available on domain route at address http://127.0.0.1:9999. 
+It does not require any argument to execute. Options --url and --port are optional. Without them, the default value is http://127.0.0.0:8000.
+As for other commands, arguments might be required after the sub-command (ACTION such as list, add and remove).
+
+## Navigation menu
+
+- [Manage Domains](#manage-domains)
+   - [Create a domain](#create-a-domain)
+   - [Delete a domain](#delete-a-domain)
+   - [Check if a domain exists](#check-if-a-domain-exists)
+   - [Get the list of domains](#get-the-list-of-domains)
+- [Manage Users](#manage-users) 
+   - [Create an user](#create-a-user)
+   - [Test an user existence](#test-a-user-existence)
+   - [Delete an user](#delete-a-user)
+   - [Get users list](#get-users-list)
+   - [Update an user password](#update-a-user-password)
+
+## Manage Domains
+
+### Create a domain
+Add a domain to the domain list.
+```
+james-cli domain create <domainToBeCreated>
+```
+Resource name **domainToBeCreated**:
+
+- can not be null or empty
+- can not contain ‘@’
+- can not be more than 255 characters
+- can not contain ‘/’
+
+### Delete a domain
+
+Remove a domain from the domain list.
+```
+james-cli domain delete <domainToBeDeleted>
+```
+Note: Deletion of an auto-detected domain, default domain or of an auto-detected ip is not supported. We encourage you instead to review your [domain list configuration](https://james.apache.org/server/config-domainlist.html).
+
+### Check if a domain exists
+Check whether a domain exists on the domain list or not.
+```
+james-cli domain exist <domainToBeChecked>
+```
+
+### Get the list of domains
+Show all domains' name on the list.
+```
+james-cli domain list
+```
+
+
+
+## Manage Users
+
+### Create an user
+
+Add an user to the user list.
+```
+james-cli user create <username> <password>
+```
+Resource name <username> representing valid users, hence it should match the criteria at [User Repositories documentation](https://james.apache.org/server/config-users.html)
+
+Note: if the user exists already, its password will be updated.
+
+### Test an user existence
+
+Check whether an user exists on the user list or not.
+```
+james-cli user exist <username>
+```
+Resource name <username> representing valid users, hence it should match the criteria at [User Repositories documentation](https://james.apache.org/server/config-users.html)
+
+### Delete an user
+
+Remove an user from the user list.
+```
+james-cli user delete <username>
+```
+
+### Get users list
+
+Show all users' name on the list.
+
+```
+james-cli user list
+```
+
+### Update an user password
+Same as Create, but an user need to exist.
+
+If the user do not exist, then it will be created.
+
+
diff --git a/src/adr/0042-james-cli-based-on-webadmin.md b/src/adr/0042-james-cli-based-on-webadmin.md
index d7d0061..52b1c9d 100644
--- a/src/adr/0042-james-cli-based-on-webadmin.md
+++ b/src/adr/0042-james-cli-based-on-webadmin.md
@@ -43,7 +43,7 @@ We decided to write a new CLI client, running on top of the JVM, communicating w
 * We decided to adopt a more modern, modular CLI syntax:
 
 ```   
-$ java -jar james_cli.jar [OPTION] ENTITY ACTION {ARGUMENT}
+$ james-cli [OPTION] ENTITY ACTION {ARGUMENT}
 ```
 where
 
@@ -59,7 +59,7 @@ where
 
 Add a domain to the domain list.
 ```
-$ java -jar james_cli.jar --url http://127.0.0.1 --port 9999 domain create domainNameToBeCreated
+$ james-cli --url http://127.0.0.1 --port 9999 domain create domainNameToBeCreated
 ```
 
 In above command-line 
@@ -80,4 +80,5 @@ It aims at providing a more modern and more secure CLI, also bringing compatibil
 ## References
 * [NVD-CVE-2017-12628 Detail](https://nvd.nist.gov/vuln/detail/CVE-2017-12628)
 * [Picocli 2.0: Do More With Less](https://dzone.com/articles/whats-new-in-picocli-20)
-* [Picocli Homepage](https://picocli.info/)
\ No newline at end of file
+* [Picocli Homepage](https://picocli.info/)
+* [Native Image Maven Plugin](https://www.graalvm.org/reference-manual/native-image/NativeImageMavenPlugin/)
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org