blob: b0002b4214f12f080f99d34ad11e1963b7983058 [file] [log] [blame]
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +00001<?xml version="1.0" encoding="ISO-8859-1" ?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
4<head>
5 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
6 <link rel="stylesheet" href=".resources/doc.css" charset="ISO-8859-1" type="text/css" />
Marc R. Hoffmanna760f322010-03-10 22:23:52 +00007 <link rel="stylesheet" href="../coverage/.resources/prettify.css" charset="ISO-8859-1" type="text/css" />
8 <script type="text/javascript" src="../coverage/.resources/prettify.js"></script>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +00009 <title>JaCoCo - Ant Tasks</title>
10</head>
Marc R. Hoffmanna760f322010-03-10 22:23:52 +000011<body onload="prettyPrint()">
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000012
13<div class="breadcrumb">
14 <a href="../index.html" class="el_session">JaCoCo</a> &gt;
15 <a href="index.html" class="el_group">Documentation</a> &gt;
16 <span class="el_source">Ant Tasks</span>
17</div>
Marc R. Hoffmann17be2692010-02-02 05:44:47 +000018<div id="content">
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000019
20<h1>Ant Tasks</h1>
21
22<p>
23 JaCoCo comes with Ant tasks to launch Java programs with execution recording
Marc R. Hoffmannb8a77462009-08-21 14:53:50 +000024 and for creating coverage reports from the recorded data. The JaCoCo Ant tasks
25 require
26</p>
27
28<ul>
29 <li>Ant 1.7.0 or higher and</li>
30 <li>Java 1.5 or higher (for both, the Ant runner and the test executor).</li>
31</ul>
32
33
Marc R. Hoffmann57f9ab42009-08-24 10:52:42 +000034<p>All tasks are defined in <code>jacocoant.jar</code> (which is part of the
35 distribution) and can be included in your Ant scripts with the usual
36 <code>taskdef</code> declaration:
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000037</p>
38
Marc R. Hoffmanna760f322010-03-10 22:23:52 +000039<pre class="source lang-xml">
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000040<span class="nr"> 1</span>&lt;project name="Example" xmlns:jacoco="antlib:org.jacoco.ant"&gt;
41<span class="nr"> 2</span>
42<span class="nr"> 3</span> &lt;taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"&gt;
43<span class="nr"> 4</span> &lt;classpath&gt;
Marc R. Hoffmanndb930772009-08-20 17:17:37 +000044<span class="nr"> 5</span> &lt;pathelement location="<i>path_to_jacoco</i>/lib/jacocoant.jar"/&gt;
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000045<span class="nr"> 6</span> &lt;/classpath&gt;
46<span class="nr"> 7</span> &lt;/taskdef&gt;
47<span class="nr"> 8</span>
48<span class="nr"> 9</span> ...
49<span class="nr"> 10</span>
50<span class="nr"> 11</span>&lt;/project&gt;
51</pre>
52
53<p>
Marc R. Hoffmanndb3e7d02009-08-12 10:57:39 +000054 Alternatively you might also place the <code>jacocoant.jar</code> in your
55 Ant <code><i>ANT_HOME</i>/lib</code> folder. If you use the name space URI
56 <code>antlib:org.jacoco.ant</code> for JaCoCo tasks Ant will find them
57 automatically without the <code>taskdef</code> declaration above.
58</p>
59
60<p>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000061 Declaring a XML namespace for JaCoCo tasks is optional but always recommended
62 if you mix tasks from different libraries. All subsequent examples use the
63 <code>jacoco</code> prefix declared above.
64</p>
65
66
Brock Janiczakd267c572010-01-28 09:53:54 +000067<h2><a name="coverage">Task <code>coverage</code></a></h2>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000068
69<p>
70 The standard Ant tasks to launch Java programs are <code>java</code> and
71 <code>junit</code>. To add code coverage recording to these tasks they can
72 simply be wrapped with the <code>coverage</code> task as shown in the
73 following examples:
74</p>
75
Marc R. Hoffmanna760f322010-03-10 22:23:52 +000076<pre class="source lang-xml">
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +000077<span class="nr"> 1</span>&lt;jacoco:coverage>
78<span class="nr"> 2</span> &lt;java classname="org.jacoco.examples.HelloJaCoCo" fork="true"&gt;
79<span class="nr"> 3</span> &lt;classpath&gt;
80<span class="nr"> 4</span> &lt;pathelement location="./bin"/&gt;
81<span class="nr"> 5</span> &lt;/classpath&gt;
82<span class="nr"> 6</span> &lt;/java&gt;
83<span class="nr"> 7</span>&lt;/jacoco:coverage&gt;
84<span class="nr"> 8</span>
85<span class="nr"> 9</span>
86<span class="nr"> 10</span>&lt;jacoco:coverage>
87<span class="nr"> 11</span> &lt;junit fork="true" forkmode="once"&gt;
88<span class="nr"> 12</span> &lt;test name="org.jacoco.examples.HelloJaCoCoTest"/&gt;
89<span class="nr"> 13</span> &lt;classpath&gt;
90<span class="nr"> 14</span> &lt;pathelement location="./bin"/&gt;
91<span class="nr"> 15</span> &lt;/classpath&gt;
92<span class="nr"> 16</span> &lt;/junit&gt;
93<span class="nr"> 17</span>&lt;/jacoco:coverage>
94</pre>
95
96<p>
Radek Libaad5fbc92009-10-26 13:26:53 +000097 Resulting coverage information is collected during execution and written
98 to a file when the process terminates. Note the <code>fork</code> attribute
99 above in the wrapped <code>java</code> task.
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000100</p>
101
102<p class="hint">
103 The nested task always has to declare <code>fork="true"</code>, otherwise the
104 <code>coverage</code> task can't record coverage information and will fail.
105 In addition the <code>junit</code> task should declare
106 <code>forkmode="once"</code> to avoid starting a new JVM for every single test
107 case and decreasing execution performance dramatically (unless this is
108 required by the nature of the test cases).
109</p>
110
111<p>
112 The coverage task must wrap exactly one task. While it typically works without
113 any configuration, the behavior can be adjusted with some optional attributes:
114</p>
115
116<table class="coverage">
117 <thead>
118 <tr>
119 <td>Attribute</td>
120 <td>Description</td>
121 <td>Default</td>
122 </tr>
123 </thead>
124 <tbody>
125 <tr>
Brock Janiczakd267c572010-01-28 09:53:54 +0000126 <td><code>enabled</code></td>
127 <td>If set to <code>true</code> coverage data will be collected for the contained task.</td>
128 <td><code>true</code></td>
129 </tr>
Marc R. Hoffmanne3ef2f32010-01-28 18:17:46 +0000130 <tr>
Brock Janiczak003d47c2010-01-15 00:45:17 +0000131 <td><code>destfile</code></td>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000132 <td>Path to the output file for execution data.</td>
133 <td><code>jacoco.exec</code></td>
134 </tr>
135 <tr>
Brock Janiczak003d47c2010-01-15 00:45:17 +0000136 <td><code>append</code></td>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000137 <td>If set to <code>true</code> and the execution data file already
Brock Janiczak003d47c2010-01-15 00:45:17 +0000138 exists, coverage data is appended to the existing file. If set to
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000139 <code>false</code>, an existing execution data file will be replaced.
140 </td>
141 <td><code>true</code></td>
142 </tr>
143 <tr>
Marc R. Hoffmanncf5345f2009-09-10 15:01:24 +0000144 <td><code>includes</code></td>
Radek Libaad5fbc92009-10-26 13:26:53 +0000145 <td>A list of class names that should be included in execution analysis.
Marc R. Hoffmanncf5345f2009-09-10 15:01:24 +0000146 The list entries are separated by a vertical bar (<code>|</code>) and
147 may use wildcard characters (<code>*</code> and <code>?</code>).
148 Except for performance optimization or technical corner cases this
149 option is normally not required.
150 </td>
151 <td><code>*</code> (all classes)</td>
152 </tr>
153 <tr>
154 <td><code>excludes</code></td>
155 <td>A list of class names that should be excluded from execution analysis.
156 The list entries are separated by a vertical bar (<code>|</code>) and
157 may use wildcard characters (<code>*</code> and <code>?</code>).
158 Except for performance optimization or technical corner cases this
159 option is normally not required.
160 </td>
161 <td><i>empty</i> (no excluded classes)</td>
162 </tr>
163 <tr>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000164 <td><code>exclclassloader</code></td>
Marc R. Hoffmann2a6b5bf2009-08-11 12:54:36 +0000165 <td>A list of class loader names, that should be excluded from execution
166 analysis. The list entries are separated by a vertical bar
167 (<code>|</code>) and may use wildcard characters (<code>*</code> and
168 <code>?</code>). This option might be required in case of special
Marc R. Hoffmann57f9ab42009-08-24 10:52:42 +0000169 frameworks that conflict with JaCoCo code instrumentation, in
170 particular class loaders that do not have access to the Java runtime
171 classes.
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000172 </td>
173 <td><code>sun.reflect.DelegatingClassLoader</code></td>
174 </tr>
175 </tbody>
176</table>
177
178
Brock Janiczakd267c572010-01-28 09:53:54 +0000179<h2><a name="agent">Task <code>agent</code></a></h2>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000180
Marc R. Hoffmannd519add2009-08-11 11:09:29 +0000181<p>
182 If the <code>coverage</code> task is not suitable for your launch target, you
183 might alternatively use the <code>agent</code> task to create the Java agent
184 parameter. The following example defines a Ant property with the name
Radek Libaad5fbc92009-10-26 13:26:53 +0000185 <code>agentvmparam</code> that can be directly used as a Java VM parameter:
Marc R. Hoffmannd519add2009-08-11 11:09:29 +0000186</p>
187
Marc R. Hoffmanna760f322010-03-10 22:23:52 +0000188<pre class="source lang-xml">
Marc R. Hoffmannd519add2009-08-11 11:09:29 +0000189<span class="nr"> 1</span>&lt;jacoco:agent property="agentvmparam"/>
190</pre>
191
192<p>
193 This task has the same attributes as the <code>coverage</code> task plus an
194 additional property to specify the target property name:
195</p>
196
197<table class="coverage">
198 <thead>
199 <tr>
200 <td>Attribute</td>
201 <td>Description</td>
202 <td>Default</td>
203 </tr>
204 </thead>
205 <tbody>
206 <tr>
Brock Janiczakd267c572010-01-28 09:53:54 +0000207 <td><code>enabled</code></td>
208 <td>When this variable is set to <code>false</code> the value of <code>property</code> will be set to an empty string, effectively
Marc R. Hoffmanne3ef2f32010-01-28 18:17:46 +0000209 disabling coverage instrumentation for any tasks that used the value.</td>
Brock Janiczakd267c572010-01-28 09:53:54 +0000210 <td><code>true</code></td>
211 </tr>
212 <tr>
Marc R. Hoffmannd519add2009-08-11 11:09:29 +0000213 <td><code>property</code></td>
214 <td>Name of the Ant property to set.</td>
215 <td><i>none (required)</i></td>
216 </tr>
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000217 <tr>
218 <td colspan="3"><i>All attributes of the <code>coverage</code> task.</i></td>
219 </tr>
Marc R. Hoffmannd519add2009-08-11 11:09:29 +0000220 </tbody>
221</table>
222
Brock Janiczak74c16592010-01-29 21:34:14 +0000223
224<h2><a name="merge">Task <code>merge</code></a></h2>
225
226<p>
227 This task can be used to merge the execution data from multiple test runs
228 into a single data store.
229</p>
230
Marc R. Hoffmanna760f322010-03-10 22:23:52 +0000231<pre class="source lang-xml">
Marc R. Hoffmann5c8a7032010-02-25 11:15:54 +0000232<span class="nr"> 1</span>&lt;jacoco:merge destfile="merged.exec"&gt;
233<span class="nr"> 2</span> &lt;fileset dir="executionData" includes="*.exec"/&gt;
234<span class="nr"> 3</span>&lt;/jacoco:merge&gt;
Brock Janiczak74c16592010-01-29 21:34:14 +0000235</pre>
236
237<p>
238 The task definition can contain any number of resource collection types and
239 has the following mandatory attribute:
240</p>
241
242<table class="coverage">
243 <thead>
244 <tr>
245 <td>Attribute</td>
246 <td>Description</td>
247 <td>Default</td>
248 </tr>
249 </thead>
250 <tbody>
251 <tr>
252 <td><code>destfile</code></td>
253 <td>Location to write the merged execution data.</td>
254 <td><i>none (required)</i></td>
255 </tr>
256 </tbody>
257</table>
258
259
Brock Janiczakd267c572010-01-28 09:53:54 +0000260<h2><a name="report">Task <code>report</code></a></h2>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000261
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000262<p>
263 Finally different reports can be created with the <code>report</code> task.
264 A report task declaration consists of different sections, two specify the
265 input data, additional ones specify the output formats:
266</p>
267
Marc R. Hoffmanna760f322010-03-10 22:23:52 +0000268<pre class="source lang-xml">
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000269<span class="nr"> 1</span>&lt;jacoco:report&gt;
270<span class="nr"> 2</span>
271<span class="nr"> 3</span> &lt;executiondata&gt;
272<span class="nr"> 4</span> &lt;file file="jacoco.exec"/&gt;
273<span class="nr"> 5</span> &lt;/executiondata&gt;
274<span class="nr"> 6</span>
275<span class="nr"> 7</span> &lt;structure name="Example Project"&gt;
276<span class="nr"> 8</span> &lt;classfiles&gt;
277<span class="nr"> 9</span> &lt;fileset dir="bin"/&gt;
278<span class="nr"> 10</span> &lt;/classfiles&gt;
279<span class="nr"> 11</span> &lt;sourcefiles encoding="UTF-8"&gt;
280<span class="nr"> 12</span> &lt;fileset dir="src"/&gt;
281<span class="nr"> 13</span> &lt;/sourcefiles&gt;
282<span class="nr"> 14</span> &lt;/structure&gt;
283<span class="nr"> 15</span>
284<span class="nr"> 16</span> &lt;html destdir="report"/&gt;
285<span class="nr"> 17</span>
286<span class="nr"> 18</span>&lt;/jacoco:report&gt;
287</pre>
288
289<p>
290 As you can see from the example above the <code>report</code> task is based
291 on several nested elements:
292</p>
293
294<h3>Element <code>executiondata</code></h3>
295
296<p>
297 Within this element Ant resources and resource collections can be specified,
298 that represent JaCoCo execution data files. If more than one execution data
299 file is specified, execution data is combined. A particular piece of code is
Radek Libaad5fbc92009-10-26 13:26:53 +0000300 considered executed when it is marked as such in any of the input files.
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000301</p>
302
303<h3>Element <code>structure</code></h3>
304
305<p>
Radek Libaad5fbc92009-10-26 13:26:53 +0000306 This element defines the report structure. It might contain the following
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000307 nested elements:
308</p>
309
310<ul>
311 <li><code>classfiles</code>: Container element for Ant resources and resource
Marc R. Hoffmannff7cd3a2010-04-06 08:54:29 +0000312 collections that can specify Java class files, ZIP archive files (jar, war,
313 ear etc.) or folders containing class files. Archives and folders are
314 searched recursively for class files.</li>
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000315 <li><code>sourcefiles</code>: Optional container element for Ant resources and
316 resource collections that specify corresponding source files. The element
317 has an optional attribute <code>encoding</code> to specify the character
318 encoding of the source files. If no encoding is given, the platform default
319 is used. If source files are specified, some report formats include
Radek Libaad5fbc92009-10-26 13:26:53 +0000320 highlighted source code.</li>
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000321</ul>
322
323<p>
324 The structure can be refined with a hierarchy of <code>group</code> elements.
Radek Libaad5fbc92009-10-26 13:26:53 +0000325 This way the coverage report can reflect different modules of a software
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000326 project. For each group element the corresponding class and source files can
Radek Libaad5fbc92009-10-26 13:26:53 +0000327 be specified separately. For example, the build script of JaCoCo itself
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000328 contains the following declaration to separate the different bundles in the
329 report (see the <a href="../coverage/index.html">resulting report</a>):
330</p>
331
Marc R. Hoffmanna760f322010-03-10 22:23:52 +0000332<pre class="source lang-xml">
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000333<span class="nr"> 1</span>&lt;structure name="JaCoCo"&gt;
334<span class="nr"> 2</span> &lt;group name="org.jacoco.core"&gt;
335<span class="nr"> 3</span> &lt;classfiles&gt;
336<span class="nr"> 4</span> &lt;path refid="bundle-org.jacoco.core"/&gt;
337<span class="nr"> 5</span> &lt;/classfiles&gt;
338<span class="nr"> 6</span> &lt;sourcefiles&gt;
339<span class="nr"> 7</span> &lt;fileset dir="${workspace.dir}/org.jacoco.core/src"/&gt;
340<span class="nr"> 8</span> &lt;/sourcefiles&gt;
341<span class="nr"> 9</span> &lt;/group&gt;
342<span class="nr"> 10</span> &lt;group name="org.jacoco.report"&gt;
343<span class="nr"> 11</span> &lt;classfiles&gt;
344<span class="nr"> 12</span> &lt;path refid="bundle-org.jacoco.report"/&gt;
345<span class="nr"> 13</span> &lt;/classfiles&gt;
346<span class="nr"> 14</span> &lt;sourcefiles&gt;
347<span class="nr"> 15</span> &lt;fileset dir="${workspace.dir}/org.jacoco.report/src"/&gt;
348<span class="nr"> 16</span> &lt;/sourcefiles&gt;
349<span class="nr"> 17</span> &lt;/group&gt;
350<span class="nr"> 18</span>
351<span class="nr"> 19</span> ...
352<span class="nr"> 20</span>
353<span class="nr"> 21</span>&lt;/structure&gt;
354</pre>
355
Marc R. Hoffmann722cad82010-03-09 18:22:33 +0000356<p>
357 Both <code>structure</code> and <code>group</code> elements have the following
358 mandatory attribute:
359</p>
360
361<table class="coverage">
362 <thead>
363 <tr>
364 <td>Attribute</td>
365 <td>Description</td>
366 <td>Default</td>
367 </tr>
368 </thead>
369 <tbody>
370 <tr>
371 <td><code>name</code></td>
372 <td>Name of the structure or group.</td>
373 <td><i>none (required)</i></td>
374 </tr>
375 </tbody>
376</table>
377
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000378<h3>Element <code>html</code></h3>
379
380<p>
Marc R. Hoffmann81f79202010-03-12 07:36:50 +0000381 Create a multi-page report in HTML format. The report can either be written as
382 multiple files into a directory or compressed into a single ZIP file.
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000383</p>
384
385<table class="coverage">
386 <thead>
387 <tr>
388 <td>Attribute</td>
389 <td>Description</td>
390 <td>Default</td>
391 </tr>
392 </thead>
393 <tbody>
394 <tr>
395 <td><code>destdir</code></td>
Marc R. Hoffmann81f79202010-03-12 07:36:50 +0000396 <td>Directory to create the report in. Either this property or
397 <code>destfile</code> has to be supplied.</td>
398 <td><i>none (required)</i></td>
399 </tr>
400 <tr>
401 <td><code>destfile</code></td>
402 <td>Zip file to create the report in. Either this property or
403 <code>destdir</code> has to be supplied.</td>
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000404 <td><i>none (required)</i></td>
405 </tr>
Marc R. Hoffmann2ecbea52009-09-03 14:19:11 +0000406 <tr>
407 <td><code>footer</code></td>
408 <td>Footer text for each report page.</td>
409 <td><i>No footer</i></td>
410 </tr>
Marc R. Hoffmann2becd332009-10-07 16:13:17 +0000411 <tr>
412 <td><code>encoding</code></td>
413 <td>Encoding of the generated HTML pages.</td>
414 <td><code>UTF-8</code></td>
415 </tr>
416 </tbody>
417</table>
418
419<h3>Element <code>xml</code></h3>
420
421<p>
422 Create a single-file report in XML format.
423</p>
424
425<table class="coverage">
426 <thead>
427 <tr>
428 <td>Attribute</td>
429 <td>Description</td>
430 <td>Default</td>
431 </tr>
432 </thead>
433 <tbody>
434 <tr>
Marc R. Hoffmann88b3f2f2009-10-19 16:10:35 +0000435 <td><code>destfile</code></td>
436 <td>Location to write the report file to.</td>
Marc R. Hoffmann2becd332009-10-07 16:13:17 +0000437 <td><i>none (required)</i></td>
438 </tr>
439 <tr>
440 <td><code>encoding</code></td>
441 <td>Encoding of the generated XML document.</td>
442 <td><code>UTF-8</code></td>
443 </tr>
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000444 </tbody>
445</table>
446
447<h3>Element <code>csv</code></h3>
448
449<p>
Marc R. Hoffmann2becd332009-10-07 16:13:17 +0000450 Create single-file report in CSV format.
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000451</p>
452
453<table class="coverage">
454 <thead>
455 <tr>
456 <td>Attribute</td>
457 <td>Description</td>
458 <td>Default</td>
459 </tr>
460 </thead>
461 <tbody>
462 <tr>
Marc R. Hoffmann88b3f2f2009-10-19 16:10:35 +0000463 <td><code>destfile</code></td>
464 <td>Location to write the report file to.</td>
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000465 <td><i>none (required)</i></td>
466 </tr>
Marc R. Hoffmanne17fd112009-10-19 15:27:04 +0000467 <tr>
468 <td><code>encoding</code></td>
469 <td>Encoding of the generated CSV document.</td>
470 <td><code>UTF-8</code></td>
471 </tr>
Marc R. Hoffmann2bb6fca2009-08-13 14:04:21 +0000472 </tbody>
473</table>
474
Marc R. Hoffmann17be2692010-02-02 05:44:47 +0000475</div>
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000476<div class="footer">
Marc R. Hoffmanndf6ff962010-04-09 15:31:22 +0000477 <div class="versioninfo"><a href="@jacoco.home.url@">JaCoCo</a> @qualified.bundle.version@</div>
478 <a href="license.html">Copyright</a> &copy; @copyright.years@ Mountainminds GmbH &amp; Co. KG and Contributors
Marc R. Hoffmannf7d17522009-08-07 11:21:23 +0000479</div>
480
481</body>
482</html>