Java EE 7 Web Profile Maven pom.xml Using Arquillian, Selenium, MySQL, Primefaces and EclipseLink

  1. Update: Removed unnecessary eclipselink dependency 2017-02-27 14:46
  2. Update: Changed skipTests value to false in Surefire dependency in the complete pom file 2017-02-27 15:18

If you are not using Maven then you should. If you are using Maven then you are likely cutting and pasting snippets of pom.xml file examples and hoping for the best. In this article I will present the pom.xml file that I require my students to use in an e-commerce project course. Not everything in it is required and you likely have libraries you need that are not in my example. After reviewing my pom.xml you should be able to make all the changes you need. You can find the complete file at the end of this article.

This is my third article on the pom.xml file that I have written. The last time I wrote about it was two years ago and while Maven has not changed I have learned more about the pom.xml. If you are not using Maven because a practical explanation of the elements required in the real world are rare, then hopefully this will change your mind.

Whether you work from the command line or with an IDE such as NetBeans (my favourite) one issue comes up over and over again. How do I make sure all the libraries I need get included in my project? It used to be for me that I needed to track down the web site for every library I wanted to use, download the jar and manually paste it into a location on the classpath or a specific folder in IDE. Packaging an application for distribution was also an issue because I needed to ensure that all the right jars were included in the uber archive, jar or war, I planned to distribute.

There is more to Maven than just including libraries. I use it to upload Java programs to my Raspberry Pi and execute them. I use Maven to control when I want unit testing to occur. There is much, much more it can do. The one task that drives my continual writing about Maven is that I use it in the classroom. I teach software development at Dawson College in the final year of the program. I like teaching coding but I am not fond of teaching the necessary plumbing to make systems work. I use NetBeans in my courses because it does not need to be managed the way Eclipse or IntelliJ needs to be. I use Maven for the same reason. I provide my students with a standard Maven pom.xml file that ensures that they all begin from the same baseline. Here is that pom.xml file.

[pastacode lang=”markup” manual=”%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E” message=”” highlight=”” provider=”manual”/]

 Every XML document should begin with an XML declaration. While the version has remained 1.0, it is the encoding attribute that is important. UTF-8 means that this document is encoded using the Unicode standard in which the first 128 characters map to Unicode. For more information on UTF-8 I recommend http://www.fileformat.info/info/unicode/utf8.htm


[pastacode lang=”markup” manual=”%20%3Cproject%20xmlns%3D%22http%3A%2F%2Fmaven.apache.org%2FPOM%2F4.0.0%22%20xmlns%3Axsi%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance%22%20xsi%3AschemaLocation%3D%22http%3A%2F%2Fmaven.apache.org%2FPOM%2F4.0.0%20http%3A%2F%2Fmaven.apache.org%2Fxsd%2Fmaven-4.0.0.xsd%22%3E” message=”” highlight=”” provider=”manual”/]

  This is the root tag for this XML document. An XML document must be well formed and valid. Well formed means that all tags are properly nested and have a matching closing tag. Valid means that the tags and attributes you are using are part of this specific XML language. Testing for validity requires a schema and that is what is referred to in the root project tag. The schema is also used by the IDE to validate while you enter the tags into the file.


[pastacode lang=”markup” manual=”%20%20%20%20%20%3C!–%20Maven%20version%20of%20the%20xml%20document%20currently%20only%204.0.0%20is%20valid%20–%3E%0A%20%20%20%20%3CmodelVersion%3E4.0.0%3C%2FmodelVersion%3E%0A%20″ message=”” highlight=”” provider=”manual”/]

      As the comment says, its always 4.0.0.


[pastacode lang=”markup” manual=”%20%20%20%20%20%3C!–%20The%20GAV%20consists%20of%20an%20arbitrary%20descriptor%20that%20is%20usually%20in%20the%0A%20%20%20%20form%20of%20a%20reverse%20domain%20name.%20–%3E%0A%20%20%20%20%3CgroupId%3Ecom.kfwebstandard%3C%2FgroupId%3E%0A%20%0A%20%20%20%20%3C!–%20This%20is%20the%20name%20given%20to%20the%20packaged%20build%20–%3E%0A%20%20%20%20%3CartifactId%3EKFWebStandardProject%3C%2FartifactId%3E” message=”” highlight=”” provider=”manual”/]

 Maven manages the thousands of libraries available by using the combination of the groupId and artifactId as a unique identifier for each library. This is commonly called the GAV. These are usually expressed using the naming convention for Java packages or as a reverse domain name but they can be anything. You’ll see a non-package name for the MySQL dependency. When a library is a dependency for a project it is identified by this combination. This is also the directory in your local repository where this jar or other file type is stored.


