Welcome!

Blog Feed Post

The #KFCStandard pom.xml file

The heart of a Maven managed project is the Project Object Model file named pom.xml. This determines what actions Maven will carry out. What follows is the pom file I require my students to use in their Software Development Project where they code a desktop application. A JEE version will be used in the next semester’s Web Development Project. Let’s look at this #KFCStandard pom.xml one section at a time.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
               http://maven.apache.org/xsd/maven-4.0.0.xsd">

These first line is the XML declaration. The W3C states that the current version of XML is still 1.0 even though it is shown as the fifth edition. There may be a version 2.0 in the future. The encoding refers to the character set that is used in the document. UTF-8 is the most common form of encoding and it means that the document fully supports Unicode. The number 8 means that the supported character sets may consist of 8, 16, 32 or some other multiple of 8 bits to represent the characters of any language.

The next line contains the XML root tag named project. Following the tag are references to the namespace and schema used in the document. An XML validator uses this information to verify that the tags you use in the document are legal Maven pom tags.

    <modelVersion>4.0.0</modelVersion>

The modelVersion tag defines the version of the object model that the pom is using. It is required and as of Maven version 2.x it has been 4.0.0 and remains so for Maven 3.x

    <groupId>com.kenfogel</groupId>
    <artifactId>FXMavenDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

These three tags make up the GAV. The groupId, artifactId and version taken together represent the unique name for the project. When you look at the dependency section you will see these tags and Maven uses them to locate the libraries you may need to add to your code. If your code becomes a dependency for another project then this is how you will identify it.

The groupId tag typically defines a package name although it can be any string of characters that adheres to the naming conventions for Java. Most organizations will use their company’s domain name reversed for the groupId and as the first part of all the packages their developers create. The artifactId follows the same Java naming conventions and is typically the name of the project.

The version tag defines the current version of the project. Whatever you place here will be appended to the JAR file that Maven creates. You are free to use any versioning scheme that you want such as 1.0.0 or Best Version Ever Mark 2. A common convention in versioning is to include either the string -SNAPSHOT to indicate a project under development or the string -FINAL to indicate a project in production.

    <packaging>jar</packaging>

The packaging tag tells us the format of the file that will be built. The choices are jar, war and ear.

    <name>FXMavenDemo</name>

The optional name tag allows us to associate a name with the build. This name can contain any characters including spaces.

 <description>A sample pom.xml file for this article</description>

The optional description tag lets you write any text that want to provide any information to someone reading this file.

<developers>
   <developer>
       <id>9999999</id>
       <name>Ken Fogel</name>
       <email>[email protected]</email>
   </developer>
</developers>

The developers tag and its child tags allow you to identify the members of a project.

 <organization>
     <!-- Used as the 'Vendor' for JNLP generation -->
     <name>Your Organization</name>
 </organization>

JNLP stands for Java Network Launch Protocol. It is used to enable Java applets or applications to be delivered via the web to a client computer. To be able to use this method of application delivery you must be able to sign your application with a valid certificate just like those used for SSL security for web transactions. If you are developing commercial Java applications then you will need to have a certificate.

If you are a student then use the name tag to show the school you are attending.

<properties>
    <project.build.sourceEncoding>
        UTF-8
    </project.build.sourceEncoding>
    <mainAppClass>
        com.kenfogel.fxmavendemo.MainApp
    </mainAppClass>
</properties>

The properties section allows you to declare variables that can be used in later sections of the pom. Within the properties tag you can make up any tag names you want.

${project.build.sourceEncoding}

Some plugins assume that the files are encoded in standard ASCII. In those cases they must be informed that the encoding is really UTF-8. This is not currently used in this pom example but is considered a tag to have just in case.

${mainClass}

There are two cases in this pom where a plugin needs to know the full path to the class file that contains the main method. The exec plugin needs to know where to start the program when it runs. The shade plugin must list the main class in the jar’s MANIFEST.MF file.

<dependencies>

The most significant function that Maven provides is the management of the required libraries for projects and having them available in the build path. In the dependencies section of a pom file you place a dependency block that must have the groupId, artifactId and version. When Maven process the pom file it will look for the files required for the dependency in the local Maven repository, the .m2 folder. If it’s not found here Maven will go online to the standard repository, maven.org, and use the information there to download the necessary files to .m2. If it cannot be found anywhere then an error will occur. Not every library can be located through maven.org so there is a repository tag that can be used in a pom if you wish to have Maven look in other online repositories. See http://bit.ly/1IlaoVx for more details on using multiple repositories.

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.7.12</version>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-slf4j-impl</artifactId>
   <version>2.3</version>
