
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xml:lang="en" lang="en">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
		<title>$windowTitle</title>
		<link rel="stylesheet" type="text/css" href="stylesheet.css" title="style" />
	</head>
	<body>
				<div class="overview">
			<ul>
				<li class="selected">Overview</li>
				<li>Package</li>
			</ul>
		</div>
		<div class="framenoframe">
			<ul>
				<li>
					<a href="index.html" target="_top">FRAMES</a>
				</li>
				<li>
    	        	<a href="overview-summary.html" target="_top">NO FRAMES</a>
        	  	</li>
	        </ul>
      	</div>
		
		      	<h2>Maven Jxr Plugin Default Configuration Test 1.0-SNAPSHOT Reference</h2>

		<table class="summary">
        	<thead>
          		<tr>
            		<th>Packages</th>
          		</tr>
        	</thead>
        	<tbody>
    	    	            	<tr>
              		<td>
                		<a href="def/configuration/package-summary.html">def.configuration</a>
              		</td>
            	</tr>
	          	        	</tbody>
      	</table>
		
				<div class="overview">
			<ul>
				<li class="selected">Overview</li>
				<li>Package</li>
			</ul>
		</div>
		<div class="framenoframe">
			<ul>
				<li>
					<a href="index.html" target="_top">FRAMES</a>
				</li>
				<li>
    	        	<a href="overview-summary.html" target="_top">NO FRAMES</a>
        	  	</li>
	        </ul>
      	</div>
		
		<hr />
		Copyright 2006 Apache Foundation
	</body>
</html>