[pastacode lang=”markup” manual=”%20%20%20%20%3C!–%20The%20version%20of%20the%20build.%20Any%20value%20is%20valid%20though%20a%20number%20and%20a%0A%20%20%20%20string%20are%20common.%20SNAPSHOT%20means%20a%20project%20under%20development.%20FINAL%20is%20commonly%0A%20%20%20%20used%20to%20refer%20to%20stable%20production%20version%20–%3E%0A%20%20%20%20%3Cversion%3E%200.0.1-SNAPSHOT%3C%2Fversion%3E” message=”” highlight=”” provider=”manual”/]

   The version number for a project is an important piece of data that you should be updating during development. Over time there may may be many versions of a project and other developers may depend on a specific version. The most recent version may contain changes that could break the work of other developers who have a dependency on your work. Two special optional terms are SNAPSHOT for a project in development and FINAL for a production ready project.


[pastacode lang=”markup” manual=”%20%20%20%20%3C!–%20Default%20value%20is%20jar%20but%20may%20be%20war%20or%20ear%20–%3E%0A%20%20%20%20%3Cpackaging%3Ewar%3C%2Fpackaging%3E” message=”” highlight=”” provider=”manual”/]

 Select the appropriate archive packaging type, either jar, war or ear.


[pastacode lang=”markup” manual=”%20%20%20%20%3C!–%20The%20name%20given%20to%20the%20project.%20Unlike%20groupId%20and%20artifactId%20a%20name%0A%20%20%20%20may%20have%20spaces%20–%3E%0A%20%20%20%20%3Cname%3E%24%7Bproject.artifactId%7D%3C%2Fname%3E” message=”” highlight=”” provider=”manual”/]

I like to use the artifactId for the project name but you can use any name you want. Notice that you can refer to a tag in the file using substitution notation and by appending it to the term ‘project’.


[pastacode lang=”markup” manual=”%20%20%20%20%3C!–%20A%20description%20of%20the%20program%20–%3E%0A%20%20%20%20%3Cdescription%3EStandard%20starting%20point%20for%20a%20JEE%20Web%20Profile%20application%20using%20Java%20Server%20Faces%0A%20%20%20%20%20%20%20%20for%20students%20of%20Ken%20Fogel%3C%2Fdescription%3E%0A%0A%20%20%20%20%3C!–%20Identifies%20the%20programmer%20or%20programmers%20who%20worked%20on%20the%20project%20–%3E%0A%20%20%20%20%3Cdevelopers%3E%0A%20%20%20%20%20%20%20%20%3Cdeveloper%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cid%3EEnter%20your%20school%20id%3C%2Fid%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cname%3EEnter%20your%20name%3C%2Fname%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cemail%3EEnter%20your%20email%20address%3C%2Femail%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdeveloper%3E%0A%20%20%20%20%3C%2Fdevelopers%3E%0A%0A%20%20%20%20%3C!–%20The%20company%20or%20organization%20that%20the%20programmer(s)%20work%20for%20–%3E%0A%20%20%20%20%3Corganization%3E%0A%20%20%20%20%20%20%20%20%3Cname%3EEnter%20school%20name%3C%2Fname%3E%0A%20%20%20%20%3C%2Forganization%3E” message=”” highlight=”” provider=”manual”/]

 The three sections above are used to identify you. They are optional if you are an amateur. If you are a professional they are mandatory. 


[pastacode lang=”markup” manual=”%20%20%20%20%3C!–%20Global%20settings%20for%20the%20project.%20Settings%20can%20be%20accessed%20in%20the%20pom%0A%20%20%20%20by%20placing%20the%20tag%20name%20in%20%24%7B…%7D%20ex.%20%24%7Bendorsed.dir%7D%20–%3E%0A%20%20%20%20%3Cproperties%3E%0A%20%20%20%20%20%20%20%20%3Cendorsed.dir%3E%24%7Bproject.build.directory%7D%2Fendorsed%3C%2Fendorsed.dir%3E%0A%20%20%20%20%20%20%20%20%3Cproject.build.sourceEncoding%3EUTF-8%3C%2Fproject.build.sourceEncoding%3E%0A%20%20%20%20%20%20%20%20%3Cmaven.compiler.source%3E1.8%3C%2Fmaven.compiler.source%3E%0A%20%20%20%20%20%20%20%20%3Cmaven.compiler.target%3E1.8%3C%2Fmaven.compiler.target%3E%0A%20%20%20%20%3C%2Fproperties%3E” message=”” highlight=”” provider=”manual”/]

 Properties represent data that another section of the pom may need access to. This way this data can be stored in one place and not repeated where it is needed. Endorsed represents a directory where files with the same name and type as those present in the Java installation are stored. This way the file in the endorsed folder will be used rather than the one supplied in the Java installation. The encoding of the project appears here as does the version of Java you will be using.