</dependency>

<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-api</artifactId>
   <version>2.3</version>
</dependency>
<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-core</artifactId>
   <version>2.3</version>
</dependency>

This first block of dependencies defines the logging library we will use. There are two parts to this particular logging approach. The first two dependency blocks define the SLF4J or Simple Logging Framework for Java. This is a façade that provides an interface for logging that is independent from the specific implementation of a logging framework. The second two dependency blocks define log4J as the logging implementation. The version numbers here are very important as there is still a widely used version 1.x of log4j. Version 1.x will no longer be maintained and version 2.x is the new standard.

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
</dependency>

This is the dependency for the JUnit testing framework. It includes an additional tag named scope. This means that this dependency is only used during the test phase of the build. The JUnit jar will not be included in the executable shaded jar.

From this point on you can add any additional dependencies that you may need. Students in my courses almost always need MySQL.

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.36</version>
</dependency>

Students in my third year project course also need Jodd Mail.

   <dependency>
      <groupId>org.jodd</groupId>
      <artifactId>jodd-mail</artifactId>
      <version>3.6.6</version>
   </dependency>

</dependencies>

The dependencies are complete and now we move on to the build.

<build>

The build section contains the information that Maven needs to compile, assemble and execute the project. Plugins define the operations needed to carry out these actions.

<defaultGoal>clean compile package exec:java</defaultGoal>

The tag defaultGoal is used to define the Maven goals, sometimes also called phases. Goals are actions that Maven must carry out. Most IDEs allow you to declare the goals that you want in their run command. If you do that then it will override what you see here. In this tag I have the most common goals.

Clean deletes all class files and jar files. If you use clean then you must close any running instance of your project. Clean deletes the target folder and then recreates it. Your code is run from the target folder so it cannot be deleted if a process is running somewhere from the folder.

Compile does just that. If you do not use clean first then only source code files newer than their compiled class files will be compiled. For small projects clean is not an issue but in large systems you will not necessarily clean for every compile.

Package means to create the JAR file. All the class files produced by the compile goal are added to the jar file. The default behaviour here is to not include dependencies in the jar.

Exec means to execute the program. There are two flavours of exec, one is exec:java and the other is exec:exec. You must use one of these. The exec:exec runs the packaged jar as if it were being run from the command line and in a separate Java Virtual Machine from the IDE and Maven. This will fail if the dependencies are not in the jar.

The exec:java runs the program from the compiled class files and not the jar within the same JVM as the IDE. The Maven dependencies are in the build path so they are available to the executing code. The exec:exec gives a better picture of how your code will perform on its own. On a slow machine exec:java will execute faster because a new instance of the JVM is not needed. One drawback to exec:exec is that logging messages or System.out messages will not appear in the IDE’s console until the program ends. Therefore I recommend exec:java during early development and exec:exec as you near the production release.

<plugins>

The plugins are the components of Maven that carry out the required tasks of the build. They look a lot like dependencies and require code downloaded from a repository if not already in your .m2 repository.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.3</version>
   <configuration>
      <source>1.8</source>
      <target>1.8</target>
      <compilerArgument>-Xlint:all</compilerArgument>
      <showWarnings>true</showWarnings>
      <showDeprecation>true</showDeprecation>
   </configuration>
</plugin>

The Maven Compiler plugin is responsible for executing the javac compiler on your code. This means that when using an IDE it is Maven and not the IDE that compiles the code. The configuration tag defines some parameters for the compiler. The first two, source and target, defines the format of the .java files and the format of the .class files. It therefore defines the major version of the compiler which in this example is 1.8.

The tag compilerArgument adds the string to the compiler execution such as javac –Xlint:all. This means that we want the messages that the compiler generates to be available. It does not mean that they will be displayed. That is the role of the next two tags, showWarnings and showDeprecation.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.4.1</version>
   <configuration>
      <transformers>
         <transformer implementation=
                 "org.apache.maven.plugins.shade.
                     resource.ManifestResourceTransformer">
            <mainClass>${mainClass}</mainClass>
         </transformer>
      </transformers>
   </configuration>
   <executions>
      <execution>
         <phase>package</phase>
         <goals>
            <goal>shade</goal>
         </goals>
      </execution>
   </executions>
