Building the Apache Edgent SDK from a Source Distribution

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://git-wip-us.apache.org/repos/asf/incubator-edgent.git
or in the repository mirror at github https://github.com/apache/incubator-edgent.

Pre-requisites:
- Java 8 is required to build an Edgent SDK
- Network connectivity to a maven repository such as Maven Central
  (for downloading external third party dependencies)


Building the Edgent SDK Java8 jars and installing them in the local maven repository

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


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.

 
See samples/README.md in the Edgent Samples source bundle or github repository
for general information on Edgent Application development and deployment, 
and for building and running the samples. 
https://github.com/apache/incubator-edgent/samples/README.md


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.