[pastacode lang=”markup” manual=”%20%20%20%20%3C!–%20Dependencies%20listed%20here%20are%20usually%20bom%20or%20bill%20of%20materials–%3E%0A%20%20%20%20%3C!–%20The%20bom%20lists%20all%20the%20child%20dependencies%20that%20could%20be%20used%20and%20–%3E%0A%20%20%20%20%3C!–%20lists%20the%20current%20version%20number%20for%20each%20–%3E%0A%20%20%20%20%3CdependencyManagement%3E%0A%20%20%20%20%20%20%20%20%3Cdependencies%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.arquillian%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Earquillian-bom%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.1.12.Final%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eimport%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctype%3Epom%3C%2Ftype%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.shrinkwrap.resolver%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eshrinkwrap-resolver-bom%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.2.6%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctype%3Epom%3C%2Ftype%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eimport%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependencies%3E%0A%20%20%20%20%3C%2FdependencyManagement%3E” message=”” highlight=”” provider=”manual”/]

 When using Arquillian there are numerous libraries that may be required. Exactly what they are may change from version to version. A dependencyManagement section refers to special files classifid as bill of materials that in turn will include the necessary Arquillian libraries. 


[pastacode lang=”markup” manual=”%20%20%20%20%3C!–%20Dependencies%20are%20libraries%20that%20either%20must%20be%20included%20in%20the%20–%3E%0A%20%20%20%20%3C!–%20jar%2Fwar%20file%20or%20are%20expected%20to%20be%20found%20in%20the%20container%20such%20as%20–%3E%0A%20%20%20%20%3C!–%20GlassFish%20–%3E” message=”” highlight=”” provider=”manual”/]

 As my comment above says, the dependencies are libraries that must be available to your project. They will all be downloaded to your local repository. This will allow your IDE to ensure you are using classes and methods from these libraries correctly. They are further classified by the scope tag. If there is no scope tag then the file associated with the dependency will be added to your final archive file. If the scope tag shows ‘provided’ then the required files are in the container you will be running in, such as Glassfish/Payara, and do not need to be added to your archive. If the scope is ‘test’ then the files are only added to an archive used for testing such as what Arquillian produces.


[pastacode lang=”markup” manual=”%20%20%20%20%3Cdependencies%3E%0A%20%20%20%20%20%20%20%20%3C!–%20These%20dependencies%20are%20required%20to%20run%20the%20project%20on%20the%20server%20–%3E%0A%20%20%20%20%20%20%20%20%3C!–%20Java%20EE%207.0%20Web%20profile%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Ejavax%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ejavaee-web-api%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E7.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eprovided%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20MySQL%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Emysql%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Emysql-connector-java%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E5.1.40%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eprovided%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20PrimeFaces%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.primefaces%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eprimefaces%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E6.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20EclipseLink%20dependency%20for%20the%20static%20metamodel%20generator%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.eclipse.persistence%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eorg.eclipse.persistence.jpa.modelgen.processor%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.6.4%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eprovided%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E” message=”” highlight=”” provider=”manual”/]

 The metamodel generator dependency invokes a process to create meta model classes dynamically. This will allow you to use identifiers rather than strings in certain types of JPA queries so that refactoring (renaming) is supported.

Thanks to BillyTheKid for pointing out that the dependency for eclipselink, now removed, is not needed, only the metamodel dependency is required.


[pastacode lang=”markup” manual=”%20%20%20%20%20%20%20%20%3C!–%20These%20dependencies%20are%20required%20for%20testing%20only%20–%3E%0A%20%20%20%20%20%20%20%20%3C!–%20Arquillian%20dependency%20for%20running%20tests%20on%20a%20remote%20GlassFish%20server%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.arquillian.container%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Earquillian-glassfish-remote-3.1%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.0.0.Final%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Resolves%20dependencies%20from%20the%20pom.xml%20when%20explicitly%20referred%20to%0A%20%20%20%20%20%20%20%20in%20the%20Arquillian%20deploy%20method%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.shrinkwrap.resolver%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eshrinkwrap-resolver-depchain%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ctype%3Epom%3C%2Ftype%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E” message=”” highlight=”” provider=”manual”/]

 Not every required Arquillian dependency that my students need is in one of the two bom dependencyManagement entries so we need to add these two dependencies. If you are using Arquillian then you need these too.