</plugin>

This is the Shade plugin. It is responsible for creating an executable jar file. To be a standalone executable jar there are two changes that have to be made to a basic jar. The first is to include all the dependencies in the jar. The second is to create a text file called MANIFEST.MF in the META_INF folder in the jar that contains the name of the class where the main method is found. The execution of shade is defined in the executions tag to occur as part of the package phase when the plain jar is made. You will end up with two jars when this is done. The original and the executable. The following image gives you a sense of the difference between a plain jar and and an executable or shaded jar.

jar

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>exec-maven-plugin</artifactId>
   <version>1.4.0</version>
   <executions>
      <execution>
         <id>default-cli</id>
         <goals>
            <goal>exec</goal>
            <goal>java</goal>
         </goals>
         <configuration>
            <mainClass>${mainClass}</mainClass>
            <executable>${java.home}/bin/java</executable>
            <commandlineArgs>-jar ${project.build.directory}/
               ${project.build.finalName}.jar</commandlineArgs>
         </configuration>
      </execution>
   </executions>
</plugin>

The exec plugin defines how the program will be run. As there are two ways to run a program, exec:exec and exec:java they are both defined here. The executable tag defines where the java virtual machine, either java.exe or javaw.exe, can be found. The commandlineArgs defines what is added to the JVM to run the executable jar in a separate JVM.

If you are using exec:java then the mainClass tag is used to identify which class file contains the main method.

The values for all the $ values except ${mainClass}, that was defined in properties, are provided by the IDE.

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
               <skipTests>false</skipTests>
            </configuration>
         </plugin>
      </plugins>
   </build>
</project>

The last plugin at the end of the pom file is Surefire. It runs the JUnit tests and then writes the results of the text to a text file and an xml file. These results can also be seen in the console. There is one configuration and that is to skipTests. Set this true with caution as forgetting to set it back to false may result in delivering code you think works but really does not.

A complete pom follows. It comes from the sample project my students in my first class must run. It is commented throughout. If you want to learn more about the pom visit http://maven.apache.org/pom.html

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

   <!-- Maven version of the xml document currently only 4.0.0 is valid -->
   <modelVersion>4.0.0</modelVersion>

   <!-- The GAV consists of an arbitrary descriptor that is usually in the form of a reverse domain name. -->
   <groupId>com.kenfogel</groupId>

   <!-- This is the name given to the packaged build -->
   <artifactId>FishFXTable</artifactId>

   <!-- The version of the build. Any value is valid though a number and a string are common. SNAPSHOT means a project under development. FINAL is commonly used to refer to stable production version -->
   <version>1.0-SNAPSHOT</version>

   <!-- Default value is jar but may be war or ear -->
   <packaging>jar</packaging>

   <!-- The name given to the project. Unlike groupId and artifactId a name may have spaces -->
   <name>FishFXTable</name>

   <!-- A description of the program -->
   <description>JavaFX TableView example based on JDBCDemo</description>

   <!-- Identifies the programmer or programmers who worked on the project -->
   <developers>
      <developer>
         <id>9999999</id>
         <name>Ken Fogel</name>
         <email>[email protected]</email>
      </developer>
   </developers>

   <!-- The company or organization that the programmer(s) work for -->
   <organization>
      <name>Dawson College</name>
   </organization>

   <!-- Global settings for the project. Settings can be accessed in the pom by placing the tag name in ${...} ex. ${mainClass} -->
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

      <!-- class that has the main method -->
      <mainClass>com.kenfogel.fishfxtable.MainAppFX</mainClass>
   </properties>

   <dependencies>

      <!-- The dependency for the SLF4J Facade -->
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>1.7.12</version>
      </dependency>
      <!-- Binding for Log4J -->
      <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-slf4j-impl</artifactId>
         <version>2.3</version>
      </dependency>
      <!-- Logging Framework Dependency Uses the log4j2 library -->
      <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-api</artifactId>
         <version>2.3</version>
      </dependency>
      <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-core</artifactId>
         <version>2.3</version>
      </dependency>

      <!-- JUnit 4 testing dependency -->
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.12</version>
         <!-- only to be used during test phase will not be included in executable jar -->
         <scope>test</scope>
      </dependency>

      <!-- MySQL dependency -->
      <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.36</version>
      </dependency>

      <!-- Jodd Mail Dependency -->
      <dependency>
         <groupId>org.jodd</groupId>
         <artifactId>jodd-mail</artifactId>
         <version>3.6.6</version>
      </dependency>

   </dependencies>

   <build>
      <!-- Goals may be set in the IDE or the pom IDE or CLI goals override the defaultGoal -->
      <defaultGoal>clean compile package exec:java</defaultGoal>

      <!-- Plugins define components that perform actions -->
      <plugins>

         <!-- Compiler: Select the version of the Java compiler and any command line switches to use with it -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
               <!-- Java version of the source files -->
               <source>1.8</source>

               <!-- Java version of the class files -->
               <target>1.8</target>

               <!-- sometimes the IDE does not reveal all the important warnings -->
               <compilerArgument>-Xlint:all</compilerArgument>
               <showWarnings>true</showWarnings>
               <showDeprecation>true</showDeprecation>
            </configuration>
         </plugin>

         <!-- Shade: Create an executable jar containing all the dependencies when the package goal is carried out -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
               <transformers>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                     <mainClass>${mainClass}</mainClass>
                  </transformer>
               </transformers>
            </configuration>

            <executions>
               <execution>
                  <phase>package</phase>
                  <goals>
                     <goal>shade</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>

         <!-- Exec: Executes the program -->
         <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.4.0</version>
            <executions>
               <execution>
                  <id>default-cli</id>
                  <goals>
                     <!-- Runs in separate instance of JVM -->
                     <goal>exec</goal>
                     <!-- Runs in same instance of JVM as Eclipse -->
                     <goal>java</goal>
                  </goals>
                  <configuration>
                     <!--used by java goal -->
                     <!--executes in the same VM that Maven runs in -->
                     <mainClass>${mainClass}</mainClass>

                     <!--used by exec goal -->
                     <!--runs in a separate VM from the one that Maven runs in -->
                     <executable>${java.home}/bin/java</executable>
                     <commandlineArgs>-jar ${project.build.directory}/${project.build.finalName}.jar</commandlineArgs>
                  </configuration>
               </execution>
            </executions>
         </plugin>

         <!-- Surefire: During the test phase of the build life cycle executes JUnit tests and write the results to an xml and txt file -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <!-- Turn on tests: false, Turn off tests: true -->
            <configuration>
               <skipTests>false</skipTests>
            </configuration>
         </plugin>

      </plugins>
   </build>
