Welcome!

Blog Feed Post

How I Created a Standard pom.xml file for Eclipse and NetBeans

After building my environment for JavaServer Faces in the Eclipse IDE it was time to move onto NetBeans. It should be simple, I thought. I was very, very wrong.

NetBeans Step 1

Create a new project for Maven->Web Application. Fill in the usual details about the Maven project. When complete and the project appears immediately edit the pom.xml file and replace the section that starts with <dependencies> until the end with the contents from my pom.xml file from my previous blog posts.

At this point the project is ready for you to write your code. Or so I thought . . .

NetBeans revealed a flaw in my pom.xml file. In Eclipse the classpath of a Maven project includes the server’s library. This makes the TomEE lib folder’s jar files available to Eclipse. This is not the case with NetBeans. When it handles a Maven based project it expects all references to libraries to be declared in the pom.xml only. The ability to add libraries to a project through the IDE is removed.

When I began working on this project  I was looking for a Maven dependency that referred to the TomEE libraries and not the Java EE 6 Oracle libraries. So the following dependency refers to the wrong version of the libraries.

<dependency>
   <groupId>javax</groupId>
   <artifactId>javaee-web-api</artifactId>
   <version>6.0</version>
   <scope>provided</scope>
</dependency>

Here is where I made one of many mistakes. I believed that the Maven TomEE plugin provided the correct libraries. So I placed in my pom.xml file:

<dependency>
   <groupId>org.apache.openejb.maven</groupId>
   <artifactId>tomee-maven-plugin</artifactId>
   <version>1.6.0</version>
   <scope>provided</scope>
</dependency>

This plugin has nothing to do with TomEE libraries. Instead its purpose is to allow a Maven pom.xml to be written that could, as listed on the TomEE maven Plugin page, do the following:

  • easy provisioning of a TomEE server
  • server start and stop
  • application deploy and undeploy

I did not notice the problem in Eclipse because it saw the TomEE libraries but when I tried to write a Facelet template file with NetBeans it reported that there was No Faces library in the classpath. So back to Google I went.

I found a blog entitled Developing Java EE 6 Applications With TomEE and NetBeans. It created a project by using an archetype. It showed how to add an archetype to Netbeans. It used the tomee-webapp-archetype.

The issue that I have with archetypes is that I must tell my students to delete or ignore parts of the project they create. When I used Maven in the classroom with Eclipse last term I used the maven-archetype-quickstart. Most of my students were confused by the generated files and chose to leave them in place unchanged. Most of my students’ projects displayed “Hello World!” in the console when run because they would not change the App.java file. Now I plan to start projects without an archetype.

What I was really interested in was the pom.xml file it created. It contained the dependency I was looking for that referenced the library used by TomEE:

<dependency>
   <groupId>org.apache.openejb</groupId>
   <artifactId>javaee-api</artifactId>
   <version>6.0-5</version>
   <scope>provided</scope>
</dependency>

It also included a plugin for the JPA. Great, now for some testing.

The sample code ran in NetBeans although it complained about the following tag in an xhtml file:

<h:body bgcolor="white">

Now I was getting ticked off. The sample web app does work and the error is ignored. I know it works because I changed the color to green. What I don’t understand is how the authors of this archetype felt it was acceptable to leave an error in their code. A little research revealed that it should have been written as:

<h:body style="background-color:white">

I now think I’m all set. As a further test I decide to try to add a new JSF Facelets template file. I could not create the file because NetBeans declared that there was No Facelets Libraries Found. But I thought org.apache.openejb.javaee-api would take care of this. A look into the Dependencies folder of the project revealed that there were no JSF libraries. So back to Google and the following was added:

<dependency>
   <groupId>org.apache.myfaces.core</groupId>
   <artifactId>myfaces-impl-ee6</artifactId>
   <version>2.1.1</version>
   <scope>provided</scope>
</dependency>

How can we be told that JSF should be used in place of Servlets and JSPs only to discover that org.apache.openejb.javaee-api does not include MyFaces? I found my fix and so it’s time to move on.

The archetype sample code now ran flawlessly and I could add new Facelet template files.