[pastacode lang=”markup” manual=”%20%20%20%20%20%20%20%20%3C!–%20Connects%20Arquillian%20to%20JUnit%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.arquillian.junit%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Earquillian-junit-container%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%0A%20%20%20%20%20%20%20%20%3C!–%20JUnit%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Ejunit%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ejunit%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E4.12%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Selenium%20dependencies%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.seleniumhq.selenium%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ehtmlunit-driver%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.25%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20You%20will%20need%20a%20driver%20dependency%20for%20every%20browser%20you%20use%20in%0A%20%20%20%20%20%20%20%20testing.%20You%20can%20find%20the%20meven%20dependencies%20at%0A%20%20%20%20%20%20%20%20https%3A%2F%2Fmvnrepository.com%2Fartifact%2Forg.seleniumhq.selenium%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.seleniumhq.selenium%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eselenium-chrome-driver%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E3.2.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Normally%20you%20must%20download%20an%20exe%20for%20each%20browser.%20This%20library%0A%20%20%20%20%20%20%20%20will%20retrieve%20the%20the%20necessary%20file%20and%20place%20it%20in%20the%20classpath%20for%0A%20%20%20%20%20%20%20%20selenium%20to%20use%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eio.github.bonigarcia%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ewebdrivermanager%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.6.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E” message=”” highlight=”” provider=”manual”/]

 For the first time I will be having my students use Selenium as part of their testing. Selenium is actually an independent system that can even be placed in a Java desktop application. Here it will be run as a unit test. Selenium requires, in addition to the Java library, a standalone executable program to connect it to a specific browser. I found this extremely convenient library, webdrivermanager, that will download all the required executables and run them as required.


[pastacode lang=”markup” manual=”%20%20%20%20%20%20%20%20%3C!–%20A%20better%20way%20to%20write%20assertions%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.assertj%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eassertj-core%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.7.1%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Selenium%20uses%20SLF4J%20and%20log4j%20so%20these%20dependencies%20are%20needed%0A%20%20%20%20%20%20%20%20but%20just%20for%20test%20scope%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.slf4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eslf4j-api%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.7.23%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.logging.log4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Elog4j-slf4j-impl%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.8%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.logging.log4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Elog4j-api%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.8%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.logging.log4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Elog4j-core%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.8%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%3C%2Fdependencies%3E%0A” message=”” highlight=”” provider=”manual”/]

 Selenium uses slf4j as the interface to log4j. That is why these dependencies are all listed as test scope. A student recently ran into a problem when a library they were using in their project also needed slf4j. The solution was to remove scope so that the libraries were added to both the production and test archive files. 


[pastacode lang=”markup” manual=”%20%20%20%20%3C%2F!–%20Information%20for%20compiling%2C%20testing%20and%20packaging%20are%20define%20here%20–%3E%0A%20%20%20%20%3Cbuild%3E%0A%20%20%20%20%20%20%20%20%3CtestResources%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C!–%20Folders%20in%20the%20project%20required%20during%20testing%20–%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CtestResource%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdirectory%3Esrc%2Ftest%2Fresources%3C%2Fdirectory%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FtestResource%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CtestResource%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdirectory%3Esrc%2Ftest%2Fresources-glassfish-remote%3C%2Fdirectory%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FtestResource%3E%0A%20%20%20%20%20%20%20%20%3C%2FtestResources%3E” message=”” highlight=”” provider=”manual”/]

 Here in the build section of the pom.xml. Here you can identify filesor folders folders that are required but are not part of a standard Maven project. 


[pastacode lang=”markup” manual=”%20%20%20%20%20%20%20%20%3C!–%20Plugins%20are%20components%20that%20Maven%20uses%20for%20specific%20purposes%20beyond%0A%20%20%20%20%20%20%20%20the%20basic%20tasks%20–%3E%0A%20%20%20%20%20%20%20%20%3Cplugins%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C!–%20Presence%20of%20this%20plugin%20suppress%20a%20warning%20about%20the%20existence%20%0A%20%20%20%20%20%20%20%20%20%20%20%20of%20the%20web.xml%20file%20–%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cplugin%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.maven.plugins%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Emaven-war-plugin%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E3.0.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fplugin%3E” message=”” highlight=”” provider=”manual”/]

Plugins are modules that add features to Maven. The Maven war plugin is used when we wish to modify how the war file is built. It is not required for the projects my students build. Unfortunately, leaving this plugin out results in a warning that reads “Warning: selected war files include a WEB-INF/web.xml which will be ignored”. This statement is false and the project’s web.xml is properly processed. Adding this plugin without any settings eliminates the warning message. 


[pastacode lang=”markup” manual=”%20%20%20%20%20%20%20%20%20%20%20%20%3Cplugin%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C!–%20Executes%20JUnit%20tests%20and%20writes%20the%20results%20as%20an%20xml%20and%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20txt%20file%20Test%20classes%20must%20include%20one%20of%20the%20following%20in%20their%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20Test*%20*Test%20*TestCase%20–%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.maven.plugins%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Emaven-surefire-plugin%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.19.1%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cconfiguration%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CargLine%3E-Dfile.encoding%3D%24%7Bproject.build.sourceEncoding%7D%3C%2FargLine%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CskipTests%3Efalse%3C%2FskipTests%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fconfiguration%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fplugin%3E%0A%20%20%20%20%20%20%20%20%3C%2Fpluginn%3E%0A%20%20%20%20%3C%2Fbuild%3E%0A%3C%2Fproject%3E” message=”” highlight=”” provider=”manual”/]