</project>

 

Read the original blog entry...

More Stories By Ken Fogel

In 1980 I bought for myself the most wonderful toy of the day, the Apple ][+. Obsession followed quickly and by 1983 I was writing software for small and medium sized businesses in Montreal for both the Apple and the IBM PC under the company name Omnibus Systems. In the evenings I taught continuing education courses that demystified the computer to the first generation of workers who found themselves with their typewriter on the scrap heap and a PC with WordStar taking its place.

In 1990 I was invited to join the faculty at Dawson College in the Computer Science Technology program. When I joined the program the primary language was COBOL and my responsibility was to teach small systems languages such as BASIC and C/C++.

Today I am now the chairperson and program coordinator of the Computer Science Technology program at Dawson. The program's primary language is Java and the focus is on enterprise programming.

I like to write about the every day problems my students and I face in using various languages and platforms to get the job done. And from time to time I stray from the path and write about what I plan to do, what I actually get around to doing, and what I imagine I am doing.

@omniprof

Latest Stories
It is ironic, but perhaps not unexpected, that many organizations who want the benefits of using an Agile approach to deliver software use a waterfall approach to adopting Agile practices: they form plans, they set milestones, and they measure progress by how many teams they have engaged. Old habits die hard, but like most waterfall software projects, most waterfall-style Agile adoption efforts fail to produce the results desired. The problem is that to get the results they want, they have to ch...
We build IoT infrastructure products - when you have to integrate different devices, different systems and cloud you have to build an application to do that but we eliminate the need to build an application. Our products can integrate any device, any system, any cloud regardless of protocol," explained Peter Jung, Chief Product Officer at Pulzze Systems, in this SYS-CON.tv interview at @ThingsExpo, held November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA
Cloud Expo, Inc. has announced today that Andi Mann and Aruna Ravichandran have been named Co-Chairs of @DevOpsSummit at Cloud Expo Silicon Valley which will take place Oct. 31-Nov. 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. "DevOps is at the intersection of technology and business-optimizing tools, organizations and processes to bring measurable improvements in productivity and profitability," said Aruna Ravichandran, vice president, DevOps product and solutions marketing...
With major technology companies and startups seriously embracing Cloud strategies, now is the perfect time to attend 21st Cloud Expo October 31 - November 2, 2017, at the Santa Clara Convention Center, CA, and June 12-14, 2018, at the Javits Center in New York City, NY, and learn what is going on, contribute to the discussions, and ensure that your enterprise is on the right path to Digital Transformation.
The Internet giants are fully embracing AI. All the services they offer to their customers are aimed at drawing a map of the world with the data they get. The AIs from these companies are used to build disruptive approaches that cannot be used by established enterprises, which are threatened by these disruptions. However, most leaders underestimate the effect this will have on their businesses. In his session at 21st Cloud Expo, Rene Buest, Director Market Research & Technology Evangelism at Ara...
In his session at @ThingsExpo, Eric Lachapelle, CEO of the Professional Evaluation and Certification Board (PECB), provided an overview of various initiatives to certify the security of connected devices and future trends in ensuring public trust of IoT. Eric Lachapelle is the Chief Executive Officer of the Professional Evaluation and Certification Board (PECB), an international certification body. His role is to help companies and individuals to achieve professional, accredited and worldwide re...
"Loom is applying artificial intelligence and machine learning into the entire log analysis process, from start to finish and at the end you will get a human touch,” explained Sabo Taylor Diab, Vice President, Marketing at Loom Systems, in this SYS-CON.tv interview at 20th Cloud Expo, held June 6-8, 2017, at the Javits Center in New York City, NY.
Wooed by the promise of faster innovation, lower TCO, and greater agility, businesses of every shape and size have embraced the cloud at every layer of the IT stack – from apps to file sharing to infrastructure. The typical organization currently uses more than a dozen sanctioned cloud apps and will shift more than half of all workloads to the cloud by 2018. Such cloud investments have delivered measurable benefits. But they’ve also resulted in some unintended side-effects: complexity and risk. ...
"We are a monitoring company. We work with Salesforce, BBC, and quite a few other big logos. We basically provide monitoring for them, structure for their cloud services and we fit into the DevOps world" explained David Gildeh, Co-founder and CEO of Outlyer, in this SYS-CON.tv interview at DevOps Summit at 20th Cloud Expo, held June 6-8, 2017, at the Javits Center in New York City, NY.
21st International Cloud Expo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, will feature technical sessions from a rock star conference faculty and the leading industry players in the world. Cloud computing is now being embraced by a majority of enterprises of all sizes. Yesterday's debate about public vs. private has transformed into the reality of hybrid cloud: a recent survey shows that 74% of enterprises have a hybrid cloud strategy. Me...
With major technology companies and startups seriously embracing Cloud strategies, now is the perfect time to attend 21st Cloud Expo October 31 - November 2, 2017, at the Santa Clara Convention Center, CA, and June 12-14, 2018, at the Javits Center in New York City, NY, and learn what is going on, contribute to the discussions, and ensure that your enterprise is on the right path to Digital Transformation.
SYS-CON Events announced today that Enzu will exhibit at SYS-CON's 21st Int\ernational Cloud Expo®, which will take place October 31-November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Enzu’s mission is to be the leading provider of enterprise cloud solutions worldwide. Enzu enables online businesses to use its IT infrastructure to their competitive advantage. By offering a suite of proven hosting and management services, Enzu wants companies to focus on the core of their ...
DevOps at Cloud Expo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 21st Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. The widespread success of cloud computing is driving the DevOps revolution in enterprise IT. Now as never before, development teams must communicate and collaborate in a dynamic, 24/7/365 environment. There is no time to w...
In 2014, Amazon announced a new form of compute called Lambda. We didn't know it at the time, but this represented a fundamental shift in what we expect from cloud computing. Now, all of the major cloud computing vendors want to take part in this disruptive technology. In his session at 20th Cloud Expo, Doug Vanderweide, an instructor at Linux Academy, discussed why major players like AWS, Microsoft Azure, IBM Bluemix, and Google Cloud Platform are all trying to sidestep VMs and containers wit...
Internet of @ThingsExpo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 21st Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. The Internet of Things (IoT) is the most profound change in personal and enterprise IT since the creation of the Worldwide Web more than 20 years ago. All major researchers estimate there will be tens of billions devic...