blob: 3a207e6148996fa96572b8d0c7e7966c037efabc [file] [log] [blame]
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- No caching headers -->
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="expires" content="-1"/>
<meta name="keywords" content="JDO, Apache, Java, Data, Objects"/>
<meta name="description" content="Apache JDO - Java Data Objects"/>
<title>JDO Meets Maven</title>
<link rel="icon" type="image/png" href="https://apache.github.io/db-jdo-site/images/JDO_32x32.png"/>
<!--
Apache JDO Documentation Template
==================================
This template derived various aspects from Apache Deltaspike template, the Apache ISIS template and the Datanucleus template.
This template uses
* Bootstrap v3.3.7 (https://getbootstrap.com/) for navbar.
* Asciidoctor "foundation" CSS
* Bootswatch "cosmo" theme for Bootstrap (https://bootswatch.com/cosmo).
* Bootstrap TOC plugin v0.4.1 (https://afeld.github.io/bootstrap-toc/) for the table of contents.
* jQuery (necessary for Bootstrap's JavaScript plugins)
* Font-Awesome for some icons used by Asciidoctor
NOTE: tried using Font-Awesome CSS hosted locally but then fails to work!
-->
<link href="css/bootswatch/3.3.7/bootstrap-cosmo.css" rel="stylesheet"/>
<link href="css/bootstrap-toc/0.4.1/bootstrap-toc.min.css" rel="stylesheet"/>
<link href="css/asciidoctor/foundation.css" rel="stylesheet"/>
<link href="css/datanucleus_theme.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="js/bootstrap/3.3.7/bootstrap.min.js"></script>
<script src="js/bootstrap-toc/0.4.1/bootstrap-toc.min.js"></script>
<!-- Coderay syntax formatter -->
<style type="text/css">
/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
/*pre.CodeRay {background-color:#f7f7f8;}*/
.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
.CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
.CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
table.CodeRay td{vertical-align: top;line-height:1.45}
table.CodeRay td.line-numbers{text-align:right}
table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
table.CodeRay td.code{padding:0 0 0 .5em}
table.CodeRay td.code>pre{padding:0}
.CodeRay .debug{color:#fff !important;background:#000080 !important}
.CodeRay .annotation{color:#007}
.CodeRay .attribute-name{color:#000080}
.CodeRay .attribute-value{color:#700}
.CodeRay .binary{color:#509}
.CodeRay .comment{color:#998;font-style:italic}
.CodeRay .char{color:#04d}
.CodeRay .char .content{color:#04d}
.CodeRay .char .delimiter{color:#039}
.CodeRay .class{color:#458;font-weight:bold}
.CodeRay .complex{color:#a08}
.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
.CodeRay .color{color:#099}
.CodeRay .class-variable{color:#369}
.CodeRay .decorator{color:#b0b}
.CodeRay .definition{color:#099}
.CodeRay .delimiter{color:#000}
.CodeRay .doc{color:#970}
.CodeRay .doctype{color:#34b}
.CodeRay .doc-string{color:#d42}
.CodeRay .escape{color:#666}
.CodeRay .entity{color:#800}
.CodeRay .error{color:#808}
.CodeRay .exception{color:inherit}
.CodeRay .filename{color:#099}
.CodeRay .function{color:#900;font-weight:bold}
.CodeRay .global-variable{color:#008080}
.CodeRay .hex{color:#058}
.CodeRay .integer,.CodeRay .float{color:#099}
.CodeRay .include{color:#555}
.CodeRay .inline{color:#000}
.CodeRay .inline .inline{background:#ccc}
.CodeRay .inline .inline .inline{background:#bbb}
.CodeRay .inline .inline-delimiter{color:#d14}
.CodeRay .inline-delimiter{color:#d14}
.CodeRay .important{color:#555;font-weight:bold}
.CodeRay .interpreted{color:#b2b}
.CodeRay .instance-variable{color:#008080}
.CodeRay .label{color:#970}
.CodeRay .local-variable{color:#963}
.CodeRay .octal{color:#40e}
.CodeRay .predefined{color:#369}
.CodeRay .preprocessor{color:#579}
.CodeRay .pseudo-class{color:#555}
.CodeRay .directive{font-weight:bold}
.CodeRay .type{font-weight:bold}
.CodeRay .predefined-type{color:inherit}
.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
.CodeRay .key{color:#808}
.CodeRay .key .delimiter{color:#606}
.CodeRay .key .char{color:#80f}
.CodeRay .value{color:#088}
.CodeRay .regexp .delimiter{color:#808}
.CodeRay .regexp .content{color:#808}
.CodeRay .regexp .modifier{color:#808}
.CodeRay .regexp .char{color:#d14}
.CodeRay .regexp .function{color:#404;font-weight:bold}
.CodeRay .string{color:#d20}
.CodeRay .string .string .string{background:#ffd0d0}
.CodeRay .string .content{color:#d14}
.CodeRay .string .char{color:#d14}
.CodeRay .string .delimiter{color:#d14}
.CodeRay .shell{color:#d14}
.CodeRay .shell .delimiter{color:#d14}
.CodeRay .symbol{color:#990073}
.CodeRay .symbol .content{color:#a60}
.CodeRay .symbol .delimiter{color:#630}
.CodeRay .tag{color:#008080}
.CodeRay .tag-special{color:#d70}
.CodeRay .variable{color:#036}
.CodeRay .insert{background:#afa}
.CodeRay .delete{background:#faa}
.CodeRay .change{color:#aaf;background:#007}
.CodeRay .head{color:#f8f;background:#505}
.CodeRay .insert .insert{color:#080}
.CodeRay .delete .delete{color:#800}
.CodeRay .change .change{color:#66f}
.CodeRay .head .head{color:#f4f}
</style>
</head>
<body data-spy="scroll" data-target="#toc">
<!-- Navbar -->
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Three line menu button for use on mobile screens -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- 'style' added to align image with navbar. FIX THIS -->
<a class="navbar-brand" href="https://db.apache.org/jdo/">
<img style="margin-top: -12px;" alt="Brand" src="images/JDO_44x44.png"/>
</a>
<!-- TODO Any way to abstract the version from Maven? -->
<a class="navbar-brand" href="index.html">Apache JDO</a>
</div>
<!-- Navbar that will collapse on mobile screens -->
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<!-- menu item General -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">General<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="why_jdo.html">Why JDO?</a></li>
<li><a href="getting-started.html">Getting Started</a></li>
<li><a href="specifications.html">Specifications</a></li>
<li><a href="tck.html">TCK</a></li>
<li><a href="javadoc.html">API Javadoc</a></li>
<li role="separator" class="divider"></li>
<li><a href="jdo_v_jpa.html">JDO v JPA</a></li>
<li><a href="jdo_v_jpa_api.html">JDO v JPA : API</a></li>
<li><a href="jdo_v_jpa_orm.html">JDO v JPA : ORM</a></li>
<li role="separator" class="divider"></li>
<li><a href="license.html">License</a></li>
<li><a href="impls.html">Implementations</a></li>
<li><a href="jdo_3_0_overview.html">JDO 3.0 Overview</a></li>
<li><a href="references.html">References</a></li>
<li><a href="glossary.html">Glossary</a></li>
</ul>
</li>
<!-- menu item API Usage -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">API Usage<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="jdohelper.html">JDO Helper</a></li>
<li><a href="pmf.html">PersistenceManagerFactory</a></li>
<li><a href="pm.html">PersistenceManager</a></li>
<li><a href="transactions.html">Transactions</a></li>
<li><a href="attach_detach.html">Attach-Detach</a></li>
<li><a href="fetchgroups.html">Fetch Groups</a></li>
<li><a href="state_transition.html">Object States</a></li>
<li><a href="object_retrieval.html">Object Retrieval</a></li>
<li><a href="exceptions.html">Exceptions</a></li>
<li role="separator" class="divider"></li>
<li><a href="guides-replication.html">Data Replication</a></li>
</ul>
</li>
<!-- menu item Types & Metadata -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Types &amp; Metadata<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="class_types.html">Types of Classes</a></li>
<li><a href="field_types.html">Types of Fields</a></li>
<li role="separator" class="divider"></li>
<!-- <li class="dropdown-header">Metadata</li> -->
<li><a href="metadata.html">MetaData</a></li>
<li><a href="annotations.html">Annotations</a></li>
<li><a href="jdo_dtd.html">jdo DTD/XSD</a></li>
<li><a href="orm_dtd.html">orm DTD/XSD</a></li>
<li><a href="jdoquery_dtd.html">jdoquery DTD/XSD</a></li>
<li><a href="jdoconfig_dtd.html">jdoconfig DTD/XSD</a></li>
<li role="separator" class="divider"></li>
<li><a href="enhancement.html">Bytecode Enhancement</a></li>
</ul>
</li>
<!-- menu item Query -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Query<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="jdoql.html">JDOQL</a></li>
<li><a href="jdoql_result.html">Result</a></li>
<li><a href="jdoql_methods.html">Methods</a></li>
<li><a href="jdoql_quickref.pdf">Quick Ref PDF</a></li>
<li role="separator" class="divider"></li>
<li><a href="extents.html">Extents</a></li>
</ul>
</li>
<!-- menu item Community -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Community<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="get-involved.html">Get Involved</a></li>
<li><a href="team-list.html">Project Team</a></li>
<li><a href="mail-lists.html">Mailing Lists</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</li>
<!-- menu item Development -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Development<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="roadmap.html">RoadMap / TODO</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="source-code.html">Source Code</a></li>
<li><a href="coding-standards.html">Coding Standards</a></li>
<li><a href="issuetracking.html">Issue Tracking</a></li>
</ul>
</li>
</ul>
<!-- 'style' added to fix height of input box. FIX THIS -->
<form class="navbar-form navbar-left" role="search" id="search-form" action="https://www.google.com/search" method="get" style="padding: 1px 15px;">
<div class="form-group">
<input name="sitesearch" value="db.apache.org/jdo" type="hidden">
<input name="q" type="text" class="form-control" placeholder="Search" style="margin-top: 7px; padding: 1px; border-radius: 5px; height: 30px; vertical-align: middle;">
</div>
</form>
</div>
</div>
</nav>
<div class="container">
<div class="row-fluid">
<div class="col-sm-9">
<!-- <div class="page-title">
<h3>JDO Meets Maven<a id="JDO_Meets_Maven"></a></h3>
</div>
-->
<div id="doc-content">
<div class="sect1">
<h2 id="index">JDO Meets Maven<a id="JDO_Meets_Maven"></a></h2>
<div class="sectionbody">
<div class="paragraph">
<p>By <a href="mailto:andy@jpox.org">Andy Jefferson</a></p>
</div>
<div class="sect2">
<h3 id="_background_maven_a_id_background_maven_a">Background - Maven<a id="Background_-_Maven"></a></h3>
<div class="paragraph">
<p><a href="http://maven.apache.org">Maven</a> is a tool for managing and building
projects providing an alternative to the accepted
<a href="http://ant.apache.org">Ant</a> build process. Maven is almost totally
plugin-driven, and provides plugins for many common tasks (for example:
building EJB components such as WARs and EARs, generating documentation,
running unit tests) and related software (for example:
<a href="http://checkstyle.sf.net">Checkstyle</a>, <a href="http://pmd.sf.net">PMD</a>,
<a href="http://www.thecortex.net/clover">Clover</a>,
<a href="http://www.jcoverage.com">JCoverage</a>).</p>
</div>
<div class="paragraph">
<p>Maven builds on top of the definition of a project. It formalises
project definitions such as dependencies (and hence classpaths),
versions, source repositories, mailing lists, etc. This project
definition provides placeholders for all of the typical metrics
important to a project. It formalises the location of the source tree
for a project and of the unit tests. This rigorous structure allows
Maven&#8217;s plugins to provide generalised functionality such as building
the source tree, running the unit tests, generating javadoc, code
analysis, etc.</p>
</div>
<div class="paragraph">
<p>Maven operates using the concept of <strong>goals</strong>. Each <strong>goal</strong> can have "pre"
and "post" goals. This structure allows for chaining of operations, with
one operation firing off another, and another to achieve some overall
end result.</p>
</div>
</div>
<div class="sect2">
<h3 id="_integrating_jdo_with_maven_a_id_integrating_jdo_with_maven_a">Integrating JDO with Maven<a id="Integrating_JDO_with_Maven"></a></h3>
<div class="paragraph">
<p>In developing a JDO system, the developer has many concerns - not least
the likes of object-relationship mapping - and should, as far as
possible, be spared the "administrative" burdens associated with
building the system. Maven&#8217;s formalization of the source tree structure
and chaining of actions helps achieve this objective by saving the
developer from having to explicitly define tasks like JDO class
bytecode-enhancement. Thus, rather than explicitly invoking a
bytecode-enhancement task in the system build, Maven is able to provide
this activity by way of a plugin, which could even be automatically
chained off the existing Java compilation task.</p>
</div>
</div>
<div class="sect2">
<h3 id="_anatomy_of_a_maven_jdo_plugin_a_id_anatomy_of_a_maven_jdo_plugin_a">Anatomy of a Maven JDO plugin<a id="Anatomy_of_a_Maven_JDO_plugin"></a></h3>
<div class="paragraph">
<p>A Maven plugin can use a variety of languages, however most commonly
utilises <a href="http://jakarta.apache.org/commons/jelly/">Jelly scripting
language</a>, at least for definition of the plugin&#8217;s goals. A Maven plugin
typically requires a minimum of 3 files &#8230;&#8203;</p>
</div>
<div class="ulist">
<ul>
<li>
<p><em>project.xml</em> (defining the dependencies of the plugin on other
software)</p>
</li>
<li>
<p><em>plugin.jelly</em> (providing the <strong>goals</strong> definition)</p>
</li>
<li>
<p><em>plugin.properties</em> (properties available for configuration)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Maven plugins can use a variety of other scripting and templating
utilities, however these are not currently required for the JDO plugins
implemented.</p>
</div>
<div class="paragraph">
<p>Plugins have now been developed for <a href="http://www.jpox.org">JPOX</a>, and
<a href="http://tjdo.sf.net">TJDO</a>, though can readily be developed for any JDO
implementation. The best way of understanding the process involved is by
analysing a Maven JDO plugin - in this case, the JPOX plugin. Here the
<em>plugin.jelly</em> file is as follows:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;goal name="jpox"
description="Enhance classes for use with Java Persistent Objects (JPOX)"
prereqs="jpox:enhance"/&gt;
&lt;goal name="jpox:init"&gt;
... snip ... code to generate jpoxClasspath and jpoxMetaDataFiles
&lt;/goal&gt;
&lt;goal name="jpox:enhance"
description="Perform the enhancement of classes for use with JPOX"
prereqs="jpox:init"&gt;
&lt;echo&gt;JDO-enhancing classes for Java Persistent Objects&lt;/echo&gt;
&lt;ant:java dir="${maven.build.dest}"
classname="org.jpox.enhance.SunReferenceEnhancer"
failonerror="true"
fork="true"&gt;
&lt;classpath refid="jpoxClasspath"/&gt;
&lt;arg line="${jpoxMetaDataFiles}"/&gt;
&lt;/ant:java&gt;
&lt;echo&gt;Classes are now JDO-enhanced for Java Persistent Objects&lt;/echo&gt;
&lt;/goal&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>It can be seen that the plugin has several goals, the default one being
to run the enhance goal. Since this goal requires (as a prerequisite)
the running of the init goal, they are chained.</p>
</div>
<div class="paragraph">
<p>Some JDO implementations (for example JPOX, or Kodo) allow the
generation of the JDO database schema prior to running the JDO-enabled
application. This is catered for with additional <strong>goal(s)</strong>. For JPOX
again, this is handled as follows</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;goal name="jpox:schema-create"
prereqs="jpox:init"&gt;
&lt;echo&gt;Creating tables for Persistence Capability&lt;/echo&gt;
&lt;ant:java dir="${maven.build.dest}"
classname="org.jpox.SchemaTool"
failonerror="true"
fork="true"&gt;
&lt;classpath refid="jpoxClasspath"/&gt;
&lt;sysproperty key="database.driver" value="${maven.jpox.database.driver}"/&gt;
&lt;sysproperty key="database.url" value="${maven.jpox.database.url}"/&gt;
&lt;sysproperty key="database.user" value="${maven.jpox.database.user}"/&gt;
&lt;sysproperty key="database.password" value="${maven.jpox.database.password}"/&gt;
&lt;arg line="-create"/&gt;
&lt;arg line="${jpoxMetaDataFiles}"/&gt;
&lt;/ant:java&gt;
&lt;/goal&gt;
&lt;goal name="jpox:schema-delete"
prereqs="jpox:init"&gt;
&lt;echo&gt;Deleting tables for Persistence Capability&lt;/echo&gt;
&lt;ant:java dir="${maven.build.dest}"
classname="org.jpox.SchemaTool"
failonerror="true"
fork="true"&gt;
&lt;classpath refid="jpoxClasspath"/&gt;
&lt;sysproperty key="database.driver" value="${maven.jpox.database.driver}"/&gt;
&lt;sysproperty key="database.url" value="${maven.jpox.database.url}"/&gt;
&lt;sysproperty key="database.user" value="${maven.jpox.database.user}"/&gt;
&lt;sysproperty key="database.password" value="${maven.jpox.database.password}"/&gt;
&lt;arg line="-delete"/&gt;
&lt;arg line="${jpoxMetaDataFiles}"/&gt;
&lt;/ant:java&gt;
&lt;/goal&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>Hence there are 2 additional <strong>goals</strong>, one for creating all tables
required by JPOX, and a second for deleting these tables. Clearly this
has more relevance to <strong>schema generation</strong> than for <strong>existing schemas</strong></p>
</div>
<div class="paragraph">
<p>Where a JDO implementation allows a particular configuration operation,
a Maven plugin <strong>goal</strong> can be added to deliver this functionality to the
Maven user. As a result, individual implementations can add as many
goals as they wish to fulfil their users requirements.</p>
</div>
</div>
<div class="sect2">
<h3 id="_using_a_maven_jdo_plugin_a_id_using_a_maven_jdo_plugin_a">Using a Maven JDO plugin<a id="Using_a_Maven_JDO_plugin"></a></h3>
<div class="paragraph">
<p>Using the JPOX Maven plugin as an example, the basic enhancement process
could be invoked as follows:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>maven jpox:enhance</pre>
</div>
</div>
<div class="paragraph">
<p>The problem with this is that it burdens the developer with having to
explicitly invoke the enhancement process. As an alternative it is
possible to integrate bytecode enhancement as an automatic step chained
off the basic Java compilation process. This is achieved by including
the following in the project <em>maven.xml</em> file:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;postGoal name="java:compile"&gt;
&lt;attainGoal name="jpox:enhance"/&gt;
&lt;/postGoal&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>So wherever the <strong>java:compile</strong> goal is called, as a postGoal it runs the
<strong>jpox:enhance</strong> goal, leaving the developer with JDO enabled classes
ready to run.</p>
</div>
<div class="paragraph">
<p>Maven&#8217;s plugins can be made configurable using properties specified in
the <em>plugin.properties</em> file. For the JPOX plugin, the following
properties can be set</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>maven.jpox.jdo.fileset.dir</strong> : Directory containing the JDO MetaData
files</p>
</li>
<li>
<p><strong>maven.jpox.jdo.fileset.include</strong> : Fileset include path for JDO
MetaData files (default: <strong>*/</strong>.jdo)</p>
</li>
<li>
<p><strong>maven.jpox.jdo.fileset.exclude</strong> : Fileset exclude path for JDO
MetaData files</p>
</li>
<li>
<p><strong>maven.jpox.database.driver</strong> : Driver for use in connecting to
datastore</p>
</li>
<li>
<p><strong>maven.jpox.database.url</strong> : URL defining the datastore</p>
</li>
<li>
<p><strong>maven.jpox.database.user</strong> : Login name for the datastore</p>
</li>
<li>
<p><strong>maven.jpox.database.password</strong> : Password for the datastore</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For example, the following properties could be included in the Maven
<em>project.properties</em> file</p>
</div>
<div class="literalblock">
<div class="content">
<pre>maven.jpox.jdo.fileset.dir=${basedir}/jdo
maven.jpox.jdo.fileset.include=**/*.jdo
maven.jpox.database.driver=com.mysql.jdbc.Driver
maven.jpox.database.url=jdbc:mysql://localhost/jpox
maven.jpox.database.user={my_username}
maven.jpox.database.password={my_password}</pre>
</div>
</div>
<div class="paragraph">
<p>This would define the JDO MetaData files residing under the "jdo"
project directory, with names matching <strong>.jdo and would be used when all
JDO plugin *goals</strong> (such as <strong>enhance</strong>) are called. The 4 <strong>database</strong>
properties are used in the <strong>schema-create/schema-delete</strong> goals (as seen
in the <em>plugin.jelly</em> file earlier).</p>
</div>
<div class="paragraph">
<p>Invocation of the JPOX schema-create optional goal could be achieved as
follows:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>maven jpox:schema-create</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_conclusion_a_id_conclusion_a">Conclusion<a id="Conclusion"></a></h3>
<div class="paragraph">
<p>This article has attempted to give a feel for both the operation of
Maven, and how to integrate JDO into a Maven project. The various Maven
JDO plugins can be downloaded as follows</p>
</div>
<div class="ulist">
<ul>
<li>
<p>JPOX (1.1.8) - <a href="http://www.jpox.org/">Java Persistent Objects (JPOX)
project</a></p>
</li>
<li>
<p>TJDO (2.0-beta3) - <a href="http://www.ibiblio.org/maven/maven/plugins/">Ibiblio
site</a></p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_about_the_author_a_id_about_the_author_a">About the author<a id="About_the_author"></a></h3>
<div class="paragraph">
<p>Andy Jefferson is an independent software consultant who has been
working in the IT industry for more than 15 years, primarily in the
United Kingdom. He is an active participator in several OpenSource
projects, primarily JPOX, and Apache JDO, and a member of the JSR243
(JDO2) Expert Group.</p>
</div>
<hr>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-3">
<nav id="toc" data-spy="affix" data-toggle="toc"></nav>
</div>
</div>
</div>
<footer style="color:#fff; background-color:#222222; padding: 5px;">
<div class="container">
<div class="row" style="margin-top:25px">
<div class="col-sm" align="center">
<a href="https://www.facebook.com/JavaDataObjects" class="externalLink" title="Facebook">Facebook</a>
|
<a href="https://twitter.com/JavaDataObjects" class="externalLink" title="Twitter">Twitter</a>
|
<a href="http://wiki.apache.org/jdo" class="externalLink" title="Wiki">Wiki</a>
|
<a href="http://issues.apache.org/jira/secure/BrowseProject.jspa?id=10630" class="externalLink" title="Issue Tracker">Issue Tracker</a>
|
<a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
|
<a href="api31/apidocs/index.html" title="Latest Javadocs">Latest Javadocs</a>
</div>
</div>
<p class="text-center" style="margin-top:16px">&copy; 2005-2020 Apache Software Foundation. All Rights Reserved.</p>
</div>
</footer>
</body>
</html>