The Surefire pligin controls running tests and it allows me to easily turn on or off testing with the skipTests tag.

Final Word

In preparing this article I removed two plugins that proved to be redundant and removed unnecessary tags from a third. These plugins were there because the articles that I read in researching Maven showed them. These Maven entries continue to appear on StackOverflow and in other articles. May I suggest that when writing about Maven or answering a question you consider testing your code by removing plugins. Otherwise we will propagate inflated Maven pom.xml files.

Here is the full pom.xml.

[pastacode lang=”markup” manual=”%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Cproject%20xmlns%3D%22http%3A%2F%2Fmaven.apache.org%2FPOM%2F4.0.0%22%20xmlns%3Axsi%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance%22%20xsi%3AschemaLocation%3D%22http%3A%2F%2Fmaven.apache.org%2FPOM%2F4.0.0%20http%3A%2F%2Fmaven.apache.org%2Fxsd%2Fmaven-4.0.0.xsd%22%3E%0A%20%20%20%20%3C!–%20pom.xml%20February%202017%20version%201.0%20–%3E%0A%0A%20%20%20%20%3C!–%20Maven%20version%20of%20the%20xml%20document%20currently%20only%204.0.0%20is%20valid%20–%3E%0A%20%20%20%20%3CmodelVersion%3E4.0.0%3C%2FmodelVersion%3E%0A%0A%20%20%20%20%3C!–%20The%20GAV%20consists%20of%20an%20arbitrary%20descriptor%20that%20is%20usually%20in%20the%0A%20%20%20%20form%20of%20a%20reverse%20domain%20name.%20–%3E%0A%20%20%20%20%3CgroupId%3Ecom.kfwebstandard%3C%2FgroupId%3E%0A%0A%20%20%20%20%3C!–%20This%20is%20the%20name%20given%20to%20the%20packaged%20build%20–%3E%0A%20%20%20%20%3CartifactId%3EKFWebStandardProject%3C%2FartifactId%3E%0A%0A%20%20%20%20%3C!–%20The%20version%20of%20the%20build.%20Any%20value%20is%20valid%20though%20a%20number%20and%20a%0A%20%20%20%20string%20are%20common.%20SNAPSHOT%20means%20a%20project%20under%20development.%20FINAL%20is%20commonly%0A%20%20%20%20used%20to%20refer%20to%20stable%20production%20version%20–%3E%0A%20%20%20%20%3Cversion%3E0.1%3C%2Fversion%3E%0A%0A%20%20%20%20%3C!–%20Default%20value%20is%20jar%20but%20may%20be%20war%20or%20ear%20–%3E%0A%20%20%20%20%3Cpackaging%3Ewar%3C%2Fpackaging%3E%0A%0A%20%20%20%20%3C!–%20The%20name%20given%20to%20the%20project.%20Unlike%20groupId%20and%20artifactId%20a%20name%0A%20%20%20%20may%20have%20spaces%20–%3E%0A%20%20%20%20%3Cname%3E%24%7Bproject.artifactId%7D%3C%2Fname%3E%0A%0A%20%20%20%20%3C!–%20A%20description%20of%20the%20program%20–%3E%0A%20%20%20%20%3Cdescription%3EStandard%20starting%20point%20for%20a%20JEE%20Web%20Profile%20application%20using%20Java%20Server%20Faces%0A%20%20%20%20%20%20%20%20for%20students%20of%20Ken%20Fogel%3C%2Fdescription%3E%0A%0A%20%20%20%20%3C!–%20Identifies%20the%20programmer%20or%20programmers%20who%20worked%20on%20the%20project%20–%3E%0A%20%20%20%20%3Cdevelopers%3E%0A%20%20%20%20%20%20%20%20%3Cdeveloper%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cid%3EEnter%20your%20school%20id%3C%2Fid%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cname%3EEnter%20your%20name%3C%2Fname%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cemail%3EEnter%20your%20email%20address%3C%2Femail%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdeveloper%3E%0A%20%20%20%20%3C%2Fdevelopers%3E%0A%0A%20%20%20%20%3C!–%20The%20company%20or%20organization%20that%20the%20programmer(s)%20work%20for%20–%3E%0A%20%20%20%20%3Corganization%3E%0A%20%20%20%20%20%20%20%20%3Cname%3EEnter%20school%20name%3C%2Fname%3E%0A%20%20%20%20%3C%2Forganization%3E%0A%0A%20%20%20%20%3C!–%20Global%20settings%20for%20the%20project.%20Settings%20can%20be%20accessed%20in%20the%20pom%0A%20%20%20%20by%20placing%20the%20tag%20name%20in%20%24%7B…%7D%20ex.%20%24%7Bendorsed.dir%7D%20–%3E%0A%20%20%20%20%3Cproperties%3E%0A%20%20%20%20%20%20%20%20%3Cendorsed.dir%3E%24%7Bproject.build.directory%7D%2Fendorsed%3C%2Fendorsed.dir%3E%0A%20%20%20%20%20%20%20%20%3Cproject.build.sourceEncoding%3EUTF-8%3C%2Fproject.build.sourceEncoding%3E%0A%20%20%20%20%20%20%20%20%3Cmaven.compiler.source%3E1.8%3C%2Fmaven.compiler.source%3E%0A%20%20%20%20%20%20%20%20%3Cmaven.compiler.target%3E1.8%3C%2Fmaven.compiler.target%3E%0A%20%20%20%20%3C%2Fproperties%3E%0A%0A%20%20%20%20%3C!–%20Dependencies%20listed%20here%20are%20usually%20bom%20or%20bill%20of%20materials–%3E%0A%20%20%20%20%3C!–%20The%20bom%20lists%20all%20the%20child%20dependencies%20that%20could%20be%20used%20and%20–%3E%0A%20%20%20%20%3C!–%20lists%20the%20current%20version%20number%20for%20each%20–%3E%0A%20%20%20%20%3CdependencyManagement%3E%0A%20%20%20%20%20%20%20%20%3Cdependencies%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.arquillian%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Earquillian-bom%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.1.12.Final%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eimport%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctype%3Epom%3C%2Ftype%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.shrinkwrap.resolver%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eshrinkwrap-resolver-bom%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.2.6%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctype%3Epom%3C%2Ftype%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eimport%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependencies%3E%0A%20%20%20%20%3C%2FdependencyManagement%3E%0A%0A%20%20%20%20%3C!–%20Dependencies%20are%20libraries%20that%20either%20must%20be%20included%20in%20the%20–%3E%0A%20%20%20%20%3C!–%20jar%2Fwar%20file%20or%20are%20expected%20to%20be%20found%20in%20the%20container%20such%20as%20–%3E%0A%20%20%20%20%3C!–%20GlassFish%20–%3E%0A%20%20%20%20%3Cdependencies%3E%0A%20%20%20%20%20%20%20%20%3C!–%20These%20dependencies%20are%20required%20to%20run%20the%20project%20on%20the%20server%20–%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Java%20EE%207.0%20Web%20profile%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Ejavax%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ejavaee-web-api%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E7.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eprovided%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20MySQL%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Emysql%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Emysql-connector-java%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E5.1.40%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eprovided%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20PrimeFaces%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.primefaces%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eprimefaces%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E6.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20EclipseLink%20dependency%20for%20the%20static%20metamodel%20generator%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.eclipse.persistence%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eorg.eclipse.persistence.jpa.modelgen.processor%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.6.4%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Eprovided%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20These%20dependencies%20are%20required%20for%20testing%20only%20–%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Arquillian%20dependency%20for%20running%20tests%20on%20a%20remote%20GlassFish%20server%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.arquillian.container%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Earquillian-glassfish-remote-3.1%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.0.0.Final%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Resolves%20dependencies%20from%20the%20pom.xml%20when%20explicitly%20referred%20to%0A%20%20%20%20%20%20%20%20in%20the%20Arquillian%20deploy%20method%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.shrinkwrap.resolver%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eshrinkwrap-resolver-depchain%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ctype%3Epom%3C%2Ftype%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Connects%20Arquillian%20to%20JUnit%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.jboss.arquillian.junit%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Earquillian-junit-container%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20JUnit%20dependency%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Ejunit%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ejunit%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E4.12%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Selenium%20dependencies%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.seleniumhq.selenium%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ehtmlunit-driver%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.25%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20You%20will%20need%20a%20driver%20dependency%20for%20every%20browser%20you%20use%20in%0A%20%20%20%20%20%20%20%20testing.%20You%20can%20find%20the%20meven%20dependencies%20at%0A%20%20%20%20%20%20%20%20https%3A%2F%2Fmvnrepository.com%2Fartifact%2Forg.seleniumhq.selenium%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.seleniumhq.selenium%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eselenium-chrome-driver%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E3.2.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Normally%20you%20must%20download%20an%20exe%20for%20each%20browser.%20This%20library%0A%20%20%20%20%20%20%20%20will%20retrieve%20the%20the%20necessary%20file%20and%20place%20it%20in%20the%20classpath%20for%0A%20%20%20%20%20%20%20%20selenium%20to%20use%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eio.github.bonigarcia%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Ewebdrivermanager%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.6.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20A%20better%20way%20to%20write%20assertions%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.assertj%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eassertj-core%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.7.1%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Selenium%20uses%20SLF4J%20and%20log4j%20so%20these%20dependencies%20are%20needed%0A%20%20%20%20%20%20%20%20but%20just%20for%20test%20scope%20–%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.slf4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Eslf4j-api%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E1.7.23%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.logging.log4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Elog4j-slf4j-impl%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.8%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.logging.log4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Elog4j-api%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.8%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%20%20%20%20%20%20%20%20%3Cdependency%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.logging.log4j%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Elog4j-core%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.8%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cscope%3Etest%3C%2Fscope%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdependency%3E%0A%0A%20%20%20%20%3C%2Fdependencies%3E%0A%0A%20%20%20%20%3C!–%20Information%20for%20compiling%2C%20testing%20and%20packaging%20are%20define%20here%20–%3E%0A%20%20%20%20%3Cbuild%3E%0A%20%20%20%20%20%20%20%20%3C!–%20Folders%20in%20the%20project%20required%20during%20testing%20–%3E%0A%20%20%20%20%20%20%20%20%3CtestResources%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CtestResource%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdirectory%3Esrc%2Ftest%2Fresources%3C%2Fdirectory%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FtestResource%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CtestResource%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdirectory%3Esrc%2Ftest%2Fresources-glassfish-remote%3C%2Fdirectory%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FtestResource%3E%0A%20%20%20%20%20%20%20%20%3C%2FtestResources%3E%0A%0A%20%20%20%20%20%20%20%20%3C!–%20Plugins%20are%20components%20that%20Maven%20uses%20for%20specific%20purposes%20beyond%0A%20%20%20%20%20%20%20%20the%20basic%20tasks%20–%3E%0A%20%20%20%20%20%20%20%20%3Cplugins%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C!–%20Presence%20of%20this%20plugin%20suppress%20a%20warning%20about%20the%20existence%0A%20%20%20%20%20%20%20%20%20%20%20%20of%20the%20web.xml%20file%20–%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cplugin%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.maven.plugins%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Emaven-war-plugin%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E3.0.0%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fplugin%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cplugin%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C!–%20Executes%20JUnit%20tests%20and%20writes%20the%20results%20as%20an%20xml%20and%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20txt%20file%20Test%20classes%20must%20include%20one%20of%20the%20following%20in%20their%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20Test*%20*Test%20*TestCase%20–%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CgroupId%3Eorg.apache.maven.plugins%3C%2FgroupId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CartifactId%3Emaven-surefire-plugin%3C%2FartifactId%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cversion%3E2.19.1%3C%2Fversion%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cconfiguration%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CargLine%3E-Dfile.encoding%3D%24%7Bproject.build.sourceEncoding%7D%3C%2FargLine%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CskipTests%3Efalse%3C%2FskipTests%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fconfiguration%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fplugin%3E%0A%0A%20%20%20%20%20%20%20%20%3C%2Fplugins%3E%0A%20%20%20%20%3C%2Fbuild%3E%0A%3C%2Fproject%3E%0A%0A” message=”” highlight=”” provider=”manual”/]

 

 

