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”/]

 

 

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

    1. Ken Fogel Post author

      You are correct, I will update the article and remove it from the pom. It shows how we cut and paste without thought. Thank you for pointing it out.

      Reply
  1. Michael

    Hi,
    as said on twitter: Why do you configure surefire to skip all tests per default?

    Also regarding Metamodel: IMHO just including the generator as dependencies does exactly nothing. It’s not an annotation processor like Lombok but must be explicitly called to generate the JPA meta model.

    One (the usual?) way is to configure it through the maven-processor plugin (which is the one that depends on the generator). Here’s a (working) example I use in several projects with the Hibernate implementation, should be similar with Eclipse link

    org.bsc.maven
    maven-processor-plugin
    3.1.0

    process

    process

    generate-sources

    org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor

    ${project.build.directory}/generated-sources/JPAMetaModel/

    org.hibernate
    hibernate-jpamodelgen
    ${hibernate.version}

    Reply
    1. Ken Fogel Post author

      I had the bsc plugin but then I needed to have the compiler plugin to add the arg -proc:none. Without this arg I got two generated meta classes. So I removed bsc and I removed the compiler plugin. I just ran a test where I commented out the metamodel plugin and when I did a clean and build there was no Generated source. Restored the plugin and the generated source returned. I will have to test it on Eclipse to detremine if it is NetBeans that is stepping in and generating the source when the metamodel plugin is present but that seems unlikely.

      Reply
      1. Michael

        No, it’s Eclipse that’s causing the problem as usual when it comes to Maven.

        NetBeans does nothing special.

        Best tip here: Always try to run it without the “magic” of an IDE. mvn clean package should get you what you want. The snippet respectively the stackoverflow link are the way to configure the meta model generator. What the IDE does is 2nd. NetBeans does a good job recognizing the generated sources as classpath dependency and is done with. Regarding Eclipse: All things might happen 😉

        Reply
  2. Ken Fogel Post author

    To recap, you do not need the maven-processor-plugin to do annotation processing if the version of Java is 7 or greater and you only use 1 annotation processor listed as a dependency such as org.eclipse.persistence.jpa.modelgen.processor. This is a Maven feature and has nothing to do with the IDE.

    Reply
  3. Karl Heinz Marbaise

    I have taken a look into your pom file and identified some parts which might be improved. First you have given an artifactId like the following:

    KFWebStandardProject

    The best practice is to use lower case only. You can use a dash(es) to separate parts for example like here:

    http://search.maven.org/#artifactdetails%7Corg.jboss.arquillian.testng%7Carquillian-testng-parent%7C1.1.12.Final%7Cpom

    Furthermore you have written that FINAL is commonly use to refer to stable production.

    This is only being used of some products/organisations. But to be clear the difference between a development version which is identified by the “-SNAPSHOT” and a final release is just by removing the “-SNAPSHOT” from it. Everything else is just the freedom of the projects. Apart from that you can use a version like this: 4.6.7.8.3-RC1 or 12.3.4.7-alpha-1 etc.

    You have given the name definition in the pom file like this:

    ${project.artifactId}

    One of the foundations in Maven is based on convention over configuration. What you have given is the default which means you can remove this.

    The next part is that you have defined several folders like this:

    src/test/resources

    src/test/resources-glassfish-remote

    The question is why you are redefining the defaults of Maven (except resources-glassfish-remote) ? As already mentioned only define them if you really need them otherwise do not configure it. May be I misunderstand a thing here but what is the intention of resources-glassfish-remote folder?

    Than you are referencing a warning about the maven-war-plugin. That shows that you should define the plugins in pluginManagement section to define the version of the plugin to overwrite the version which are inherited by the default life cycle

    http://maven.apache.org/ref/3.3.9/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging

    An finally you are defining the maven-surefire-plugin with supplemental args defining the encoding which is not necessary cause it’s already done using the property project.build.sourceEncoding which is also handled by the maven-surefire-plugin. Furthermore to suppress the execution of the unit tests can simply achieved by using:

    mvn -DskipTests clean package

    Or by using -Dmaven.test.skip=true you can skip also the compiling of tests…
    on the maven command line…and not hard coding the skipping in the pom file…

    Furthermore I would suggest to use the real power of Maven and define a general parent which all of the student projects can inherit from…

    Kind regards
    Karl Heinz Marbaise

    Reply
    1. Ken Fogel Post author

      While cleaning up my pom.xml I discovered that the element you described as redundant, src/test/resources, is required for Arquillian testing to work. This folder contains the sql code to seed the database. Even though I refer to it in the Shrinkwrap method it is not picked up by Arquillian without the element in the pom.xml.

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.