I had successfully followed the Eclipse JSF Tools Tutorial – JSF 2.0 using may Maven based project setup. You can find this tutorial in the Eclipse help system. I uploaded it to my SVN repository and then brought it down to NetBeans. It ran successfully in NetBeans. Now I replaced most of the pom.xml file with the new components from the archetype sample and it continued to run flawlessly. I was on a roll. So I updated the repository from NetBeans and brought the project back into Eclipse. Eclipse was not happy.

Eclipse complained about a section of the JPA plugin in the pom.xml file.

<executions>
   <execution>
      <id>enhancer</id>
      <phase>process-classes</phase>
      <goals>
         <goal>enhance</goal>
      </goals>
   </execution>
</executions>

I could comment these lines out but NetBeans was okay with them. The error message in Eclipse stated that “Plugin execution not covered by lifecycle configuration”. Back to Google and a solution was found. It seems Eclipse’s m2e plugin needs information about the lifecycle and this needed to be added to the pom.xml. You can read about this here.

So more elements were added to the pom.xml. I did discover that while you normally place plugins as a child of the <plugins> tag, the fix for Eclipse required the plugins to be children of <pluginManagement><plugins>.

Once Eclipse was happy I moved the project back through SVN to NetBeans and it did not mind the Eclipse specific elements in the pom.xml. The Eclipse tutorial project worked on both platforms and I could create the project from scratch on both platforms.

The last niggling problem was a warning whenever I ran the Eclipse tutorial. TomEE wrote out to the console:

WARNING: Attribute ‘for’ of label component with id j_id_a is not defined

I popped this into Google and came up with this answer.

The author of the Eclipse tutorial wrote:

<h:outputLabel value="Welcome #{loginBean.name}"></h:outputLabel>

This was the cause of the problem and the Stack Overflow author of the answer made some pretty strong remarks about whomever writes this in tutorials. I concurred. The fix is:

<h:outputText value="Welcome #{loginBean.name}"></h:outputText>

The tutorial also failed to use CDI correctly but that was a simple fix.

Here is the final version of the pom.xml file. Final, that is, until I discover some other component of the Java EE 6 Web profile that is missing from the org.apache.openejb.javaee-api.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.kenfogel</groupId>
   <artifactId>JSFExample01</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>war</packaging>
   <name>JSF Example</name>
   <description>JSF 2.0 Tools Tutorial from Eclipse</description>
   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
         <scope>test</scope>
      </dependency>
      <!-- Apache OpenEJB -->
      <dependency>
         <groupId>org.apache.openejb</groupId>
         <artifactId>javaee-api</artifactId>
         <version>6.0-5</version>
         <scope>provided</scope>
      </dependency>
      <!-- Apache MyFaces library that is included with TomEE 
           but not considered  part of the javaee-api -->
      <dependency>
         <groupId>org.apache.myfaces.core</groupId>
         <artifactId>myfaces-impl-ee6</artifactId>
         <version>2.1.1</version>
         <scope>provided</scope>
      </dependency>
   </dependencies>
   <build>
      <pluginManagement>
         <plugins>
            <!--This plugin's configuration is used to store 
                Eclipse m2e settings only. It has no influence 
                on the Maven build itself. Appears harmless in 
                NetBeans -->
            <plugin>
               <groupId>org.eclipse.m2e</groupId>
               <artifactId>lifecycle-mapping</artifactId>
               <version>1.0.0</version>
               <configuration>
                  <lifecycleMappingMetadata>
                     <pluginExecutions>
                        <pluginExecution>
                           <pluginExecutionFilter>
                              <groupId>some-group-id</groupId>
                              <artifactId>some-artifact-id
                              </artifactId>
                              <versionRange>[1.0.0,)</versionRange>
                              <goals>
                                 <goal>some-goal</goal>
                              </goals>
                           </pluginExecutionFilter>
                           <action>
                              <execute>
                                 <runOnIncremental>false
                                 </runOnIncremental>
                              </execute>
                           </action>
                        </pluginExecution>
                     </pluginExecutions>
                  </lifecycleMappingMetadata>
               </configuration>
            </plugin>
            <!-- Java Persistence API settings -->
            <plugin>
               <groupId>org.apache.openjpa</groupId>
               <artifactId>openjpa-maven-plugin</artifactId>
               <version>2.3.0</version>
               <configuration>
                  <includes>**/entities/*.class</includes>
                  <excludes>**/entities/XML*.class</excludes>
                  <addDefaultConstructor>true
                  </addDefaultConstructor>
                  <enforcePropertyRestrictions>true
                  </enforcePropertyRestrictions>
               </configuration>
               <!-- Maven settings not supported by Eclipse 
                    without the plugin above. NetBeans is fine with
                    with or without the plugin above -->
               <executions>
                  <execution>
                     <id>enhancer</id>
                     <phase>process-classes</phase>
                     <goals>
                        <goal>enhance</goal>
                     </goals>
                  </execution>
               </executions>
               <dependencies>
                  <dependency>
                     <groupId>org.apache.openjpa</groupId>
                     <artifactId>openjpa</artifactId>
                     <!-- set the version to be the same as the 
                          level in your runtime -->
                     <version>2.3.0</version>
                  </dependency>
               </dependencies>
            </plugin>
            <!-- used to compile the sources of your project -->
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.1</version>
               <!-- Java version -->
               <configuration>
                  <source>1.7</source>
                  <target>1.7</target>
               </configuration>
            </plugin>
            <!-- used during the test phase of the build 
                 lifecycle to execute the unit tests of 
                 an application -->
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>2.16</version>
            </plugin>
            <!-- responsible for collecting all artifact 
                 dependencies, classes and resources of the web 
                 application and packaging them into a 
                 war file -->
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-war-plugin</artifactId>
               <version>2.4</version>
               <configuration>
                  <failOnMissingWebXml>false</failOnMissingWebXml>
                  <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
               </configuration>
            </plugin>
         </plugins>
      </pluginManagement>
   </build>
   <!-- Repository to use if required files are not in the local 
        repository -->
   <repositories>
     <repository>
       <id>apache-snapshot</id>
       <name>Apache Snapshot Repository</name>
       <url>https://repository.apache.org/content/groups/snapshots/
       </url>
     </repository>
   </repositories>
   <properties>
      <project.build.sourceEncoding>UTF-8
      </project.build.sourceEncoding>
   </properties>
