| <html><head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Application Developer's Guide (7.0.77) - Development Processes</title><meta name="author" content="Craig R. McClanahan"><style type="text/css" media="print"> | |
| .noPrint {display: none;} | |
| td#mainBody {width: 100%;} | |
| </style><style type="text/css"> | |
| code {background-color:rgb(224,255,255);padding:0 0.1em;} | |
| code.attributeName, code.propertyName {background-color:transparent;} | |
| table { | |
| border-collapse: collapse; | |
| text-align: left; | |
| } | |
| table *:not(table) { | |
| /* Prevent border-collapsing for table child elements like <div> */ | |
| border-collapse: separate; | |
| } | |
| th { | |
| text-align: left; | |
| } | |
| div.codeBox pre code, code.attributeName, code.propertyName, code.noHighlight, .noHighlight code { | |
| background-color: transparent; | |
| } | |
| div.codeBox { | |
| overflow: auto; | |
| margin: 1em 0; | |
| } | |
| div.codeBox pre { | |
| margin: 0; | |
| padding: 4px; | |
| border: 1px solid #999; | |
| border-radius: 5px; | |
| background-color: #eff8ff; | |
| display: table; /* To prevent <pre>s from taking the complete available width. */ | |
| /* | |
| When it is officially supported, use the following CSS instead of display: table | |
| to prevent big <pre>s from exceeding the browser window: | |
| max-width: available; | |
| width: min-content; | |
| */ | |
| } | |
| div.codeBox pre.wrap { | |
| white-space: pre-wrap; | |
| } | |
| table.defaultTable tr, table.detail-table tr { | |
| border: 1px solid #CCC; | |
| } | |
| table.defaultTable tr:nth-child(even), table.detail-table tr:nth-child(even) { | |
| background-color: #FAFBFF; | |
| } | |
| table.defaultTable tr:nth-child(odd), table.detail-table tr:nth-child(odd) { | |
| background-color: #EEEFFF; | |
| } | |
| table.defaultTable th, table.detail-table th { | |
| background-color: #88b; | |
| color: #fff; | |
| } | |
| table.defaultTable th, table.defaultTable td, table.detail-table th, table.detail-table td { | |
| padding: 5px 8px; | |
| } | |
| p.notice { | |
| border: 1px solid rgb(255, 0, 0); | |
| background-color: rgb(238, 238, 238); | |
| color: rgb(0, 51, 102); | |
| padding: 0.5em; | |
| margin: 1em 2em 1em 1em; | |
| } | |
| </style></head><body bgcolor="#ffffff" text="#000000" link="#525D76" alink="#525D76" vlink="#525D76"><table border="0" width="100%" cellspacing="0"><!--PAGE HEADER--><tr><td><!--PROJECT LOGO--><a href="http://tomcat.apache.org/"><img src="../images/tomcat.gif" align="right" alt=" | |
| The Apache Tomcat Servlet/JSP Container | |
| " border="0"></a></td><td><h1><font face="arial,helvetica,sanserif">Apache Tomcat 7</font></h1><font face="arial,helvetica,sanserif">Version 7.0.77, Mar 28 2017</font></td><td><!--APACHE LOGO--><a href="http://www.apache.org/"><img src="../images/asf-logo.svg" align="right" alt="Apache Logo" border="0" style="width: 266px;height: 83px;"></a></td></tr></table><table border="0" width="100%" cellspacing="4"><!--HEADER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><tr><!--LEFT SIDE NAVIGATION--><td width="20%" valign="top" nowrap class="noPrint"><p><strong>Links</strong></p><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul><p><strong>Contents</strong></p><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></td><!--RIGHT SIDE MAIN BODY--><td width="80%" valign="top" align="left" id="mainBody"><h1>Development Processes</h1><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Table of Contents"><!--()--></a><a name="Table_of_Contents"><strong>Table of Contents</strong></a></font></td></tr><tr><td><blockquote> | |
| <ul><li><a href="#Development_Processes">Development Processes</a><ol><li><a href="#One-Time_Setup_of_Ant_and_Tomcat_for_Development">One-Time Setup of Ant and Tomcat for Development</a></li><li><a href="#Create_Project_Source_Code_Directory">Create Project Source Code Directory</a></li><li><a href="#Edit_Source_Code_and_Pages">Edit Source Code and Pages</a></li><li><a href="#Build_the_Web_Application">Build the Web Application</a></li><li><a href="#Test_Your_Web_Application">Test Your Web Application</a></li><li><a href="#Creating_a_Release">Creating a Release</a></li></ol></li></ul> | |
| </blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Development Processes"><!--()--></a><a name="Development_Processes"><strong>Development Processes</strong></a></font></td></tr><tr><td><blockquote> | |
| <p>Although application development can take many forms, this manual proposes | |
| a fairly generic process for creating web applications using Tomcat. The | |
| following sections highlight the commands and tasks that you, as the developer | |
| of the code, will perform. The same basic approach works when you have | |
| multiple programmers involved, as long as you have an appropriate source code | |
| control system and internal team rules about who is working on what parts | |
| of the application at any given time.</p> | |
| <p>The task descriptions below assume that you will be using CVS for source | |
| code control, and that you have already configured access to the appropriate | |
| CVS repository. Instructions for doing this are beyond the scope of this | |
| manual. If you are using a different source code control environment, you | |
| will need to figure out the corresponding commands for your system.</p> | |
| <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="One-Time Setup of Ant and Tomcat for Development"><!--()--></a><a name="One-Time_Setup_of_Ant_and_Tomcat_for_Development"><strong>One-Time Setup of Ant and Tomcat for Development</strong></a></font></td></tr><tr><td><blockquote> | |
| <p>In order to take advantage of the special Ant tasks that interact with the | |
| <em>Manager</em> web application, you need to perform the following tasks | |
| once (no matter how many web applications you plan to develop).</p> | |
| <ul> | |
| <li><p><em>Configure the Ant custom tasks</em>. The implementation code for the | |
| Ant custom tasks is in a JAR file named | |
| <code>$CATALINA_HOME/lib/catalina-ant.jar</code>, which must be | |
| copied in to the <code>lib</code> directory of your Ant installation. | |
| </p></li> | |
| <li><p><em>Define one or more Tomcat users</em>. The <em>Manager</em> web | |
| application runs under a security constraint that requires a user to be | |
| logged in, and have the security role <code>manager-script</code> assigned | |
| to him or her. How such users are defined depends on which Realm you have | |
| configured in Tomcat's <code>conf/server.xml</code> file -- see the | |
| <a href="../realm-howto.html">Realm Configuration HOW-TO</a> for more | |
| information. You may define any number of users (with any username | |
| and password that you like) with the <code>manager-script</code> role. | |
| </p></li> | |
| </ul> | |
| </blockquote></td></tr></table> | |
| <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Create Project Source Code Directory"><!--()--></a><a name="Create_Project_Source_Code_Directory"><strong>Create Project Source Code Directory</strong></a></font></td></tr><tr><td><blockquote> | |
| <p>The first step is to create a new project source directory, and customize | |
| the <code>build.xml</code> and <code>build.properties</code> files you will | |
| be using. The directory structure is described in <a href="source.html">the | |
| previous section</a>, or you can use the | |
| <a href="sample/">sample application</a> as a starting point.</p> | |
| <p>Create your project source directory, and define it within your CVS | |
| repository. This might be done by a series of commands like this, where | |
| <code>{project}</code> is the name under which your project should be | |
| stored in the CVS repository, and {username} is your login username:</p> | |
| <div class="codeBox"><pre><code>cd {my home directory} | |
| mkdir myapp <-- Assumed "project source directory" | |
| cd myapp | |
| mkdir docs | |
| mkdir src | |
| mkdir web | |
| mkdir web/WEB-INF | |
| cvs import -m "Initial Project Creation" {project} \ | |
| {username} start</code></pre></div> | |
| <p>Now, to verify that it was created correctly in CVS, we will perform a | |
| checkout of the new project:</p> | |
| <div class="codeBox"><pre><code>cd .. | |
| mv myapp myapp.bu | |
| cvs checkout {project}</code></pre></div> | |
| <p>Next, you will need to create and check in an initial version of the | |
| <code>build.xml</code> script to be used for development. For getting | |
| started quickly and easily, base your <code>build.xml</code> on the | |
| <a href="build.xml.txt">basic build.xml file</a>, included with this manual, | |
| or code it from scratch.</p> | |
| <div class="codeBox"><pre><code>cd {my home directory} | |
| cd myapp | |
| emacs build.xml <-- if you want a real editor :-) | |
| cvs add build.xml | |
| cvs commit</code></pre></div> | |
| <p>Until you perform the CVS commit, your changes are local to your own | |
| development directory. Committing makes those changes visible to other | |
| developers on your team that are sharing the same CVS repository.</p> | |
| <p>The next step is to customize the Ant <em>properties</em> that are | |
| named in the <code>build.xml</code> script. This is done by creating a | |
| file named <code>build.properties</code> in your project's top-level | |
| directory. The supported properties are listed in the comments inside | |
| the sample <code>build.xml</code> script. At a minimum, you will generally | |
| need to define the <code>catalina.home</code> property defining where | |
| Tomcat is installed, and the manager application username and password. | |
| You might end up with something like this:</p> | |
| <div class="codeBox"><pre><code># Context path to install this application on | |
| app.path=/hello | |
| # Tomcat 7 installation directory | |
| catalina.home=/usr/local/apache-tomcat-7.0 | |
| # Manager webapp username and password | |
| manager.username=myusername | |
| manager.password=mypassword</code></pre></div> | |
| <p>In general, you will <strong>not</strong> want to check the | |
| <code>build.properties</code> file in to the CVS repository, because it | |
| is unique to each developer's environment.</p> | |
| <p>Now, create the initial version of the web application deployment | |
| descriptor. You can base <code>web.xml</code> on the | |
| <a href="web.xml.txt">basic web.xml file</a>, or code it from scratch.</p> | |
| <div class="codeBox"><pre><code>cd {my home directory} | |
| cd myapp/web/WEB-INF | |
| emacs web.xml | |
| cvs add web.xml | |
| cvs commit</code></pre></div> | |
| Note that this is only an example web.xml file. The full definition | |
| of the deployment descriptor file is in the | |
| <a href="http://wiki.apache.org/tomcat/Specifications">Servlet Specification.</a> | |
| </blockquote></td></tr></table> | |
| <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Edit Source Code and Pages"><!--()--></a><a name="Edit_Source_Code_and_Pages"><strong>Edit Source Code and Pages</strong></a></font></td></tr><tr><td><blockquote> | |
| <p>The edit/build/test tasks will generally be your most common activities | |
| during development and maintenance. The following general principles apply. | |
| As described in <a href="source.html">Source Organization</a>, newly created | |
| source files should be located in the appropriate subdirectory, under your | |
| project source directory.</p> | |
| <p>Whenever you wish to refresh your development directory to reflect the | |
| work performed by other developers, you will ask CVS to do it for you:</p> | |
| <div class="codeBox"><pre><code>cd {my home directory} | |
| cd myapp | |
| cvs update -dP</code></pre></div> | |
| <p>To create a new file, go to the appropriate directory, create the file, | |
| and register it with CVS. When you are satisfied with it's contents (after | |
| building and testing is successful), commit the new file to the repository. | |
| For example, to create a new JSP page:</p> | |
| <div class="codeBox"><pre><code>cd {my home directory} | |
| cd myapp/web <-- Ultimate destination is document root | |
| emacs mypage.jsp | |
| cvs add mypage.jsp | |
| ... build and test the application ... | |
| cvs commit</code></pre></div> | |
| <p>Java source code that is defined in packages must be organized in a | |
| directory hierarchy (under the <strong>src/</strong> subdirectory) that | |
| matches the package names. For example, a Java class named | |
| <code>com.mycompany.mypackage.MyClass.java</code> should be stored in file | |
| <code>src/com/mycompany/mypackage/MyClass.java</code>. | |
| Whenever you create a new subdirectory, don't forget to | |
| register it with CVS.</p> | |
| <p>To edit an existing source file, you will generally just start editing | |
| and testing, then commit the changed file when everything works. Although | |
| CVS can be configured to required you to "check out" or "lock" a file you | |
| are going to be modifying, this is generally not used.</p> | |
| </blockquote></td></tr></table> | |
| <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Build the Web Application"><!--()--></a><a name="Build_the_Web_Application"><strong>Build the Web Application</strong></a></font></td></tr><tr><td><blockquote> | |
| <p>When you are ready to compile the application, issue the following | |
| commands (generally, you will want a shell window open that is set to | |
| the project source directory, so that only the last command is needed):</p> | |
| <div class="codeBox"><pre><code>cd {my home directory} | |
| cd myapp <-- Normally leave a window open here | |
| ant</code></pre></div> | |
| <p>The Ant tool will be execute the default "compile" target in your | |
| <code>build.xml</code> file, which will compile any new or updated Java | |
| code. If this is the first time you compile after a "build clean", | |
| it will cause everything to be recompiled.</p> | |
| <p>To force the recompilation of your entire application, do this instead:</p> | |
| <div class="codeBox"><pre><code>cd {my home directory} | |
| cd myapp | |
| ant all</code></pre></div> | |
| <p>This is a very good habit immediately before checking in changes, to | |
| make sure that you have not introduced any subtle problems that Javac's | |
| conditional checking did not catch.</p> | |
| </blockquote></td></tr></table> | |
| <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Test Your Web Application"><!--()--></a><a name="Test_Your_Web_Application"><strong>Test Your Web Application</strong></a></font></td></tr><tr><td><blockquote> | |
| <p>To test your application, you will want to install it under Tomcat. The | |
| quickest way to do that is to use the custom Ant tasks that are included in | |
| the sample <code>build.xml</code> script. Using these commands might follow | |
| a pattern like this:</p> | |
| <ul> | |
| <li><p><em>Start Tomcat if needed</em>. If Tomcat is not already running, | |
| you will need to start it in the usual way. | |
| </p></li> | |
| <li><p><em>Compile your application</em>. Use the <code>ant compile</code> | |
| command (or just <code>ant</code>, since this is the default). Make | |
| sure that there are no compilation errors. | |
| </p></li> | |
| <li><p><em>Install the application</em>. Use the <code>ant install</code> | |
| command. This tells Tomcat to immediately start running your app on | |
| the context path defined in the <code>app.path</code> build property. | |
| Tomcat does <strong>NOT</strong> have to be restarted for this to | |
| take effect. | |
| </p></li> | |
| <li><p><em>Test the application</em>. Using your browser or other testing | |
| tools, test the functionality of your application. | |
| </p></li> | |
| <li><p><em>Modify and rebuild as needed</em>. As you discover that changes | |
| are required, make those changes in the original <strong>source</strong> | |
| files, not in the output build directory, and re-issue the | |
| <code>ant compile</code> command. This ensures that your changes will | |
| be available to be saved (via <code>cvs commit</code>) later on -- | |
| the output build directory is deleted and recreated as necessary. | |
| </p></li> | |
| <li><p><em>Reload the application</em>. Tomcat will recognize changes in | |
| JSP pages automatically, but it will continue to use the old versions | |
| of any servlet or JavaBean classes until the application is reloaded. | |
| You can trigger this by executing the <code>ant reload</code> command. | |
| </p></li> | |
| <li><p><em>Remove the application when you are done</em>. When you are through | |
| working on this application, you can remove it from live execution by | |
| running the <code>ant remove</code> command. | |
| </p></li> | |
| </ul> | |
| <p>Do not forget to commit your changes to the source code repository when | |
| you have completed your testing!</p> | |
| </blockquote></td></tr></table> | |
| <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Creating a Release"><!--()--></a><a name="Creating_a_Release"><strong>Creating a Release</strong></a></font></td></tr><tr><td><blockquote> | |
| <p>When you are through adding new functionality, and you've tested everything | |
| (you DO test, don't you :-), it is time to create the distributable version | |
| of your web application that can be deployed on the production server. The | |
| following general steps are required:</p> | |
| <ul> | |
| <li><p>Issue the command <code>ant all</code> from the project source | |
| directory, to rebuild everything from scratch one last time. | |
| </p></li> | |
| <li><p>Use the <code>cvs tag</code> command to create an identifier for | |
| all of the source files utilized to create this release. This allows | |
| you to reliably reconstruct a release (from sources) at a later | |
| time. | |
| </p></li> | |
| <li><p>Issue the command <code>ant dist</code> to create a distributable | |
| web application archive (WAR) file, as well as a JAR file containing | |
| the corresponding source code. | |
| </p></li> | |
| <li><p>Package the contents of the <code>dist</code> directory using the | |
| <strong>tar</strong> or <strong>zip</strong> utility, according to | |
| the standard release procedures used by your organization. | |
| </p></li> | |
| </ul> | |
| </blockquote></td></tr></table> | |
| </blockquote></td></tr></table></td></tr><tr class="noPrint"><td width="20%" valign="top" nowrap class="noPrint"></td><td width="80%" valign="top" align="left"><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="comments_section" id="comments_section"><strong>Comments</strong></a></font></td></tr><tr><td><blockquote><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions | |
| on improving documentation for Apache Tomcat.<br><br> | |
| If you have trouble and need help, read | |
| <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page | |
| and ask your question on the tomcat-users | |
| <a href="http://tomcat.apache.org/lists.html">mailing list</a>. | |
| Do not ask such questions here. This is not a Q&A section.<br><br> | |
| The Apache Comments System is explained <a href="../comments.html">here</a>. | |
| Comments may be removed by our moderators if they are either | |
| implemented or considered invalid/off-topic.</p><script type="text/javascript"><!--//--><![CDATA[//><!-- | |
| var comments_shortname = 'tomcat'; | |
| var comments_identifier = 'http://tomcat.apache.org/tomcat-7.0-doc/appdev/processes.html'; | |
| (function(w, d) { | |
| if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { | |
| d.write('<div id="comments_thread"><\/div>'); | |
| var s = d.createElement('script'); | |
| s.type = 'text/javascript'; | |
| s.async = true; | |
| s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; | |
| (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); | |
| } | |
| else { | |
| d.write('<div id="comments_thread"><strong>Comments are disabled for this page at the moment.<\/strong><\/div>'); | |
| } | |
| })(window, document); | |
| //--><!]]></script></blockquote></td></tr></table></td></tr><!--FOOTER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><!--PAGE FOOTER--><tr><td colspan="2"><div align="center"><font color="#525D76" size="-1"><em> | |
| Copyright © 1999-2017, Apache Software Foundation | |
| </em></font></div></td></tr></table></body></html> |