IoT without the Breadboard Part 3

      No Comments on IoT without the Breadboard Part 3

Payara Micro and GrovePi+ Mashup

https://gitlab.com/omniprof/PayaraMicroGrovePiMashup

In this project I have combined two other projects. These are Steve Millidge’s, of Payara, proof of concept Java EE application that highlighted the use of the Payara Micro server on the Raspberry Pi. You can see the original article at http://blog.payara.fish/piyara-payara-micro-on-raspberry-pi-demo. The other project is Eduardo Moranchel’s IoTDevices project that presents how to work with the GrovePi with Java. You can find it at https://github.com/emoranchel/IoTDevices.

The Payara project presents a simulated stock ticker where the numbers are presented on a line graph. The IoTDevices project presents code to communicate with GrovePi modules using either the JavaME dio library or the Pi4J library. The mashup I created simply replaced the random number generator in the Payara project with readings of the DHT-11 temperature sensor using the IoTDevices code.

The changes in the two projects that I made were quite minor. For the IoTDevices I stripped away the JavaME dio code and removed the samples. For the Payara code all I changed was a few lines to read the sensor. For both projects I did upgrade their pom.xml files to how I expect my students to write these files.

Hardware

Here is the hardware you will need to run this project:

2x Raspberry Pi version 2 or 3. Version 1 might work but I did not test it.