</project>

Please let me know if you see any errors. The fix for the Eclipse lifecycle error has meaningless information in it because I could not find any meaningful values. What I saw all appeared quite arbitrary.

I think that I can now begin planning the curriculum for my courses.

Read the original blog entry...

More Stories By Ken Fogel

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

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

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

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

@omniprof

Latest Stories
Artificial Intelligence has the potential to massively disrupt IoT. In his session at 18th Cloud Expo, AJ Abdallat, CEO of Beyond AI, will discuss what the five main drivers are in Artificial Intelligence that could shape the future of the Internet of Things. AJ Abdallat is CEO of Beyond AI. He has over 20 years of management experience in the fields of artificial intelligence, sensors, instruments, devices and software for telecommunications, life sciences, environmental monitoring, process...
In his session at 18th Cloud Expo, Sagi Brody, Chief Technology Officer at Webair Internet Development Inc., will focus on real world deployments of DDoS mitigation strategies in every layer of the network. He will give an overview of methods to prevent these attacks and best practices on how to provide protection in complex cloud platforms. He will also outline what we have found in our experience managing and running thousands of Linux and Unix managed service platforms and what specifically c...
Increasing IoT connectivity is forcing enterprises to find elegant solutions to organize and visualize all incoming data from these connected devices with re-configurable dashboard widgets to effectively allow rapid decision-making for everything from immediate actions in tactical situations to strategic analysis and reporting. In his session at 18th Cloud Expo, Shikhir Singh, Senior Developer Relations Manager at Sencha, will discuss how to create HTML5 dashboards that interact with IoT devic...
The IoTs will challenge the status quo of how IT and development organizations operate. Or will it? Certainly the fog layer of IoT requires special insights about data ontology, security and transactional integrity. But the developmental challenges are the same: People, Process and Platform. In his session at @ThingsExpo, Craig Sproule, CEO of Metavine, will demonstrate how to move beyond today's coding paradigm and share the must-have mindsets for removing complexity from the development proc...
We’ve worked with dozens of early adopters across numerous industries and will debunk common misperceptions, which starts with understanding that many of the connected products we’ll use over the next 5 years are already products, they’re just not yet connected. With an IoT product, time-in-market provides much more essential feedback than ever before. Innovation comes from what you do with the data that the connected product provides in order to enhance the customer experience and optimize busi...
SYS-CON Events announced today that SoftLayer, an IBM Company, has been named “Gold Sponsor” of SYS-CON's 18th Cloud Expo, which will take place on June 7-9, 2016, at the Javits Center in New York, New York. SoftLayer, an IBM Company, provides cloud infrastructure as a service from a growing number of data centers and network points of presence around the world. SoftLayer’s customers range from Web startups to global enterprises.
Many private cloud projects were built to deliver self-service access to development and test resources. While those clouds delivered faster access to resources, they lacked visibility, control and security needed for production deployments. In their session at 18th Cloud Expo, Steve Anderson, Product Manager at BMC Software, and Rick Lefort, Principal Technical Marketing Consultant at BMC Software, will discuss how a cloud designed for production operations not only helps accelerate developer...
A critical component of any IoT project is the back-end systems that capture data from remote IoT devices and structure it in a way to answer useful questions. Traditional data warehouse and analytical systems are mature technologies that can be used to handle large data sets, but they are not well suited to many IoT-scale products and the need for real-time insights. At Fuze, we have developed a backend platform as part of our mobility-oriented cloud service that uses Big Data-based approache...
Peak 10, Inc., has announced the implementation of IT service management, a business process alignment initiative based on the widely adopted Information Technology Infrastructure Library (ITIL) framework. The implementation of IT service management enhances Peak 10’s current service-minded approach to IT delivery by propelling the company to deliver higher levels of personalized and prompt service. The majority of Peak 10’s operations employees have been trained and certified in the ITIL frame...
trust and privacy in their ecosystem. Assurance and protection of device identity, secure data encryption and authentication are the key security challenges organizations are trying to address when integrating IoT devices. This holds true for IoT applications in a wide range of industries, for example, healthcare, consumer devices, and manufacturing. In his session at @ThingsExpo, Lancen LaChance, vice president of product management, IoT solutions at GlobalSign, will teach IoT developers how t...
As the rapid adoption of containers continues, companies are finding that they lack the operational tools to understand the behavior of applications deployed in these containers, and how to identify issues in their application infrastructure. For example, how are multiple containers within an application impacting each other’s performance? If an application’s service is degraded, which container is to blame? In the case of an application outage, what was the root cause of the outage?
Digital payments using wearable devices such as smart watches, fitness trackers, and payment wristbands are an increasing area of focus for industry participants, and consumer acceptance from early trials and deployments has encouraged some of the biggest names in technology and banking to continue their push to drive growth in this nascent market. Wearable payment systems may utilize near field communication (NFC), radio frequency identification (RFID), or quick response (QR) codes and barcodes...
SYS-CON Events announced today that CollabNet (www.collabnet.com) a global leader in enterprise software development and delivery solutions that help customers create high-quality applications at speed, will exhibit at SYS-CON's 18th International Cloud Expo®, which will take place on June 7-9, 2016, at the Javits Center in New York City, NY. The CEO of CollabNet Flint Brenton will also present about DevOps challenges in today’s global, open, and heterogeneous world of software development.
Much of the value of DevOps comes from a (renewed) focus on measurement, sharing, and continuous feedback loops. In increasingly complex DevOps workflows and environments, and especially in larger, regulated, or more crystallized organizations, these core concepts become even more critical. In his session at @DevOpsSummit at 18th Cloud Expo, Andi Mann, Chief Technology Advocate at Splunk, will show how, by focusing on 'metrics that matter,' you can provide objective, transparent, and meaningfu...
SYS-CON Events announced today that Peak 10, Inc., a national IT infrastructure and cloud services provider, will exhibit at SYS-CON's 18th International Cloud Expo®, which will take place on June 7-9, 2016, at the Javits Center in New York City, NY. Peak 10 provides reliable, tailored data center and network services, cloud and managed services. Its solutions are designed to scale and adapt to customers’ changing business needs, enabling them to lower costs, improve performance and focus inter...