Building the Apache Edgent SDK from a Source Distribution

Quickstart
----------

You must have Java 8 installed on your system and connectivity to Maven Central
(for downloading external thrid party dependencies). Maven will be automatically
downloaded and installed by the maven wrapper `mvnw`.

Build the Edgent SDK Java8 jars and install them in your local maven repository

$ ./mvnw clean install  # add -DskipTests to omit running the tests

You can now construct applications that use Edgent.  The Edgent samples
are a good place to start and are available as a separate download
at https://github.com/apache/incubator-edgent-samples

Additional Information
----------------------

Apache Edgent is supported on several Java target platforms.
For more information see JAVA_SUPPORT.md in the source tree
or in the ASF git repository https://gitbox.apache.org/repos/asf/incubator-edgent.git
or in the repository mirror at github https://github.com/apache/incubator-edgent.

See DEVELOPMENT.md in this folder or 
https://github.com/apache/incubator-edgent/DEVELOPMENT.md for information
about building the Edgent SDK for the Java 7 and Android platforms.


Licensing
---------

Apache Edgent is released under the Apache License Version 2.0.

Apache Edgent is an effort undergoing incubation at The Apache Software Foundation (ASF),
sponsored by the Incubator PMC. Incubation is required of all newly accepted
projects until a further review indicates that the infrastructure, communications,
and decision making process have stabilized in a manner consistent with other
successful ASF projects. While incubation status is not necessarily a reflection
of the completeness or stability of the code, it does indicate that the project
has yet to be fully endorsed by the ASF.