1x GrovePi+. This is a Raspberry Pi shield or daughter board that interfaces with the Grove modules

1x Grove Temp&Humi Sensor

1x Grove – LCD RGB Backlight v2.0

I recommend purchasing the GrovePi+ Starter Kit for Raspberry Pi that includes a number of modules including the two for this project but not a Raspberry Pi.

Raspberry Pi Software

Here is the software you will need for the Raspberry Pi.

Raspbian OS for the Pi (https://www.raspberrypi.org/downloads/raspbian/)

You only need the standard distribution, currently called Jessie, that already comes with Java 1.8. All other required libraries will be packaged in the application.

Payara Micro (http://www.payara.fish/payara_micro)

This is a single jar that you will need on each Raspberry Pi. You can download it directly on the Pi or download it to your dev system and copy it to the two Pi systems. Take note of its full name as you will need this in your WinSCP script. For simplicity I placed this jar in my home folder on both Pi systems.

Windows Development System Software

Here is the software you will need for your development system. I use Windows but the project will work from any Linux distro or Mac OSX system.

Java 1.8

The IoTDevices project uses Java 1.8 features such as lambdas.

NetBeans 8.1

While you could use pretty much any IDE I feel strongly that NetBeans is the best choice.

WinSCP (https://winscp.net/eng/index.php)

This is a windows application that allows you to connect to, upload to and execute on a remote Linux system. I experimented with some other options but I found WinSCP to be the best. It will run a script that Linux or Mac users should be able to turn into a shell script for their systems.

Raspberry Pi Setup

On one of the Pi systems attach the GrovePi+ shield. To the GrovePi+ attach the Temp&Humi Sensor and the LCD RGB Backlight module. The second Pi does not use a shield.

For my code I am using the default user and password for the Pi systems. You will need to know the IP number of each Pi. I use Ethernet rather than wireless but that should not make any difference. I assume that you have started up and verified the operation of each Pi. Either download on the Pi or copy to it the Payara Micro jar file.

Windows Dev System Setup

Verify that you have Java 1.8, download and install WinSCP, and download and install NetBeans. Run NetBeans and use its integrated Git support to clone this project. You will be confronted with many errors but you can ignore them as they will be resolved as you build each project.

Making it work

Clone the project from https://gitlab.com/omniprof/PayaraMicroGrovePiMashup. The four individual projects that appear in NetBeans when you clone my project are:

  • GrovePi-pi4j
  • GrovePi-spec
  • TemperatureTicker
  • TemperatureWeb

Before you build anything you need to edit the two WinSCP scripts. In NetBeans switch to File view and you find them in each project’s root.

TemperatureTicker is from Steve Millidge and is an EJB timer. I modified it to read from the GrovePi+ rather than generate a random number and display this value on the LCD display. The value is also sent our over a web socket. Its WinSCP script is called tickertopi.txt and contains:

open "scp://pi:raspberry@192.168.0.92" -hostkey="*"
put target\TemperatureTicker.jar
call java -jar payara-micro-4.1.1.162.jar --deploy TemperatureTicker.jar
close
exit

Change the IP number to that of the Pi with the GrovePi+ shield. Change the user name and password if necessary. Change the version number of the payara-micro jar file to match whatever you downloaded.

The TemperatureWeb, also from Steve Millidge, is a web socket client that receives data from the TemperatureTicker application and then feeds this to a JavaScript graphing application. Read Steve’s article and watch his video to understand how it all works. Its WinSCP script is called webtopi.txt and contains:

open "scp://pi:raspberry@192.168.0.85" -hostkey="*"
put target\TemperatureWeb.war
call java -jar payara-micro-4.1.1.162.jar --deploy TemperatureWeb.war
close
exit

Change the IP number to that of the Pi without the GrovePi+ shield. Change the user name and password if necessary. Change the version number of the payara-micro jar file to match whatever you downloaded.

IMPORTANT: This is not a secure project. It should not be using the default Raspberry Pi user and communication should be using SSL. This is a proof of concept only.

Building

All projects are Maven based so all you need is a working Internet connection on your development PC. You do not use the Run command. The first project that you will Clean and Build is GrovePi-spec. next, Clean and Build GrovePi-pi4j. They must be built in this order as GrovePi-pi4j depends on GrovePi-spec.

At this point both Raspberry Pi systems should be up and running. Now you can Clean and Build TemperatureTicker and TemperatureWeb. The order is not important as long as they are built after the GrovePi projects. The TemperatureTicker jar file will be large because it is packaged with all necessary libraries. This is why you don’t require a customized version of the Raspbian OS.

Seeing the results

Assuming that the build did not generate any errors and the WinSCP scripts ran without errors you will need to open a browser on your PC.

http://192.168.0.85:8080/TemperatureWeb

Change the IP number to match the Pi without the GrovePi+ shield. If all goes well it will look like:

I held the sensor and breathed on it to change the readings. Otherwise it was going to be 22 C constantly.

Graph

Stopping the Payara Server

You will need a remote terminal for each Raspberry Pi to kill each instance of the server. I have not learned how to do this from within NetBeans.

There you have it, the Payara/GrovePi+ mashup.